Index: pykota/tags/1.22/debian/links
===================================================================
--- pykota/tags/1.22/debian/links (revision 2146)
+++ pykota/tags/1.22/debian/links (revision 2146)
@@ -0,0 +1,1 @@
+usr/share/pykota/cupspykota usr/lib/cups/backend/cupspykota 
Index: pykota/tags/1.22/debian/control
===================================================================
--- pykota/tags/1.22/debian/control (revision 2228)
+++ pykota/tags/1.22/debian/control (revision 2228)
@@ -0,0 +1,28 @@
+Source: pykota
+Section: text
+Priority: extra
+Maintainer: Jerome Alet <alet@librelogiciel.com>
+Build-Depends-Indep: debhelper (>= 4.0.0), python, docbook-utils, python-dev
+Standards-Version: 3.6.1
+
+Package: pykota
+Architecture: all
+Depends: ${python:Depends}, python-egenix-mxdatetime, cupsys | lprng, python-pygresql | python-ldap, jaxml, python-osd, python-reportlab
+Recommends: snmp, netatalk, python-psyco, npadmin
+Description: Print Quota/Accounting system for CUPS and LPRng
+ PyKota is a full featured, internationalized, centralized and extensible 
+ Print Quota system for CUPS and LPRng. It supports both PostgreSQL and 
+ OpenLDAP (or other LDAP servers) as the quota database backend. 
+ .
+ This software features most of what you might expect from a modern Print 
+ Quota and Accounting Solution. 
+ .
+ It's unprecedented flexibility and configurability greatly eases its 
+ integration into your own computing environment. At the same time, its 
+ reliability can make it a strong basis on which you'll plug your own 
+ management or reporting tools in the improbable case you'd judge PyKota's 
+ ones to be inadapted.
+ .
+ Full access to source code is granted to all for no fee via Subversion, but 
+ installable tarball, DEB and RPM download is for a fee. Redistribution and 
+ modification is allowed to all under the terms of the GNU GPL.
Index: pykota/tags/1.22/debian/postinst
===================================================================
--- pykota/tags/1.22/debian/postinst (revision 2146)
+++ pykota/tags/1.22/debian/postinst (revision 2146)
@@ -0,0 +1,10 @@
+#!/bin/sh -e
+# $Id$
+
+. /usr/share/debconf/confmodule
+
+if [ "$1" = "install" ]; then
+        chown -R pykota.pykota /etc/pykota
+fi
+
+exit 0
Index: pykota/tags/1.22/debian/preinst
===================================================================
--- pykota/tags/1.22/debian/preinst (revision 2146)
+++ pykota/tags/1.22/debian/preinst (revision 2146)
@@ -0,0 +1,16 @@
+#!/bin/sh -e
+# $Id$
+
+. /usr/share/debconf/confmodule
+
+if [ "$1" = "install" -o "$1" = "upgrade" ]; then
+        if ! id -g pykota > /dev/null 2>&1 ; then
+                addgroup --system pykota
+        fi
+        if ! id -u pykota > /dev/null 2>&1 ; then
+                adduser --system --home /etc/pykota --ingroup pykota pykota
+                chsh -s /bin/sh pykota
+        fi
+fi
+
+exit 0
Index: pykota/tags/1.22/debian/changelog
===================================================================
--- pykota/tags/1.22/debian/changelog (revision 2237)
+++ pykota/tags/1.22/debian/changelog (revision 2237)
@@ -0,0 +1,79 @@
+pykota (1.22) unstable; urgency=low
+
+  * Update from SVN.
+  
+ -- Jerome Alet <alet@librelogiciel.com>  Sun, 8 May 2005 22:27:00 +0200
+ 
+pykota (1.22beta) unstable; urgency=low
+
+  * Update from SVN.
+  
+ -- Jerome Alet <alet@librelogiciel.com>  Sat, 3 May 2005 23:21:00 +0200
+ 
+pykota (1.21) unstable; urgency=low
+
+  * Update from CVS.
+  
+ -- Jerome Alet <alet@librelogiciel.com>  Sat, 5 Mar 2005 19:58:00 +0200
+ 
+pykota (1.21beta) unstable; urgency=low
+
+  * Update from CVS.
+  
+ -- Jerome Alet <alet@librelogiciel.com>  Thu, 24 Feb 2005 22:53:00 +0200
+ 
+pykota (1.20) unstable; urgency=low
+
+  * Update from CVS. 
+
+ -- Jerome Alet <alet@librelogiciel.com>  Mon, 1 Nov 2004 08:51:44 +0200
+ 
+pykota (1.20beta) unstable; urgency=low
+
+  * Update from CVS. 
+
+ -- Jerome Alet <alet@librelogiciel.com>  Sat, 23 Oct 2004 18:22:44 +0200
+ 
+pykota (1.20alpha24) unstable; urgency=low
+
+  * Update from CVS. 
+
+ -- Sergio Gonz�z Gonz�z <sergio.gonzalez@hispalinux.es>  Wed, 13 Oct 2004 01:29:44 +0200
+
+pykota (1.20alpha23) unstable; urgency=low
+
+  * Update from CVS.
+  * Added debconf support.
+  * Slightly reorganized the directory debian.
+  * Move pykota.schema to /etc/ldap/schema.
+  * Modified a bit the script setup.py to improve the build process of Debian
+    package.
+  * Add python-psyco as Recommends
+  * Add jaxml and python-osd as Depends
+
+ -- Sergio Gonz�z Gonz�z <sergio.gonzalez@hispalinux.es>  Mon, 11 Oct 2004 11:59:15 +0200
+
+pykota (1.19) unstable; urgency=low
+
+  * Update from CVS.
+  
+ -- Jerome Alet <alet@librelogiciel.com>  Wed,  28 Jul 2004 15:59:03 +0100
+ 
+pykota (1.19alpha29) unstable; urgency=low
+
+  * Update from CVS.
+
+ -- Sergio Gonz�z Gonz�z <sergio.gonzalez@hispalinux.es>  Mon,  5 Jul 2004 15:59:03 +0100
+
+pykota (1.19alpha20.cvs.20040611-1) unstable; urgency=low
+
+  * Update from CVS.
+
+ -- Sergio Gonz�z Gonz�z <sergio.gonzalez@hispalinux.es>  Fri, 11 Jun 2004 17:10:04 +0100
+
+pykota (1.16.cvs.20040119-1) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Peter Hawkins <peterh@debian.org>  Mon, 19 Jan 2004 20:03:43 +1100
+
Index: pykota/tags/1.22/debian/docs
===================================================================
--- pykota/tags/1.22/debian/docs (revision 2146)
+++ pykota/tags/1.22/debian/docs (revision 2146)
@@ -0,0 +1,5 @@
+FAQ
+NEWS
+README
+TODO
+SECURITY
Index: pykota/tags/1.22/debian/printquota.default
===================================================================
--- pykota/tags/1.22/debian/printquota.default (revision 2146)
+++ pykota/tags/1.22/debian/printquota.default (revision 2146)
@@ -0,0 +1,4 @@
+# Configuration for print quota scripts
+#
+# Set to "true" if warnpykota should be run in cron.daily
+run_warnpykota="false"
Index: pykota/tags/1.22/debian/rules
===================================================================
--- pykota/tags/1.22/debian/rules (revision 2213)
+++ pykota/tags/1.22/debian/rules (revision 2213)
@@ -0,0 +1,117 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+export DH_COMPAT=1
+
+
+build: build-stamp
+build-stamp:
+	dh_testdir
+
+	#/usr/bin/docbook-to-man debian/pykota.sgml > pykota.1
+	/usr/bin/python setup.py build
+	(cd docs; make -f ../debian/Makefile.docs build)
+
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp
+
+	/usr/bin/python setup.py clean --all
+	(cd docs; make -f ../debian/Makefile.docs clean)
+	rm -f pykota/__init__.pyc pykota/version.pyc
+
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+
+	/usr/bin/python setup.py install --prefix=`pwd`/debian/tmp/usr --no-compile
+
+	install -m 644 conf/pykota.conf.sample $(CURDIR)/debian/tmp/etc/pykota/pykota.conf
+	install -m 640 conf/pykotadmin.conf.sample $(CURDIR)/debian/tmp/etc/pykota/pykotadmin.conf
+	install -m 644 debian/printquota.default $(CURDIR)/debian/tmp/etc/default/printquota
+	install -m 755 debian/pykota.cron.daily $(CURDIR)/debian/tmp/etc/cron.daily/pykota
+
+	install -m 755 -g www-data -o www-data cgi-bin/printquota.cgi $(CURDIR)/debian/tmp/usr/lib/cgi-bin/printquota.cgi
+	install -m 755 -g www-data -o www-data cgi-bin/dumpykota.cgi $(CURDIR)/debian/tmp/usr/lib/cgi-bin/dumpykota.cgi
+	install -m 755 -g www-data -o www-data cgi-bin/pykotme.cgi $(CURDIR)/debian/tmp/usr/lib/cgi-bin/pykotme.cgi
+	install -m 644 stylesheets/pykota.css $(CURDIR)/debian/tmp/var/www/pykota.css
+	install -m 644 logos/pykotasmall.png $(CURDIR)/debian/tmp/var/www/pykota.png
+	install -m 644 initscripts/README $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/README
+	install -m 644 initscripts/ldap/pykota-sample.ldif $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/ldap/pykota-sample.ldif
+	install -m 644 initscripts/ldap/pykota.schema $(CURDIR)/debian/tmp/etc/ldap/schema/pykota.schema
+	install -m 644 initscripts/ldap/README.ldap $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/ldap/README.ldap
+	install -m 644 initscripts/mysql/README.mysql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/mysql/README.mysql
+	install -m 644 initscripts/mysql/pykota-mysql.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/mysql/pykota-mysql.sql
+	install -m 644 initscripts/postgresql/README.postgresql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/README.postgresql
+	install -m 644 initscripts/postgresql/pykota-postgresql.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/pykota-postgresql.sql
+	install -m 644 initscripts/postgresql/upgrade-from-before-1.03.py $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/upgrade-from-before-1.03.py
+	install -m 644 initscripts/postgresql/upgrade-to-1.14.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/upgrade-to-1.14.sql
+	install -m 644 initscripts/postgresql/upgrade-to-1.16.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/upgrade-to-1.16.sql
+	install -m 644 initscripts/postgresql/upgrade-to-1.19.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/upgrade-to-1.19.sql
+	install -m 644 initscripts/postgresql/upgrade-to-1.21.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/upgrade-to-1.21.sql
+	install -m 644 initscripts/postgresql/VERYOLDpykota-upgrade-postgresql.sql $(CURDIR)/debian/tmp/usr/share/doc/pykota/initscripts/postgresql/VERYOLDpykota-upgrade-postgresql.sql
+	install -m 644 logos/pleaseupgrade.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pleaseupgrade.png
+	install -m 644 logos/pykotaofficialindexed.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykotaofficialindexed.png
+	install -m 644 logos/pykotaofficialindexedsmall.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykotaofficialindexedsmall.png
+	install -m 644 logos/pykotaofficial.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykotaofficial.png
+	install -m 644 logos/pykotaofficialsmall.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykotaofficialsmall.png
+	install -m 644 logos/pykota.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykota.png
+	install -m 644 logos/pykotasmall.png $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykotasmall.png
+	install -m 644 logos/pykota.xcf $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/pykota.xcf
+	install -m 644 logos/README $(CURDIR)/debian/tmp/usr/share/doc/pykota/logos/README
+	(chown www-data.www-data $(CURDIR)/debian/tmp/usr/lib/cgi-bin/printquota.cgi)
+	(chown www-data.www-data $(CURDIR)/debian/tmp/usr/lib/cgi-bin/dumpykota.cgi)
+	(chown www-data.www-data $(CURDIR)/debian/tmp/usr/lib/cgi-bin/pykotme.cgi)
+	(chmod 755 $(CURDIR)/debian/tmp/usr/share/pykota/*)
+	(cd docs; make -f ../debian/Makefile.docs install DESTDIR=$(CURDIR)/debian/tmp/)
+
+
+# Build architecture-dependent files here.
+binary-arch: build install
+# We have nothing to do by default.
+
+# Build architecture-independent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs
+	dh_installdocs
+	dh_installexamples
+#	dh_install
+#	dh_installmenu
+	dh_installdebconf
+#	dh_installlogrotate
+#	dh_installemacsen
+#	dh_installpam
+#	dh_installmime
+#	dh_installinit
+	dh_installcron
+#	dh_installinfo
+	dh_installman
+	dh_link
+#	dh_strip
+	dh_compress
+	dh_fixperms
+#	dh_perl
+	dh_python
+#	dh_makeshlibs
+	dh_installdeb
+#	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
Index: pykota/tags/1.22/debian/README
===================================================================
--- pykota/tags/1.22/debian/README (revision 2228)
+++ pykota/tags/1.22/debian/README (revision 2228)
@@ -0,0 +1,27 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+This directory contains scripts you may find interesting to
+build Debian GNU/Linux packages for PyKota.
+
+============================================================
+
+Please e-mail bugs to: alet@librelogiciel.com (Jerome Alet)
Index: pykota/tags/1.22/debian/dirs
===================================================================
--- pykota/tags/1.22/debian/dirs (revision 2146)
+++ pykota/tags/1.22/debian/dirs (revision 2146)
@@ -0,0 +1,13 @@
+usr/bin
+usr/share/pykota
+usr/share/doc/pykota/logos
+usr/share/doc/pykota/initscripts/ldap
+usr/share/doc/pykota/initscripts/mysql
+usr/share/doc/pykota/initscripts/postgresql
+usr/lib/cups/backend
+usr/lib/cgi-bin
+etc/pykota
+etc/default
+etc/cron.daily
+etc/ldap/schema
+var/www
Index: pykota/tags/1.22/debian/pykota.templates
===================================================================
--- pykota/tags/1.22/debian/pykota.templates (revision 2146)
+++ pykota/tags/1.22/debian/pykota.templates (revision 2146)
@@ -0,0 +1,45 @@
+
+Template: pykota/upgrading_1.21alpha24
+Type: note
+Description: Upgrading from a pre-1.21alpha24 to >=1.21alpha24
+ Warning: if you ar upgrading from a pre-1.21alpha24 to
+ 1.21alpha24 or above and use the postgreSQL backend,
+ then you have to modify your database schema using
+ /usr/share/doc/pykota/initscripts/postgresql/upgrade-to-1.21.sql
+ .
+ Please read documentation in
+ /usr/share/doc/pykota/initscripts/postgresql/ to learn
+ how to do.
+ .
+ You don't have anything special to do if this is your
+ first installation or if you are already running
+ version 1.21alpha24 or above.
+
+Template: pykota/upgrading_1.19alpha17
+Type: note
+Description: Upgrading from a pre-1.19alpha17 to >=1.19alpha17
+ Warning: if you ar upgrading from a pre-1.19alpha17 to
+ 1.19alpha17 or above and use the postgreSQL backend,
+ then you have to modify your database schema using
+ /usr/share/doc/pykota/initscripts/postgresql/upgrade-to-1.19.sql
+ .
+ Please read documentation in
+ /usr/share/doc/pykota/initscripts/postgresql/ to learn
+ how to do.
+ .
+ You don't have anything special to do if this is your
+ first installation or if you are already running
+ version 1.19alpha17 or above.
+
+Template: pykota/upgrading_1.19alpha10
+Type: note
+Description: Upgrading from a pre-1.19alpha10 to >=1.19alpha10
+ Warning: if you are upgrading from a pre-1.19alpha10
+ to 1.19alpha10 or above you **MUST** modify your
+ /etc/pykota/pykota.conf file because "accounter"
+ and "requester" directives supported values have
+ changed.
+ .
+ You don't have anything special to do if this is your
+ first installation or if you are already running
+ version 1.19alpha10 or above.
Index: pykota/tags/1.22/debian/Makefile.docs
===================================================================
--- pykota/tags/1.22/debian/Makefile.docs (revision 2146)
+++ pykota/tags/1.22/debian/Makefile.docs (revision 2146)
@@ -0,0 +1,17 @@
+DESTDIR=
+
+all: build
+
+build: build-stamp
+build-stamp:
+	docbook2html pykota.sgml
+	docbook2pdf pykota.sgml
+	touch build-stamp
+
+install: build
+	mkdir -p $(DESTDIR)/usr/share/doc/pykota/html/
+	cp pykota.pdf $(DESTDIR)/usr/share/doc/pykota/
+	cp *.html $(DESTDIR)/usr/share/doc/pykota/html/
+
+clean:
+	rm -f pykota.pdf *.html build-stamp
Index: pykota/tags/1.22/debian/pykota.cron.daily
===================================================================
--- pykota/tags/1.22/debian/pykota.cron.daily (revision 2146)
+++ pykota/tags/1.22/debian/pykota.cron.daily (revision 2146)
@@ -0,0 +1,14 @@
+#! /bin/sh
+
+# check if print quota package is available
+test -x /usr/bin/warnpykota || exit 0
+
+# check if warnpyquota run is configured
+test -f /etc/default/printquota || exit 0
+. /etc/default/printquota
+
+if [ "$run_warnpykota" = "true" ]; then
+        /usr/bin/warnpykota
+fi
+
+exit 0
Index: pykota/tags/1.22/debian/copyright
===================================================================
--- pykota/tags/1.22/debian/copyright (revision 2146)
+++ pykota/tags/1.22/debian/copyright (revision 2146)
@@ -0,0 +1,123 @@
+This package was debianized by Peter Hawkins <peterh@debian.org> on
+Tue, 18 Nov 2003 14:47:59 +1100.
+
+It was downloaded from:
+http://www.librelogiciel.com/software/PyKota/Presentation/action_Presentation
+(CVS snapshot)
+
+Upstream Authors: Jeroma Alet <alet@librelogiciel.com>
+
+Copyright:
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License with
+your Debian GNU/Linux system, in /usr/share/common-licenses/GPL, or with
+the Debian GNU/Linux pykota source package as the file COPYING.  If not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA 02111-1307, USA.
+
+
+The file LICENSE in the source tree contains the instructions which are
+included below.
+The author's wishes do not make the software DFSG non-free, since the
+official/non-official distinction is a request, not a requirement. That said,
+the debian package complies with the author's wishes and is labelled as
+unofficial; I encourage you to support free software and buy an official
+version if pykota turns out to be useful for you.
+
+============================================================
+Download :
+
+  * PyKota is distributed under the "GNU General Public License":/GPL
+
+  * You can access to PyKota's source code by using CVS from :
+  
+      "http://savannah.nongnu.org/cvs/?group=pykota":http://savannah.nongnu.org/cvs/?group=pykota
+
+    Then follow the instructions in the section labeled "Getting a Copy of the CVS Repository". 
+
+  * Clients who purchased an **Official PyKota Package** can directly access to "the tarballs HERE":/software/PyKota/tarballs .
+               
+Why no tarball is available for free :
+
+  * The CVS version will always be labelled as **unofficial** and the word **unofficial**
+    will appear whenever you run PyKota command line tools with the *--version* command line
+    argument.
+
+  * I ask you to not label or present a version of PyKota downloaded 
+    from CVS as being the 'OFFICIAL' one. 
+
+  * I encourage you to buy an 'OFFICIAL' PyKota package. See below for 
+    the benefits of doing so. 
+
+  * A PyKota version obtained either from CVS (unofficial) or by 
+    purchasing an official package, **IS FREELY REDISTRIBUTABLE AND 
+    MODIFIABLE, AT NO COST, UNDER THE TERMS OF THE GNU GENERAL PUBLIC 
+    LICENSE.** 
+
+  * Version number excepted, **THERE'S NO SOURCE CODE DIFFERENCE 
+    BETWEEN 'OFFICIAL' AND 'UNOFFICIAL' VERSIONS OF PyKota.** However it 
+    should be clear to you that the latest version you can find in CVS 
+    may be somewhat unstable or unfinished, since this software is a 
+    work in progress, and that it's up to you to download working 
+    revisions from the CVS tree. That's why I suggest that you purchase 
+    an **'OFFICIAL'** version, because it will be simpler for you (and 
+    better for me). Also the documentation included in the 
+    **'UNOFFICIAL'** version is only delivered in DocBook XML/SGML 
+    source form, and not in compiled forms like HTML or PDF. 
+
+  * You can obtain an **'OFFICIAL'** version of PyKota in two forms :
+
+    * Electronic form :
+
+      * You pay me any amount of money starting at **20$ (US Dollars)**
+
+      * Then I send you the latest **PyKota 'OFFICIAL'** tarball, 
+        including the latest version of the electronic documentation in 
+        SGML, HTML and PDF formats, by email. 
+
+    * CDROM + Paper documentation *(not yet available, documentation 
+      still under works)* : 
+
+      * You pay me any amount of money starting at **30$ (US Dollars)**
+
+      * Then I send you the latest **PyKota 'OFFICIAL'** tarball, 
+        including the latest version of the electronic documentation in 
+        SGML, HTML and PDF formats, on CDROM, accompanied with the latest 
+        version of the printed documentation. No additionnal shipping costs 
+        will be asked to you, unless you require a specific delivery mode. 
+
+  * The "purchase":/software/PyKota/Purchase of an **'OFFICIAL'** 
+    version also allows you to : 
+
+    * Modify or redistribute the **'OFFICIAL'** version you purchased, 
+      under the terms of the GNU General Public License of the Free 
+      Software Foundation. I just ask you to remove the 'OFFICIAL' word 
+      from the version number if you redistribute a modified official 
+      version. 
+
+    * Obtain free technical support for a year starting at your purchase 
+      date : This includes bug fixes and new official versions, as well as 
+      priority email support. 
+
+    * Obtain half of **your money back** in case you contribute source 
+      code or documentation which I accept in the source tree. If you're a 
+      motivated developper, you've got strong chances to get half of your 
+      money back. *NB : You will have to send me a signed copyright 
+      assignment on paper in order for me to be able to accept your 
+      patches on PyKota.* 
+
+    * By purchasing an official package, your karma will also be better.
+
+I sincerely hope that you will find this proposition as fair as I do 
+think it is. 
+
Index: pykota/tags/1.22/debian/pykota.config
===================================================================
--- pykota/tags/1.22/debian/pykota.config (revision 2146)
+++ pykota/tags/1.22/debian/pykota.config (revision 2146)
@@ -0,0 +1,20 @@
+#/bin/sh -e
+#
+#
+
+# Source debconf library.
+. /usr/share/debconf/confmodule
+
+#db_title "Print Quota/Accounting system for CUPS and LPRng, PyKota"
+
+db_input medium pykota/upgrading_1.21alpha24 || true
+db_go
+
+db_input medium pykota/upgrading_1.19alpha24 || true
+db_go
+
+db_input medium pykota/upgrading_1.19alpha17 || true
+db_go
+
+db_input medium pykota/upgrading_1.19alpha10 || true
+db_go
Index: pykota/tags/1.22/debian/examples
===================================================================
--- pykota/tags/1.22/debian/examples (revision 2146)
+++ pykota/tags/1.22/debian/examples (revision 2146)
@@ -0,0 +1,6 @@
+initscripts/postgresql/pykota-postgresql.sql
+initscripts/ldap/pykota.schema
+initscripts/ldap/pykota-sample.ldif
+conf/pykota.conf.sample
+conf/pykotadmin.conf.sample
+untested
Index: pykota/tags/1.22/conf/pykotadmin.conf.sample
===================================================================
--- pykota/tags/1.22/conf/pykotadmin.conf.sample (revision 2204)
+++ pykota/tags/1.22/conf/pykotadmin.conf.sample (revision 2204)
@@ -0,0 +1,62 @@
+# PyKota sample administrator's configuration file
+#
+# Under NO circumstances regular users should 
+# be allowed to read this file.
+#
+#
+# File format :
+#
+#   - A mandatory [global] section :
+#
+#     Contains configuration directives to specify the username and
+#     optional password for the PyKota's database administrator.
+#     This user is either a PostgreSQL user, or an LDAP dn.
+#
+# Directives format :
+#
+#   - Directive's name, followed by ':' followed by the directive's value.
+#
+#   - No leading whitespace : leading whitespace tell the parser that the
+#     current directive is the continuation of the previous one. Use with
+#     care and only when you need it.
+#
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+
+#
+# THIS FILE CONTAINS SENSITIVE DATAS LIKE A USERNAME AND PASSWORD
+# WHICH ALLOW READ/WRITE ACCESS TO YOUR PRINT QUOTA DATABASE.
+#
+# ONLY THE root USER AND THE USER THE PRINTING SYSTEM IS RUN AS
+# (e.g. lp) SHOULD BE ALLOWED TO READ THIS FILE !
+#
+
+#
+# THIS FILE CAN ONLY CONTAIN A [global] SECTION AND TWO FIELDS
+# NAMED storageadmin AND storageadminpw
+#
+
+[global]
+
+# Quota Storage administrator's name and password
+storageadmin: pykotaadmin
+# storageadminpw: Comment out if unused, or set to Quota Storage admin password
+
Index: pykota/tags/1.22/conf/Makefile.am
===================================================================
--- pykota/tags/1.22/conf/Makefile.am (revision 2146)
+++ pykota/tags/1.22/conf/Makefile.am (revision 2146)
@@ -0,0 +1,9 @@
+# FIXME, for now you can't change sysconf
+#
+pykotaconfdir = $(sysconfdir)/pykota
+pykotaconf_DATA = 			\
+	pykota.conf.sample 		\
+	pykotadmin.conf.sample
+
+EXTRA_DIST = \
+	$(pykotaconf_DATA)
Index: pykota/tags/1.22/conf/pykota.conf.sample
===================================================================
--- pykota/tags/1.22/conf/pykota.conf.sample (revision 2217)
+++ pykota/tags/1.22/conf/pykota.conf.sample (revision 2217)
@@ -0,0 +1,823 @@
+# PyKota sample configuration file
+#
+#
+# File format :
+#
+#   - A mandatory [global] section :
+#
+#     Contains configuration directives which apply for all printers.
+#     Some directives MUST be set in the [global] section, e.g.
+#     database related directives.
+#
+#   - Any number of optional [PrintQueueName] sections :
+#
+#     Contain directives which apply for a particular print queue only.
+#
+#     Override the values of the same directives present in [global].
+#
+#
+# Directives format :
+#
+#   - Directive's name, followed by ':' followed by the directive's value.
+#
+#   - No leading whitespace : leading whitespace tell the parser that the
+#     current directive is the continuation of the previous one. Use with
+#     care and only when you need it.
+#
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+
+[global]
+# Storage backend for quotas
+# only PGStorage (PostgreSQL) and LDAPStorage (OpenLDAP) are supported.
+# MySQL and BerkeleyDB are planned.
+
+# the 'postgresql' value is deprecated, use 'pgstorage' instead.
+storagebackend: pgstorage
+
+# Quota Storage Server hostname (and optional port)
+# e.g. db.example.com:5432
+storageserver: localhost
+
+#
+# name of the Quota Storage Database
+storagename: pykota
+
+# 
+# Quota Storage normal user's name and password
+# These two fields contain a username and optional password 
+# which may give readonly access to your print quota database.
+# 
+# PLEASE ENSURE THAT THIS USER CAN'T WRITE TO YOUR PRINT QUOTA
+# DATABASE, OTHERWISE ANY USER WHO COULD READ THIS CONFIGURATION
+# FILE COULD CHANGE HIS PRINT QUOTA.
+#
+storageuser: pykotauser
+# storageuserpw: Comment out if unused, or set to Quota Storage user password
+
+# Should the database caching mechanism be enabled or not ?
+# If unset, caching is disabled. Possible values Y/N/YES/NO
+# caching mechanism works with both PostgreSQL and OpenLDAP backends
+# but may be really interesting only with OpenLDAP.
+#
+# ACTIVATING CACHE MAY CAUSE PRECISION PROBLEMS IN PRINT ACCOUNTING
+# IF AN USER PRINTS ON SEVERAL PRINTERS AT THE SAME TIME.
+# YOU MAY FIND IT INTERESTING ANYWAY, ESPECIALLY FOR LDAP.
+#
+# FYI, I ALWAYS SET IT TO YES !
+#
+storagecaching: No
+
+# Should full job history be disabled ?
+# If unset or set to No, full job history is kept in the database.
+# This will be useful in the future when the report generator
+# will be written.
+# Disabling the job history can be useful with heavily loaded
+# LDAP servers, to not make the LDAP tree grow out of control.
+# Disabling the job history with the PostgreSQL backend works too
+# but it's probably less useful than with LDAP.
+disablehistory: No
+
+# LDAP example, uncomment and adapt it to your own configuration :
+#storagebackend: ldapstorage
+#storageserver: ldap://ldap.librelogiciel.com:389
+#storagename: dc=librelogiciel,dc=com
+#storageuser: cn=notadmin,dc=librelogiciel,dc=com
+#storageuserpw: abc.123
+#
+# TLS support for LDAP
+#
+# ldaptls can be set to either Yes or No
+# the default value when not set is No, meaning that TLS won't be used.
+#ldaptls: No
+#
+# cacert points to the CA Certificate file to use for TLS.
+# Ensure that every user who can launch PyKota commands can read this file.
+# There's NO default value for this directive.
+#cacert /etc/pykota/mycertfile
+#
+#
+# Here we define some helpers to know where 
+# to plug into an existing LDAP directory
+#userbase: ou=People,dc=librelogiciel,dc=com
+#userrdn: uid
+#balancebase: ou=People,dc=librelogiciel,dc=com
+#balancerdn: uid
+#groupbase: ou=Groups,dc=librelogiciel,dc=com
+#grouprdn: cn
+#printerbase: ou=Printers,ou=PyKota,dc=librelogiciel,dc=com
+#printerrdn: cn
+#jobbase: ou=Jobs,ou=PyKota,dc=librelogiciel,dc=com
+#lastjobbase: ou=LastJobs,ou=PyKota,dc=librelogiciel,dc=com
+
+# These two fields are special, they either accept a branch
+# dn, like an ou for example, or the special keywords 'user'
+# and 'group'. If 'user' or 'group' is used, the print quota
+# entries will be created below the user or group entry itself,
+# which will then be used like a branch (you can mix and match
+# different values depending on what you want to do).
+#userquotabase: user
+#userquotabase: ou=UQuotas,ou=PyKota,dc=librelogiciel,dc=com
+#groupquotabase: group
+#groupquotabase: ou=GQuotas,ou=PyKota,dc=librelogiciel,dc=com
+
+#
+# How to create new accounts and groups
+# authorized values are "below" and "attach(objectclass name [, fail|warn])"
+#
+# "below" creates the new accounts/groups as standalone entries
+# below the above defined 'userbase' ou
+# 
+# attach(objectclass name [, action]) tries to find some existing user/group
+# using the above defined 'userrdn' or 'grouprdn' and 'userbase'
+# 'groupbase', and attach the PyKota specific entries to it.
+# if action is "warn" and no entry exists to attach to, a new
+# entry is created, and a message is logged. 
+# if action is "fail" and no entry exists to attach to, program
+# logs an error message and aborts.
+# if action is not set, the default value is "fail".
+#
+# a possible value:  newuser: attach(posixAccount, warn)
+#newuser : below
+#newgroup : below
+#
+# LDAP attribute which stores the user's email address
+#usermail : mail
+
+# 
+# Choose what attribute contains the list of group members
+# common values are : memberUid, uniqueMember, member
+#groupmembers: memberUid
+
+# Activate low-level LDAP cache yes/no
+# Nothing to do with "storagecaching" which is higher level
+# and database independant.
+# This saves some search queries and may help with heavily
+# loaded LDAP servers.
+# This is EXPERIMENTAL.
+#
+# BEWARE : SETTING THIS TO 'YES' CAUSES PROBLEMS FOR NOW
+# BETTER TO LET IT SET TO 'NO'
+# ldapcache: no
+
+# Where to log ?
+# supported values : stderr, system (system means syslog, but don't use 'syslog' here)
+# if the value is not set then the default SYSTEM applies.
+logger: system
+
+# Enable debugging ? Put YES or NO there.
+# debug is set to yes in this sample
+# configuration file, so debugging is activated
+# when configuring PyKota. After all works, just
+# put NO instead to save some disk space in your
+# logs.
+debug : Yes
+
+# Mail server to use to warn users
+# If the value is not set then localhost is used.
+smtpserver: localhost
+
+# Crash messages' recipient : in addition to the log files
+# each software crash can be sent to the author of PyKota
+# or any other person of your choice. By default this
+# is disabled. The recipient pykotacrashed@librelogiciel.com
+# reaches PyKota's author.
+# The 'adminmail' (defined a bit below) is CCed.
+#
+# Privacy concerns : what is sent is only :
+#
+#        - a copy of the software's traceback
+#        - a copy of the software's command line arguments
+#        - a copy of the software's environment variables
+# 
+# suggested value
+# crashrecipient: pykotacrashed@librelogiciel.com
+
+# Email domain
+# If the value is not set, and the mail attribute for the user
+# is not set in the PyKota storage, be it LDAP (see usermail directive
+# above) or PostgreSQL, then email messages are sent to 
+# username@smtpserver
+#
+# If the value is set, then email messages are sent to
+# username@maildomain using the SMTP server defined above
+#
+# Set the appropriate value below, example.com set as per RFC2606.
+maildomain: example.com
+
+# Should we force usernames to be all lowercase when printing ?
+# Default is No. 
+# This is a global option only.
+# Some people reported that WinXP sends mixed case usernames
+# setting 'utolower: Yes' solves the problem.
+# Of course you have to use lowercase only when adding
+# users with edpykota, because ALL database accesses are
+# still case sensitive.
+#
+# If utolower is Yes, the usernames received from the printing
+# system is converted to lowercase at the start of the cupspykota
+# backend or of the lprngpykota filter.
+#
+# If utolower is No, which is the default, strict case checking
+# is done, this means that users 'Jerome' and 'jerome' are
+# different. Printer and groups names are ALWAYS case sensitive.
+utolower: No
+
+# Should we split usernames on a specific separator when printing ?
+# Default is No, i.e. if the value is unset.
+# This is a global option only.
+# This option adds support for Samba's Winbind utility, which
+# prefixes usernames with domain name and separator character.
+# Of course if you set this then you have to use NO separator when 
+# adding users with edpykota.
+#
+# If winbind_separator is set, the usernames received from the printing
+# system are split on the separator's value, and only the last part
+# (real username) is used.
+#
+# If winbind_separator is not set, which is the default, strict 
+# username equality checking will be done (modulo the setting
+# of the 'utolower' directive), this means that users 'DOMAIN1/jerome',
+# 'Domain2/jerome' and 'jerome' are different. 
+# winbind_separator: /
+
+# When creating users or groups accounts, should we reject users
+# or groups which are unknown from the system ?
+# The default if unset is NO. This means that by default, you
+# can create users or groups for which `getent passwd username` 
+# or `getent group groupname` returns nothing.
+#
+# Allowed values : Yes | No
+# Default value : No
+#
+# reject_unknown: No
+
+# Do we want to hide jobs' title, filename and options for privacy
+# reasons ?
+# This may be required in some countries (Italy comes to mind).
+# Allowed values are YES and NO.
+# If unset, the default value is NO, meaning that jobs' title, filename
+# and options will be saved into the history.
+# This option can't be set on a per printer basis, only into the 
+# [global] section.
+privacy : no
+
+# What is the accounting backend to use
+# 
+# supported values :
+#
+#    - hardware : asks the printer for its lifetime page counter
+#                 via either SNMP, AppleTalk, or any external
+#                 command. This method is the recommended one
+#                 in PyKota since its beginning.
+#
+#                 In the lines below "%(printer)s" is automatically replaced
+#                 at run time with your printer's Fully Qualified Domain Name
+#                 for network printers, if PyKota can extract it from its 
+#                 environment.
+#                 e.g. myprinter.example.com
+#
+#         Recommended values :
+#
+#             accounter: hardware(snmp)
+#
+#               Extracts the printer's internal page counter via SNMP.
+#
+#         Or :
+#
+#             accounter: hardware(pjl)
+# 
+#               Extracts the printer's internal page counter via PJL queries over port tcp/9100.
+#
+#         Other Examples : 
+#         
+#             accounter: hardware(/usr/bin/snmpget -v1 -c public -Ov %(printer)s mib-2.43.10.2.1.4.1.1 | cut -f 2,2 -d " ")
+#         
+#         Another untested example, using npadmin :
+#         
+#             accounter: hardware(/usr/bin/npadmin --pagecount %(printer)s)
+#         
+#         Another example, for AppleTalk printers which works fine :
+#         (You may need the pap CUPS backend installed, and copy the 
+#         pagecount.ps file from untested/netatalk into /etc or any 
+#         appropriate location)
+#         
+#             accounter: hardware(/usr/share/pykota/papwaitprinter.sh "MyPrinter:LaserWriter@*" && /usr/bin/pap -p "MyPrinter:LaserWriter@*" /usr/share/pykota/pagecount.ps  2>/dev/null | /bin/grep -v status | /bin/grep -v Connect | /usr/bin/tail -1)
+#         
+#         An example for parallel printers like the HP Laserjet 5MP :
+#         
+#             accounter: hardware(/bin/cat /usr/share/pykota/pagecount.pjl >/dev/lp0 && /usr/bin/head -2 </dev/lp0 | /usr/bin/tail -1)
+#         
+#         This value can be set either globally or per printer or both.
+#         If both are defined, the printer option has priority.
+#         
+#         Some examples and comments provided by Bob Martel from csuohio.edu
+#         
+#         For several printers I could not get the page count using snmpget.  I
+#         resorted to snmpwalk:
+#         
+#             accounter: hardware(/opt/local/net-snmp/bin/snmpwalk -v 1 -Cc -c public %(printer)s | grep mib-2.43.10.2.1.4.1.1 | cut -d " " -f4)
+#         
+#         The last example is still more ugly, some of the printers only provided
+#         their counters without names, but at least always on the same line:
+#         
+#             accounter: hardware(/opt/local/net-snmp/bin/snmpwalk -v 1 -Cc -c public -Ov %(printer)s | grep Counter32 | tail -2 | head -1 | cut -d " " -f2)
+#         
+#         An example using netcat and a preformatted PJL job which you can find
+#         in the untested/pjl directory, which is sent to a JetDirect print
+#         server on port 9100 :
+#         
+#             accounter: hardware(/bin/nc -w 2 %(printer)s 9100 </usr/share/pykota/pagecount.pjl | /usr/bin/tail -2)
+#         
+#         An example using the contributed pagecount.pl script which does 
+#         the same as above, but should work on more printers : 
+#         
+#             accounter: hardware(LC_ALL=C /usr/share/pykota/pagecount.pl %(printer)s 9100)
+#         
+#         NB : the LC_ALL=C is used because sometimes Perl can correctly set locale and is verbose
+#              about it, causing PyKota to miss the correct answer.
+#
+#         WARNING : In any case, when using an hardware accounter, please test the command line outside
+#                   of PyKota before. This will save you some headaches in case it doesn't work as expected.
+#         
+#         The waitprinter.sh is there to wait until the printer is idle again.
+#         This should prevent a job to be sent to the printer while another one is 
+#         not yet finished (not all pages are printed, but the complete job is in 
+#         the printer)
+#         
+#   YOU ABSOLUTELY HAVE TO BE SURE YOU HAVE A SCRIPT WHICH WAITS FOR THE
+#   PRINTER BEING READY BEFORE ASKING FOR ITS INTERNAL PAGE COUNTER.
+#         
+#   PYKOTA INCLUDES SUCH SCRIPTS FOR SNMP AND APPLETALK PRINTERS, MORE TO COME
+#
+#   SOME OF THE ABOVE EXAMPLES DON'T USE SUCH A SCRIPT, YOU HAVE BEEN WARNED
+#
+#
+#   WITH THE SPECIAL MAGIC hardware(snmp) AND hardware(pjl) VALUES, PYKOTA
+#   TAKES CARE OF ALL THIS FOR YOU, SO PLEASE UNDERSTAND THAT IT IS PREFERABLE
+#   TO USE THESE TWO METHODS : THEY WORK FINE, REQUIRE LITTLE TO NO CPU,
+#   AND DO ALL THE HARD WORK AUTOMATICALLY. IF YOU REALLY NEED TO YOU CAN USE
+#   YOUR OWN EXTERNAL COMMANDS AS DESCRIBED ABOVE, JUST BE CAREFUL WITH THIS.
+#         
+#
+#    - software : delegates the job's size computation to any 
+#                 external command of your choice. 
+#
+#                 best choice for this is probably to set it
+#                 this way :
+#
+#                   accounter: software()
+#
+#                 which uses PyKota's internal parser to compute
+#                 the size of the job.
+#
+#                 You could obtain exactly the same result with :
+#
+#                   accounter: software(/usr/bin/pkpgcounter)
+#
+#                 But in this case the job would be passed through
+#                 PyKota's internal parser a second time.
+#
+#                 pkpgcounter is a command line tool which is
+#                 part of PyKota and which can handle both
+#                 DSC compliant or binary PostScript, PCL5, PCL6 (aka PCLXL)
+#                 and PDF documents. More file formats will be added
+#                 in the future, as time permits.
+#
+#                 while pkpgcounter is the recommended value if you want
+#                 to use an external command here, you can use whatever 
+#                 command you want provided your command accepts the job's
+#                 data on its standard input and prints the job's size in 
+#                 pages as a single integer on its standard output.
+# 
+# This value can be set either globally or on a per printer basis
+# If both are defined, the printer option has priority.
+#
+# accounter: hardware(/usr/share/pykota/waitprinter.sh %(printer)s && /usr/bin/snmpget -v1 -c public -Ov %(printer)s mib-2.43.10.2.1.4.1.1 | cut -f 2,2 -d " ")
+# accounter: hardware(snmp)
+# accounter: hardware(pjl)
+# accounter: software(/usr/bin/pkpgcounter)
+#
+# The following is only allowed since PyKota 1.21 
+accounter: software()
+
+# What should we do if the accounter's subprocess doesn't return
+# a valid result (for example doesn't return an integer on its stdout)
+#
+# Valid values are : 'continue' and 'stop'. 'stop' is the default
+# if unset.
+#
+# 'continue' means try to process as usual, this may introduce
+# accounting errors and free jobs. This was the default behavior
+# until v1.20alpha5.
+#
+# 'stop' means fail and stop the print queue. If an accounter
+# error occurs, most of the time this is a misconfiguration, so
+# stopping the print queue is usually the better thing to do 
+# until the admin has fixed the configuration.
+#
+# This value can be set either globally or on a per printer basis
+# If both are defined, the printer option has priority.
+#
+# NB : This directive shouldn't do much now because in case
+# of external accounter error, PyKota just loops.
+#
+# onaccountererror: continue
+onaccountererror: stop
+
+# Print Quota administrator
+# These values can be set either globally or per printer or both.
+# If both are defined, the printer option has priority.
+# If these values are not set, the default admin root 
+# and the default adminmail root@localhost are used.
+admin: John Doe
+adminmail: root@localhost
+
+#
+# Who should we send an email to in case a quota is reached ?
+# possible values are : DevNull, User, Admin, Both, External(some command)
+# The Both value means that the User and the Admin will receive 
+# an email message.
+# The DevNull value means no email message will be sent.
+# This value can be set either globally or per printer or both.
+# If both are defined, the printer option has priority.
+# If the value is not set, then the default BOTH applies.
+#
+#   Format of the external syntax :
+#
+#       mailto: external(/usr/bin/mycommand >/dev/null)
+#
+#   You can use :
+#
+#       '%(action)s'            will contain either WARN or DENY
+#       '%(username)s'          will contain the user's name
+#       '%(printername)s'       will contain the printer's name
+#       '%(email)s'             will contain the user's email address
+#       '%(message)s'           will contain the message if you want 
+#                               to use it.
+#
+#   On your command line, to pass arguments to your command.
+#   Example :
+#
+#       mailto: external(/usr/bin/callpager %(username)s "Quota problem on %(printername)s" >/dev/null)
+#
+#   To automatically send a WinPopup message (this may only work with a PDC, 
+#   here the same machine does Samba as PDC + CUPS) :
+#
+#       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)
+#
+#   NB : I use ISO-8859-15, but Windows expects UTF-8, so we pipe the message
+#        into iconv before sending it to the Windows user.
+#
+# or more simply :
+#
+#       mailto: external(/usr/share/pykota/mailandpopup.sh %(username)s %(printername)s "%(email)s" "%(message)s" 2>&1 >/dev/null)
+#
+#   NB : The mailandpopup.sh shell script is now included in PyKota
+#
+#   NB : in ANY case, don't forget to redirect your command's standard output
+#        somewhere (e.g. >/dev/null) so that there's no perturbation to the 
+#        underlying layer (filter or backend)
+#
+mailto: both
+
+#
+# Grace delay in days
+# This value can be set either globally or per printer or both.
+# If both are defined, the printer option has priority.
+# If the value is not set then the default seven (7) days applies.
+gracedelay: 7
+
+#
+# Poor man's threshold
+# If account balance reaches below this amount,
+# a warning message is sent by email
+#
+# If unset, default poor man's threshold is 1.0.
+# This option can only appear in the global section
+poorman: 2.0
+
+# Poor man's warning message
+# The warning message that is sent if the "poorman" value is reached
+# Again this must appear in the global section
+poorwarn: Your Print Quota account balance is low. 
+ Soon you'll not be allowed to print anymore.
+
+# Soft limit reached warning message
+# The warning message that is sent if the soft quota limit is reached
+# May appear either globally or on a per-printer basis
+softwarn: Your Print Quota Soft Limit is reached.
+ This means that you may still be allowed to print for some
+ time, but you must contact your administrator to purchase 
+ more print quota.
+ 
+# Hard limit reached error message
+# The error message that is sent if the hard quota limit is reached
+# May appear either globally or on a per-printer basis
+hardwarn: Your Print Quota Hard Limit is reached.
+ This means that you are not allowed to print anymore.
+ Please contact your administrator at root@localhost
+ as soon as possible to solve the problem.
+
+# one section per printer, or no other section at all if all options 
+# are defined globally.
+# Each section's name must be the same as the printer's queue name as defined
+# in your printing system, be it CUPS or LPRng, between square brackets, for
+# example a print queue named 'hpmarketing' would appear in this file as
+# [hpmarketing]
+
+
+# Default policy to apply when either :
+#
+#       - Printer doesn't exist in PyKota's database
+#       - User doesn't exist in PyKota's database
+#       - User has no quota entry for this Printer in PyKota's database
+#
+# Value can be either allow or deny or external(some command here)
+#
+# This value can be set either globally or per printer or both.
+# If both are defined, the printer option has priority.
+# If the value is not set then the default policy DENY applies.
+# There's no policy wrt inexistant groups, they are ignored.
+#
+# external policy can be used to launch any external command of your choice,
+# for example to automatically add the user to the quota storage 
+# if he is unknown. Example :
+# 
+#   policy: external(/usr/bin/edpykota --add --printer %(printername)s --softlimit 50 --hardlimit 60 %(username)s >/dev/null) 
+#
+# NB : If you want to limit users by their account balance value, it is preferable to
+# use the following policy to automate user account creation on first print :
+#
+#   policy: external(/usr/bin/autopykota --initbalance 25.0 >/dev/null) 
+#
+#   This will automatically add the user if he doesn't already exist, and
+#   set his initial balance value to 25.0 (for example). If the user already 
+#   exists then his balance value will not be modified. 
+#   Please don't use autopykota if you want to limit your users by page
+#   quota, and in any case, carefully read autopykota's help or manpage
+#   and understand its goal before using it in your own configuration.
+#
+# Of course you can launch any command of your choice with this, e.g. :
+#
+#   policy: external(/usr/local/bin/myadminscript.sh %(username)s >/dev/null)
+
+# You can use :
+#
+#       '%(username)s'          will contain the user's name
+#       '%(printername)s'       will contain the printer's name
+#
+#   On your command line, to pass arguments to your command. 
+#
+#   NB : Don't forget to redirect your command's standard output somewhere 
+#        (e.g. >/dev/null) so that there's no perturbation to the underlying
+#        layer (filter or backend)
+#
+# If the printer, user, or user quota entry still doesn't exist after 
+# external policy command was launched (the external command didn't add it), 
+# or if an error occured during the execution of the external policy 
+# command, then the job is rejected.
+#
+policy: deny
+
+# Pre and Post Hooks 
+# These directives allow the easy plug-in of any command of your choice
+# at different phases of PyKota's execution.
+# Pre and Post Hooks can access some of PyKota's internal information
+# by reading environment variables as described below.
+# The actual phase of PyKota's execution is available in the
+# PYKOTAPHASE environment variable.
+# Pre and Post Hooks can be defined either globally, per printer,
+# or both. If both are defined, the printer specific hook has
+# priority.
+#
+# List of available environment variables :
+# NB : Most of these variables are also available during the execution
+# of external commands defined in the accounter and mailto 
+# directives.
+#
+# PYKOTAMD5SUM : Contains an hexadecimal digest of the md5 sum of the job's datas
+# PYKOTAPHASE : BEFORE or AFTER the job is sent to the printer
+# PYKOTAACTION : ALLOW or DENY or WARN for current print job
+# PYKOTAUSERNAME : user's name
+# PYKOTAPRINTERNAME : printer's name
+# PYKOTAPGROUPS : list of printers groups the current printer is a member of
+# PYKOTAJOBID : job's id
+# PYKOTATITLE : job's title
+# PYKOTAFILENAME : job's filename
+# PYKOTACOPIES : number of copies
+# PYKOTAOPTIONS : job's options
+# PYKOTABALANCE : user's account balance
+# PYKOTALIFETIMEPAID : user's grand total paid 
+# PYKOTALIMITBY : user print limiting factor, for example 'quota' or 'balance'
+# PYKOTAPAGECOUNTER : user's page counter on this printer
+# PYKOTALIFEPAGECOUNTER : user's life time page counter on this printer
+# PYKOTASOFTLIMIT : user's soft page limit on this printer
+# PYKOTAHARDLIMIT : user's hard page limit on this printer
+# PYKOTADATELIMIT : user's soft to hard limit date limit on this printer
+# PYKOTASTATUS : contains "CANCELLED" when SIGTERM was received by PyKota
+#                else is not set.
+# PYKOTAJOBSIZEBYTES : contains the job's size in bytes. Always available.
+# PYKOTAPRECOMPUTEDJOBSIZE : contains the precomputed job's size
+# PYKOTAPRECOMPUTEDJOBPRICE : contains the precomputed job's price
+# PYKOTAJOBORIGINATINGHOSTNAME : contains the client's hostname if 
+#                                it is possible to retrieve it.
+# PYKOTAPRINTERHOSTNAME : the printer's hostname or IP address for network
+#                         printers, or "localhost" if not defined or not
+#                         meaningful.
+# PYKOTAWARNCOUNT : the number of times the user was forbidden to print but a banner
+#                   page was still printed on the current printer.                   
+# PYKOTAOVERCHARGE : user's overcharging factor.
+# PYKOTAJOBBILLING : Job's billing code if present (CUPS only)
+#
+
+# PreHook : gets executed after being sure the user, printer and user quota
+# entry on the printer both exist in the PyKota database, and after
+# checking if the user is allowed to print or not, but just before
+# the job is sent to the printer (if allowed)
+# prehook has access to many environment variables :
+#
+# PYKOTAACTION contains either "ALLOW", "WARN" or "DENY" and 
+# represents the action which is to be done wrt the print job.
+# PYKOTAPHASE contains 'BEFORE' during execution of prehook 
+#
+# uncomment the line below to see what environment variables are available
+# prehook: /usr/bin/printenv >/tmp/before
+
+# PostHook : gets executed after the job has been added to the history.
+# posthook has access to all the environment variables defined above,
+# as well as two additionnal environment variables : PYKOTAJOBPRICE 
+# and PYKOTAJOBSIZE. 
+# PYKOTAPHASE contains 'AFTER' during execution of posthook.
+#
+# uncomment the line below to see what environment variables are available
+# posthook: /usr/bin/printenv >/tmp/after
+
+# AccountBanner : how should banner accounting be done ?
+#
+# NB : CUPS ONLY FOR NOW !
+# 
+# If enabled, banner pages printed from StartingBanner and/or EndingBanner 
+# (depending on the value) will be included in the accounting for the
+# print job
+#
+# If disabled, banner pages printed from StartingBanner and EndingBanner will
+# *not* be included in the accounting for the print job
+#
+# IMPORTANT : CUPS generated banners are ALWAYS accounted for, although you
+#             can refund them by using negative prices on printers.
+#
+# Allowed values : Starting | Ending | None | Both
+#
+#       - Starting : only the starting banner will be accounted for.
+#       - Ending : only the ending banner will be accounted for.
+#       - Both : both starting and ending banners will be accounted for.
+#       - None : banners will not be accounted for.
+#
+# Default value :
+# accountbanner: Both
+
+# Maximal number of times the banner will still be printed if
+# the user is forbidden to print.
+#
+# NB : CUPS ONLY FOR NOW !
+# 
+# This option can be set either globally or on a per printer basis.
+# Allowed values are 0 or any positive integer.
+# Default value is 0, which means that the banner won't be printed
+# at all if the user is forbidden to print.
+maxdenybanners: 0
+
+# StartingBanner : if defined will print a banner before the rest of the job 
+# is printed. The argument can be a printable file, or an executable file.
+# If not executable, the file will be printed as is. If executable, the 
+# file will be executed and its output will be printed.
+#
+# NB : CUPS ONLY FOR NOW !
+# 
+# In any case, the banner content which will be sent to the printer
+# MUST be in a format your printer will accept !!! 
+#
+# The pkbanner command included in PyKota can automatically generate
+# starting and ending banners in the PostScript format. You can use
+# this command in a pipe through GhostScript if your printer doesn't 
+# accept PostScript as an input format.
+# NB : pkbanner's default page size is A4
+#
+# startingbanner: /home/joe/mystaticbanner.ps
+# startingbanner: /usr/bin/pkbanner --pagesize=A4 --logo="/home/joe/mylogo.jpeg" --url="http://tech.example.com"
+# startingbanner: /usr/bin/pkbanner | gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sOutputFile=- -sDEVICE=lj5mono -
+# startingbanner: /usr/bin/pkbanner
+
+# EndingBanner : if defined will print a banner before the rest of the job 
+# is printed. The argument can be a printable file, or an executable file.
+# If not executable, the file will be printed as is. If executable, the 
+# file will be executed and its output will be printed.
+#
+# NB : CUPS ONLY FOR NOW !
+#
+# In any case, the banner content which will be sent to the printer
+# MUST be in a format your printer will accept !!!
+#
+# The pkbanner command included in PyKota can automatically generate
+# starting and ending banners in the PostScript format. You can use
+# this command in a pipe through GhostScript if your printer doesn't 
+# accept PostScript as an input format.
+# NB : pkbanner's default page size is A4
+#
+# A static banner page
+# endingbanner: /home/joe/mystaticbanner.ps
+#
+# A banner with personnalized logo and url
+# endingbanner: /usr/bin/pkbanner --pagesize=A4 --logo="/home/joe/mylogo.jpeg" --url="http://tech.example.com"
+#
+# A banner in the format accepted by the printer
+# endingbanner: /usr/bin/pkbanner | gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sOutputFile=- -sDEVICE=lj5mono -
+#
+# A banner with more info on it, extracted from the yellow pages.
+# the string "Phone 111222333444" will be added to the banner page
+# if extractphone.sh returns 111222333444 for the current user.
+# endingbanner: /usr/bin/pkbanner Phone `extractphone.sh $PYKOTAUSERNAME`
+#
+# Default PyKota banner
+# endingbanner: /usr/bin/pkbanner 
+
+# How should enforcement be done for this printer ?
+#
+# "laxist" is the default if value is not set, and allows users
+# to be over quota on their last job. 
+#
+# "strict" tries to prevent users from ever being over quota.
+#
+# Enforcement can be defined either globally, per printer,
+# or both. If both are defined, the printer specific enforcement 
+# setting has priority. 
+#
+# valid values : "strict" or "laxist"
+#
+# default value
+# enforcement : laxist
+enforcement : strict
+
+# Should we trust the job size on this printer ?
+#
+# "trustjobsize : yes" is the default, the jobsize, either computed
+# by the hardware or by software is trusted.
+#
+# "trustjobsize : >N:precomputed" : uses the precomputed value if jobsize > N pages
+# "trustjobsize : >N:25" : uses 25 if jobsize is >N pages
+#
+# General form : ">n:m" where n is a positive integer, and m is 
+# either the word 'precomputed' or a positive integer.
+# The special form "yes" is also accepted and is the default.
+#
+# This directive can be set either globally or on a per printer
+# basis. Use this directive when hardware accounting for a particular
+# printer produces some glitches due to the printer returning 
+# incorrect answers.
+#
+# NB : DON'T MODIFY THIS IF YOU DON'T NEED TO. THIS IS ONLY TO BE USED
+# AS A WORKAROUND FOR SOME PRINTERS. IT'S PROBABLY BETTER TO ALWAYS
+# SET THIS DIRECTIVE TO 'yes'. THIS DIRECTIVE WILL ONLY BE HONORED 
+# IF PYKOTA DETECTS A DIFFERENCE BETWEEN THE PRECOMPUTED JOB SIZE
+# AND THE JOB SIZE AS COMPUTED BY PYKOTA EITHER USING HARDWARE OR
+# SOFTWARE.
+trustjobsize : yes
+
+# Should we deny duplicate jobs ?
+#
+# A duplicate is a job sent twice (or more) in a row to the same printer
+# by the same user.
+#
+# This can be defined either globally or on a per printer basis
+# The default value is 'no', meaning that duplicate jobs are
+# allowed.
+#
+# NB : if an user prints a job, a second user prints another
+#      job, and the first user prints the first job again,
+#      this is NOT considered as a duplicate since the two
+#      identical jobs printed by the first user are not
+#      one just after the other.
+#
+# Possible values are 'yes' and 'no'
+#
+denyduplicates : no
+
Index: pykota/tags/1.22/conf/README
===================================================================
--- pykota/tags/1.22/conf/README (revision 2146)
+++ pykota/tags/1.22/conf/README (revision 2146)
@@ -0,0 +1,33 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains sample configuration files for PyKota.
+You can copy them to ~pykota/pykota.conf and
+~pykota/pykotadmin.conf and adapt them to your needs.
+
+Don't forget to protect ~pykota/pykotadmin.conf from being
+readable by normal users since it contains sensitive informations
+which may allow people to modify their own quota information.
+
+Please refer to the toplevel README, the SECURITY document, and
+the complete documentation for details about this.
+
+====================================================================
Index: pykota/tags/1.22/docs/edpykota.sgml
===================================================================
--- pykota/tags/1.22/docs/edpykota.sgml (revision 2237)
+++ pykota/tags/1.22/docs/edpykota.sgml (revision 2237)
@@ -0,0 +1,125 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title id="edpykota">Manage the Print Quota DataBase with edpykota</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    <command>edpykota</command> is the main command line tool with which you will 
+    maintain your print quota database.
+  </para>
+  
+  <para>
+    You'll use this tool to create, manage or delete print quota entries for users
+    or users groups on printers or printers groups.
+  </para>
+  
+  <para>
+    By default, before being allowed to print through <application>PyKota</application>,
+    an user must exist in the database and have a print quota entry on every printer
+    he should be allowed to use. The simplest way to add an user named <literal>jerome</literal> to the database is
+    to type :
+<screen>    
+$ edpykota --add --noquota jerome
+</screen>
+  </para>
+  
+  <para>
+    The command above has created user <literal>jerome</literal> in the database, and has automatically
+    created print quota entries with no limit for this user on all existing printers. This means
+    that user <literal>jerome</literal> is allowed to print without limitation, but that full accounting
+    will still be done for this user : you'll know whenever he prints and how much.
+  </para>
+  
+  <para>
+    You can apply two sorts of print quotas to users : page quotas, and account balance quotas.
+    <itemizedlist>
+      <listitem>
+        <para>
+          Page quotas are defined for each user on each printer. This means that an user can be
+          limited to print more than 20 pages on printer <literal>HP2100</literal> while still
+          being allowed to print 500 pages on printer <literal>TekTro</literal>.
+        </para>
+      </listitem>  
+      <listitem>
+        <para>
+          Account balance quotas are defined once for each user. You give a number of credits
+          to an user, and whenever he prints on any printer, his number of credits diminishes
+          by the cost of the current print job, until his balance reaches 0.
+          In other terms, while page quotas are specific to a particular printer for a particular
+          user, account balance quotas are shared between all printers for a particular user.
+        </para>
+      </listitem>  
+    </itemizedlist>  
+    This means that you have to choose which type of quota you want for each user.
+    The default mode is page quotas, but if you pass <literal>--limitby balance</literal>
+    as command line options to <command>edpykota</command>, the users onto which the command
+    will apply will be limited by the value of their account instead of by a number of
+    pages.
+  </para>
+  
+  <para>
+    Here's an incomplete list of features :
+    
+    <itemizedlist>
+      <listitem>
+        <para>
+          Add printers (it's preferable to use the <command>pkprinters</command> command for this though) ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Add and delete users and groups ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Set users' account balances ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Set users and groups print quotas on printers, eventually by using another user
+          or group as a template ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Set price per page and price per job for printers (it's preferable to use the <command>pkprinters</command> command for this though) ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Switch users or groups to or from <quote>account only</quote> mode (no quota enforcement) ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Define hard and soft limits for users ou groups quotas, on a per printer basis ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Choose the way you will limit printing : either by page quota or by account balance value ;
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Reset page counters.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+          Etc...
+        </para>
+      </listitem>
+    </itemizedlist>
+  </para>
+  
+  <para>
+    For more details on the use of <command>edpykota</command>, please see this command's manual
+    page or help.
+  </para>
+  
+</chapter>
+
Index: pykota/tags/1.22/docs/scripts.sgml
===================================================================
--- pykota/tags/1.22/docs/scripts.sgml (revision 2147)
+++ pykota/tags/1.22/docs/scripts.sgml (revision 2147)
@@ -0,0 +1,117 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Useful Shell Scripts</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    <application>PyKota</application> comes with a number of shell scripts which
+    help do complex things. They can be used as-is, but you may prefer to adapt
+    them to your own configuration. All are installed in the <filename>/usr/share/pykota</filename>
+    directory.
+  </para>  
+  
+  <sect1>
+    <title>waitprinter.sh</title>
+    <para>
+      This script which accepts a printer's hostname or <acronym>IP</acronym> address as its first parameter 
+      is used to wait for a printer which supports the <acronym>SNMP</acronym> protocol to be in <literal>idle</literal> state.
+      It exits as soon as the printer is <literal>idle</literal>, else loops forever.
+    </para>
+    
+    <para>
+      When defining an hardware <literal>accounter</literal> for a printer, it is important to wait for the printer being
+      <literal>idle</literal> before asking it for its internal page counter, otherwise results could
+      be inaccurate. If the printer is asked while the job is still being printed, then the page counter's
+      value will be lower than expected with regard to the real job's size.
+    </para>
+    
+    <para>
+      <filename>waitprinter.sh</filename> can be used to be sure that <application>PyKota</application>
+      waits until no job is being printed, and no paper sheet is travelling inside the printer. 
+    </para>
+    
+    <tip>
+      <title>Tip</title>
+      <para>
+        See the sample configuration file <filename>conf/pykota.conf.sample</filename> for examples.
+      </para>
+    </tip>  
+  </sect1>
+  
+  <sect1>
+    <title>papwaitprinter.sh</title>
+    <para>
+      This script which accepts a printer's AppleTalk name as its first parameter 
+      is used to wait for a printer which supports the <acronym>AppleTalk</acronym> protocol to be in <literal>idle</literal> state.
+      It exits as soon as the printer is <literal>idle</literal>, else loops forever.
+    </para>
+    
+    <para>
+      When defining an hardware <literal>accounter</literal> for a printer, it is important to wait for the printer being
+      <literal>idle</literal> before asking it for its internal page counter, otherwise results could
+      be inaccurate. If the printer is asked while the job is still being printed, then the page counter's
+      value will be lower than expected with regard to the real job's size.
+    </para>
+    
+    <para>
+      <filename>papwaitprinter.sh</filename> can be used to be sure that <application>PyKota</application>
+      waits until no job is being printed, and no paper sheet is travelling inside the printer. 
+    </para>  
+    
+    <tip>
+      <title>Tip</title>
+      <para>
+        See the sample configuration file <filename>conf/pykota.conf.sample</filename> for examples.
+      </para>
+    </tip>  
+  </sect1>
+  
+  <sect1>
+    <title>mailandpopup.sh</title>
+    <para>
+      This script can be used in the <literal>mailto</literal> directive of <filename>pykota.conf</filename>
+      to both send an email and display a <application>Winpopup</application> message on the user's screen,
+      whenever print quota is low or reached.
+    </para>
+    
+    <para>
+      For this script to work successfully, you may need to have a <application>Samba</application> 
+      Primary Domain Controller. Some modifications may be needed in other configurations.
+    </para>
+    
+    <tip>
+      <title>Tip</title>
+      <para>
+        See the sample configuration file <filename>conf/pykota.conf.sample</filename> for examples.
+      </para>
+    </tip>  
+  </sect1>
+  
+  <sect1>
+    <title>pagecount.pl</title>
+    <para>
+      This <application>Perl</application> script can be used in the <literal>accounter</literal> directive of <filename>pykota.conf</filename>,
+      to ask a printer for its internal page counter by sending a specially crafted <acronym>PJL</acronym> job
+      to it over the AppSocket protocol, usually on <acronym>TCP</acronym> port 9100.
+      It accepts the printer's hostname or <acronym>IP</acronym> address as its first parameter,
+      and the optional <acronym>TCP</acronym> port as its second parameter (it defaults to 9100).
+    </para>  
+    
+    <para>
+      Most of the time you'll use this script in combination with a script which waits for the printer
+      to be in <literal>idle</literal> state, in something like :
+<screen>      
+accounter: hardware(somewaitscript.sh && pagecount.pl %(printer)s)
+</screen>
+    </para>
+    
+    <tip>
+      <title>Tip</title>
+      <para>
+        See the sample configuration file <filename>conf/pykota.conf.sample</filename> for examples.
+      </para>
+    </tip>  
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/pykotme.sgml
===================================================================
--- pykota/tags/1.22/docs/pykotme.sgml (revision 2233)
+++ pykota/tags/1.22/docs/pykotme.sgml (revision 2233)
@@ -0,0 +1,103 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title id="pykotme">Get print quotes before printing for real with <command>pykotme</command></title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    PyKota features a print quote generator, named <command>pykotme</command>.
+    This command line tool can be used to learn in advance how much a print job
+    will cost to you if you really send it to a printer.
+    You can then decide if printing your document is a good idea or not, and do it
+    knowingly.
+  </para>
+  
+  <para>
+    To get a print quote, you have to launch <command>pykotme</command>
+    from the command line, passing your print job's content in any format
+    recognized by PyKota
+    <footnote><para>PyKota currently recognizes PostScript (both binary and DSC compliant),
+    PCLXL (aka PCL6), PDF, PCL3/4/5, and ESC/P2
+    </para></footnote>, either in the form of one or more file names on the command line,
+    or on its standard input (i.e. in a shell pipe or redirection).
+  </para>
+  
+  <para>
+    Without any command line argument, <command>pykotme</command>
+    automatically reads your job's data from its standard input.
+  </para>
+  
+  <para>
+    By default, <command>pykotme</command>
+    will display a quote for your job on all printers. You can restrict
+    this by using the <literal>-p | --printer</literal> command line
+    option followed with either a printer's name or a wildcard
+    which will be used to search all printers which name matches.
+    You can pass more than one printer name wildcard, separating
+    them with commas.
+  </para>
+  
+  <para>
+    <command>pykotme</command>'s functionnality is also available through the
+    use of the <filename>pykotme.cgi</filename> <acronym>CGI</acronym> script.
+    However without authentication <filename>pykotme.cgi</filename> will only
+    return the print job's size and not its cost, because the cost depends on
+    the value of the user's overcharging factor. That's why if you want to
+    obtain the same functionnality with the <acronym>CGI</acronym> script than 
+    with the command line tool, you must configure your web server to force
+    users to authenticate whevenver they access to <filename>pykotme.cgi</filename>.
+  </para>
+  
+  <sect1>
+    <title>Examples</title>
+    <para>
+      Here are some examples of <command>pykotme</command> usage.
+    </para>
+    
+    <para>
+      The simplest form :
+<screen>    
+port50-2:~$ pykotme pykota.ps
+Your account balance : 16.25
+Job size : 22 pages
+Cost on printer apple : 1.35
+port50-2:~$ 
+</screen>    
+    </para>
+    
+    <para>
+      More complex, with printer name wildcard and within a pipe :
+<screen>      
+port50-2:~$ a2ps -o - pykota/README | pykotme --printer "a*"
+[pykota/README (plain): 6 pages on 3 sheets]
+[Total: 6 pages on 3 sheets] sent to the standard output
+Your account balance : 16.25
+Job size : 3 pages
+Cost on printer apple : 0.40
+port50-2:~$ 
+</screen>
+    </para>
+  </sect1>
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>pykotme</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <group choice="opt">
+          <arg>-P <replaceable>printername</replaceable></arg>
+          <arg>--printer <replaceable>printername</replaceable></arg>
+        </group>  
+        <group choice="opt">
+          <arg><replaceable>filename1</replaceable></arg>
+          <arg><replaceable>filename2</replaceable></arg>
+          <arg><replaceable>...</replaceable></arg>
+          <arg><replaceable>filenameN</replaceable></arg>
+        </group>  
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/gnugpl.sgml
===================================================================
--- pykota/tags/1.22/docs/gnugpl.sgml (revision 2146)
+++ pykota/tags/1.22/docs/gnugpl.sgml (revision 2146)
@@ -0,0 +1,430 @@
+<!-- 
+     The GNU Public License 2 in DocBook
+     Markup by Eric Baudais <baudais@okstate.edu>
+     Maintained by the GNOME Documentation Project
+     http://developer.gnome.org/projects/gdp
+     Version: 1.0.1
+     Last Modified: Nov 16, 2000
+-->
+
+<appendix id="gpl">
+  <appendixinfo>
+    <releaseinfo>
+      Version 2, June 1991
+    </releaseinfo>
+    <copyright>
+      <year>2000</year>
+      <holder>Free Software Foundation, Inc.</holder>
+    </copyright>
+    <legalnotice id="gpl-legalnotice">
+      <para>
+	<address>Free Software Foundation, Inc. 
+	  <street>59 Temple Place, Suite 330</street>, 
+	  <city>Boston</city>, 
+	  <state>MA</state> <postcode>02111-1307</postcode>
+	  <country>USA</country>
+	</address>.
+      </para>
+      <para>
+	Everyone is permitted to copy and distribute verbatim copies
+	of this license document, but changing it is not allowed.
+      </para>
+    </legalnotice>
+  </appendixinfo>
+  <title>GNU General Public License</title>
+
+  <sect1 id="gpl-preamble">
+    <title>Preamble</title>
+    
+    <para>
+      The licenses for most software are designed to take away your 
+      freedom to share and change it. By contrast, the GNU General Public 
+      License is intended to guarantee your freedom to share and change 
+      free software - to make sure the software is free for all its users. 
+      This General Public License applies to most of the Free Software 
+      Foundation's software and to any other program whose authors commit 
+      to using it. (Some other Free Software Foundation software is covered 
+      by the GNU Library General Public License instead.) You can apply it 
+      to your programs, too.
+    </para>
+
+    <para>
+      When we speak of free software, we are referring to freedom, not price. 
+      Our General Public Licenses are designed to make sure that you have the 
+      freedom to distribute copies of free software (and charge for this 
+      service if you wish), that you receive source code or can get it if you 
+      want it, that you can change the software or use pieces of it in new free 
+      programs; and that you know you can do these things.
+    </para>
+
+    <para>
+      To protect your rights, we need to make restrictions that forbid anyone 
+      to deny you these rights or to ask you to surrender the rights. These 
+      restrictions translate to certain responsibilities for you if you distribute 
+      copies of the software, or if you modify it.
+    </para>
+
+    <para>
+      For example, if you distribute copies of such a program, whether gratis or 
+      for a fee, you must give the recipients all the rights that you have. You 
+      must make sure that they, too, receive or can get the source code. And you 
+      must show them these terms so they know their rights.
+    </para>
+
+    <para>
+      We protect your rights with two steps:
+
+      <orderedlist numeration="arabic">
+	<listitem>
+	  <para>
+	    copyright the software, and
+	  </para>
+	</listitem>
+	<listitem>
+	  <para>
+	    offer you this license which gives you legal permission to copy, 
+	    distribute and/or modify the software.
+	  </para>
+	</listitem>
+      </orderedlist>
+    </para>
+
+    <para>
+      Also, for each author's protection and ours, we want to make certain that 
+      everyone understands that there is no warranty for this free software. If 
+      the software is modified by someone else and passed on, we want its 
+      recipients to know that what they have is not the original, so that any 
+      problems introduced by others will not reflect on the original authors' 
+      reputations.
+    </para>
+
+    <para>
+      Finally, any free program is threatened constantly by software patents. 
+      We wish to avoid the danger that redistributors of a free program will 
+      individually obtain patent licenses, in effect making the program 
+      proprietary. To prevent this, we have made it clear that any patent must be 
+      licensed for everyone's free use or not licensed at all.
+    </para>
+
+    <para>
+      The precise terms and conditions for copying, distribution and modification 
+      follow.
+    </para>
+
+  </sect1>
+
+  <sect1 id="gpl-terms">
+    <title>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</title>
+
+    <sect2 id="gpl-sect0">
+      <title>Section 0</title>
+      <para>
+	This License applies to any program or other work which contains a notice 
+	placed by the copyright holder saying it may be distributed under the terms 
+	of this General Public License. The "Program", below, refers to any such 
+	program or work, and a <quote>work based on the Program</quote> means either 
+	the Program or any derivative work under copyright law: that is to say, a 
+	work containing the Program or a portion of it, either verbatim or with 
+	modifications and/or translated into another language. (Hereinafter, translation 
+	is included without limitation in the term <quote>modification</quote>.) Each 
+	licensee is addressed as <quote>you</quote>.
+      </para>
+
+      <para>
+	Activities other than copying, distribution and modification are not covered by 
+	this License; they are outside its scope. The act of running the Program is not 
+	restricted, and the output from the Program is covered only if its contents 
+	constitute a work based on the Program (independent of having been made by running 
+	the Program). Whether that is true depends on what the Program does.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect1">
+      <title>Section 1</title>
+      <para>
+	You may copy and distribute verbatim copies of the Program's source code as you 
+	receive it, in any medium, provided that you conspicuously and appropriately 
+	publish on each copy an appropriate copyright notice and disclaimer of warranty; 
+	keep intact all the notices that refer to this License and to the absence of any 
+	warranty; and give any other recipients of the Program a copy of this License 
+	along with the Program.
+      </para>
+      
+      <para>
+	You may charge a fee for the physical act of transferring a copy, and you may at 
+	your option offer warranty protection in exchange for a fee.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect2">
+      <title>Section 2</title>
+      <para>
+	You may modify your copy or copies of the Program or any portion of it, thus 
+	forming a work based on the Program, and copy and distribute such modifications 
+	or work under the terms of <link linkend="gpl-sect1">Section 1</link> above, provided 
+	that you also meet all of these conditions:
+
+	<orderedlist numeration="loweralpha">
+	  <listitem>
+	    <para>
+	      You must cause the modified files to carry prominent notices stating that 
+	      you changed the files and the date of any change.
+	    </para>
+	  </listitem>
+	  <listitem>
+	    <para>
+	      You must cause any work that you distribute or publish, that in whole or 
+	      in part contains or is derived from the Program or any part thereof, to be 
+	      licensed as a whole at no charge to all third parties under the terms of 
+	      this License.
+	    </para>
+	  </listitem>
+	  <listitem>
+	    <para>
+	      If the modified program normally reads commands interactively when run, you 
+	      must cause it, when started running for such interactive use in the most 
+	      ordinary way, to print or display an announcement including an appropriate 
+	      copyright notice and a notice that there is no warranty (or else, saying 
+	      that you provide a warranty) and that users may redistribute the program 
+	      under these conditions, and telling the user how to view a copy of this 
+	      License. 
+
+	      <note>
+		<title>Exception:</title>
+		<para>
+		  If the Program itself is interactive but does not normally print such an 
+		  announcement, your work based on the Program is not required to print an 
+		  announcement.) 
+		</para>
+	      </note>
+
+	    </para>
+	  </listitem>
+	</orderedlist>
+      </para>
+
+      <para>
+	These requirements apply to the modified work as a whole. If identifiable sections 
+	of that work are not derived from the Program, and can be reasonably considered 
+	independent and separate works in themselves, then this License, and its terms, 
+	do not apply to those sections when you distribute them as separate works. But when 
+	you distribute the same sections as part of a whole which is a work based on the 
+	Program, the distribution of the whole must be on the terms of this License, whose 
+	permissions for other licensees extend to the entire whole, and thus to each and 
+	every part regardless of who wrote it.
+      </para>
+
+      <para>
+	Thus, it is not the intent of this section to claim rights or contest your rights 
+	to work written entirely by you; rather, the intent is to exercise the right to control 
+	the distribution of derivative or collective works based on the Program.
+      </para>
+
+      <para>
+	In addition, mere aggregation of another work not based on the Program with the Program 
+	(or with a work based on the Program) on a volume of a storage or distribution medium 
+	does not bring the other work under the scope of this License.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect3">
+      <title>Section 3</title>
+
+      <para>
+	You may copy and distribute the Program (or a work based on it, under 
+	<link linkend="gpl-sect2">Section 2</link> in object code or executable form under the terms of 
+	<link linkend="gpl-sect1">Sections 1</link> and <link linkend="gpl-sect2">2</link> above provided that 
+	you also do one of the following:
+
+	<orderedlist numeration="loweralpha">
+	  <listitem>
+	    <para>
+	      Accompany it with the complete corresponding machine-readable source code, which 
+	      must be distributed under the terms of Sections 1 and 2 above on a medium 
+	      customarily used for software interchange; or,
+	    </para>
+	  </listitem>
+	  <listitem>
+	    <para>
+	      Accompany it with a written offer, valid for at least three years, to give any 
+	      third party, for a charge no more than your cost of physically performing source 
+	      distribution, a complete machine-readable copy of the corresponding source code, 
+	      to be distributed under the terms of Sections 1 and 2 above on a medium customarily 
+	      used for software interchange; or,
+	    </para>
+	  </listitem>
+	  <listitem>
+	    <para>
+	      Accompany it with the information you received as to the offer to distribute 
+	      corresponding source code. (This alternative is allowed only for noncommercial 
+	      distribution and only if you received the program in object code or executable form 
+	      with such an offer, in accord with Subsection b above.)
+	    </para>
+	  </listitem>
+	</orderedlist>
+      </para>
+
+      <para>
+	The source code for a work means the preferred form of the work for making modifications 
+	to it. For an executable work, complete source code means all the source code for all modules 
+	it contains, plus any associated interface definition files, plus the scripts used to control 
+	compilation and installation of the executable. However, as a special exception, the source 
+	code distributed need not include anything that is normally distributed (in either source or 
+	binary form) with the major components (compiler, kernel, and so on) of the operating system 
+	on which the executable runs, unless that component itself accompanies the executable.
+      </para>
+      
+      <para>
+	If distribution of executable or object code is made by offering access to copy from a 
+	designated place, then offering equivalent access to copy the source code from the same place 
+	counts as distribution of the source code, even though third parties are not compelled to 
+	copy the source along with the object code.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect4">
+      <title>Section 4</title>
+      
+      <para>
+	You may not copy, modify, sublicense, or distribute the Program except as expressly provided 
+	under this License. Any attempt otherwise to copy, modify, sublicense or distribute the 
+	Program is void, and will automatically terminate your rights under this License. However, 
+	parties who have received copies, or rights, from you under this License will not have their 
+	licenses terminated so long as such parties remain in full compliance.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect5">
+      <title>Section 5</title>
+
+      <para>
+	You are not required to accept this License, since you have not signed it. However, nothing 
+	else grants you permission to modify or distribute the Program or its derivative works. 
+	These actions are prohibited by law if you do not accept this License. Therefore, by modifying 
+	or distributing the Program (or any work based on the Program), you indicate your acceptance 
+	of this License to do so, and all its terms and conditions for copying, distributing or 
+	modifying the Program or works based on it.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect6">
+      <title>Section 6</title>
+
+      <para>
+	Each time you redistribute the Program (or any work based on the Program), the recipient 
+	automatically receives a license from the original licensor to copy, distribute or modify 
+	the Program subject to these terms and conditions. You may not impose any further restrictions 
+	on the recipients' exercise of the rights granted herein. You are not responsible for enforcing 
+	compliance by third parties to this License.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect7">
+      <title>Section 7</title>
+
+      <para>
+	If, as a consequence of a court judgment or allegation of patent infringement or for any other 
+	reason (not limited to patent issues), conditions are imposed on you (whether by court order, 
+	agreement or otherwise) that contradict the conditions of this License, they do not excuse you 
+	from the conditions of this License. If you cannot distribute so as to satisfy simultaneously 
+	your obligations under this License and any other pertinent obligations, then as a consequence 
+	you may not distribute the Program at all. For example, if a patent license would not permit 
+	royalty-free redistribution of the Program by all those who receive copies directly or 
+	indirectly through you, then the only way you could satisfy both it and this License would be 
+	to refrain entirely from distribution of the Program.
+      </para>
+
+      <para>
+	If any portion of this section is held invalid or unenforceable under any particular circumstance, 
+	the balance of the section is intended to apply and the section as a whole is intended to apply 
+	in other circumstances.
+      </para>
+
+      <para>
+	It is not the purpose of this section to induce you to infringe any patents or other property 
+	right claims or to contest validity of any such claims; this section has the sole purpose of 
+	protecting the integrity of the free software distribution system, which is implemented by public 
+	license practices. Many people have made generous contributions to the wide range of software 
+	distributed through that system in reliance on consistent application of that system; it is up 
+	to the author/donor to decide if he or she is willing to distribute software through any other 
+	system and a licensee cannot impose that choice.
+      </para>
+
+      <para>
+	This section is intended to make thoroughly clear what is believed to be a consequence of the 
+	rest of this License.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect8">
+      <title>Section 8</title>
+
+      <para>
+	If the distribution and/or use of the Program is restricted in certain countries either by patents 
+	or by copyrighted interfaces, the original copyright holder who places the Program under this License 
+	may add an explicit geographical distribution limitation excluding those countries, so that 
+	distribution is permitted only in or among countries not thus excluded. In such case, this License 
+	incorporates the limitation as if written in the body of this License.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect9">
+      <title>Section 9</title>
+      
+      <para>
+	The Free Software Foundation may publish revised and/or new versions of the General Public License 
+	from time to time. Such new versions will be similar in spirit to the present version, but may differ 
+	in detail to address new problems or concerns.
+      </para>
+
+      <para>
+	Each version is given a distinguishing version number. If the Program specifies a version number of 
+	this License which applies to it and "any later version", you have the option of following the terms 
+	and conditions either of that version or of any later version published by the Free Software 
+	Foundation. If the Program does not specify a version number of this License, you may choose any 
+	version ever published by the Free Software Foundation.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect10">
+      <title>Section 10</title>
+
+      <para>
+	If you wish to incorporate parts of the Program into other free programs whose distribution 
+	conditions are different, write to the author to ask for permission. For software which is copyrighted 
+	by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions 
+	for this. Our decision will be guided by the two goals of preserving the free status of all 
+	derivatives of our free software and of promoting the sharing and reuse of software generally.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect11">
+      <title>NO WARRANTY</title>
+      <subtitle>Section 11</subtitle>
+
+      <para>
+	BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT 
+	PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 
+	OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, 
+	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+	PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 
+	PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+      </para>
+    </sect2>
+
+    <sect2 id="gpl-sect12">
+      <title>Section 12</title>
+
+      <para>
+	IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR 
+	ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU 
+	FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 
+	USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED 
+	INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH 
+	ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 
+	DAMAGES.
+      </para>
+    </sect2>
+  </sect1>
+</appendix>
+
Index: pykota/tags/1.22/docs/README
===================================================================
--- pykota/tags/1.22/docs/README (revision 2146)
+++ pykota/tags/1.22/docs/README (revision 2146)
@@ -0,0 +1,30 @@
+# $Id$
+
+PyKota - Print Quota for CUPS
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains PyKota documentation in DocBook format.
+
+Unless you've purchased an official PyKota package, you're on your 
+own to compile the DocBook source files to output formats like HTML 
+or PDF. 
+
+There are also some documents in OpenOffice.org format.
+
+====================================================================
Index: pykota/tags/1.22/docs/pkhint.sgml
===================================================================
--- pykota/tags/1.22/docs/pkhint.sgml (revision 2147)
+++ pykota/tags/1.22/docs/pkhint.sgml (revision 2147)
@@ -0,0 +1,50 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Detects the best settings for your printers with pkhint</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    <filename>pkhint</filename> is an experimental command designed with the goal to 
+    help you find the best <application>PyKota</application> settings for each of your
+    printers.
+  </para>  
+  
+  <para>
+    Currently <filename>pkhint</filename> only recognizes <application>CUPS</application>' <filename>printers.conf</filename>
+    file format, but <application>LPRng</application>' <filename>printcap</filename> file format support will be added
+    in the future.
+  </para>
+  
+  <para>
+    <filename>pkhint</filename> accepts optional printers names as its arguments, and reads your printing system's
+    printers configuration file from stdin. Then it launches different tests to see if your printers supports
+    some special features which would allow you to use either hardware or software accounting on them, with
+    a preference for hardware since it's more reliable. If it can help you, it will print some text which
+    you will be able to copy and paste into <filename>~pykota/pykota.conf</filename>.
+  </para>
+  
+  <warning>
+    <title>Warning</title>
+    <para>
+      Because <filename>pkhint</filename> is still a work in progress, don't expect it to allow you
+      to fully configure <application>PyKota</application> for you. You'll still have to double
+      check that your configuration is correct.
+    </para>
+  </warning>  
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>pkhint</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <arg choice="opt"><replaceable>printer1</replaceable></arg>
+        <arg choice="opt"><replaceable>printer2</replaceable></arg>
+        <arg choice="opt"><replaceable>...</replaceable></arg>
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/repykota.sgml
===================================================================
--- pykota/tags/1.22/docs/repykota.sgml (revision 2147)
+++ pykota/tags/1.22/docs/repykota.sgml (revision 2147)
@@ -0,0 +1,150 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title id="repykota">Create print quota usage reports with repykota</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    To account for print usage is good, however there must be a way to easily
+    query the <emphasis>Quota Storage Server</emphasis> and generate
+    reports describing current usage for every user on every printer.
+  </para>
+  
+  <sect1>
+    <title>Command line based Print Quota reports</title>
+    
+    <para>
+      PyKota features a quota report generator, named <command>repykota</command>,
+      with which you can print the current state of the quota database.
+    </para>
+    
+    <para>
+      <command>repykota</command> behaves differently when it is launched by a
+      <application>PyKota</application> administrator, compared to when it is launched by a normal user.
+    </para>  
+    
+    <para>
+      In the first case, the print quota report will contain current account balance, 
+      soft and hard limits, number of pages printed since last reset, total number
+      of pages printed, total paid, for possibly all users or all groups, depending
+      on command line options.
+    </para>
+    
+    <para>
+      In the second case, i.e. when <command>repykota</command> is launched by
+      a normal user, the user will only be allowed to see informations about himself or 
+      the groups he his a member of.
+    </para>
+  
+    <para>
+      Any user can limit the report to only one or more printers, by specifying the
+      <literal>-P</literal> or <literal>--printer</literal> command line option, 
+      followed by one or more printer name or wildcard. If more than one printer name
+      or wildcard is used, they must be separated by commas.
+    </para>
+    
+    <para>
+      Launching <command>repykota</command> with no arguments will generate
+      a complete print quota report, depending on what you are allowed to see.
+    </para>
+    
+    <para>
+      Use the <literal>--help</literal> command line argument to learn what are
+      the different command line options available.
+    </para>
+    
+    <sect2>
+      <title>Reference</title>
+      <para>
+        <cmdsynopsis>
+          <command>repykota</command>
+          <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+          <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+          <group choice="opt"><arg>-u</arg><arg>--users</arg></group>
+          <group choice="opt"><arg>-g</arg><arg>--groups</arg></group>
+          <group choice="opt">
+            <arg>-P <replaceable>printername</replaceable></arg>
+            <arg>--printer <replaceable>printername</replaceable></arg>
+          </group>  
+          <group choice="opt">
+            <arg><replaceable>name1</replaceable></arg>
+            <arg><replaceable>name2</replaceable></arg>
+            <arg><replaceable>...</replaceable></arg>
+            <arg><replaceable>nameN</replaceable></arg>
+          </group>  
+        </cmdsynopsis>
+      </para>
+    </sect2>
+  </sect1>
+  
+  <sect1>
+    <title>Web based Print Quota reports</title>
+    
+    <para>
+      <application>PyKota</application> also features a CGI script to remotely access
+      to print quota reports with a web browser, it is called <filename>printquota.cgi</filename>
+      and you can put it in your web server's <filename>cgi-bin</filename> directory if a web server is installed on
+      any machine on which <application>PyKota</application> is also installed and configured
+      correctly.
+    </para>
+    
+    <para>
+      You may also want to copy the <acronym>CSS</acronym> stylesheets which are present in the
+      <filename>stylesheets/</filename> directory to your web server's <literal>DocumentRoot</literal>
+      (e.g. <filename>/var/lib/www</filename>) so that the CGI script can find them to present
+      a nicer web interface.
+    </para>
+    
+    <para>
+      You can find <filename>printquota.cgi</filename> in the <filename>pykota/cgi-bin</filename>
+      directory. Here's how to install it, provided that your web server's <filename>cgi-bin</filename>
+      directory is <filename>/usr/lib/cgi-bin</filename> :
+<screen>      
+port50-2:/home/jerome/pykota$ cp cgi-bin/printquota.cgi /usr/lib/cgi-bin
+port50-2:/home/jerome/pykota$ chmod 755 /usr/lib/cgi-bin/printquota.cgi
+</screen>
+
+      <note>
+        <title>Note</title>
+        <para>
+          Please ensure that the user your web server is run as, for example <literal>www-data</literal> under
+          Debian, is allowed to read <filename>~pykota/pykota.conf</filename> but for security reasons you
+          must ensure that this user <emphasis>is not</emphasis> allowed to read <filename>~pykota/pykotadmin.conf</filename>
+        </para>
+      </note>  
+    </para>
+    
+    <para>
+      If you install the CGI script as described above, any user will be allowed to view the complete print
+      quota report, for all users, groups and printers. This is then a different behavior compared to when
+      a normal user wants a print quota report from the command line through <command>repykota</command>.
+      If you find this disturbing, then the best is to ask for user authentication whenever the <command>printquota.cgi</command>
+      CGI script is accessed. This CGI script will then automatically behave as expected, showing in the print quota
+      report only what the authenticated user is allowed to see, just like when he launches <command>repykota</command>
+      from the command line. As a special case, if the user authenticates using the <literal>root</literal> username,
+      then there's no restriction on what may appear on the print quota report.
+    </para>
+    
+    <para>
+      To automatically ask for an authentication dialog whenever the CGI script is accessed, you have to configure
+      your web server to do so. If your webserver is <ulink url="http://httpd.apache.org"><application>Apache</application></ulink>, then it's relatively easy. First you have to put 
+      <command>printquota.cgi</command> in its own subdirectory below your web server's <filename>cgi-bin</filename>
+      directory, for example in <filename>cgi-bin/PyKota/</filename>. Then use the <command>htpasswd</command>
+      command line tool to create a file which contains usernames and passwords for all your users allowed to see
+      the print quota report from a web browser, and put this file outside of the directories served by <application>Apache</application>
+      so that nobody could retrieve it. Finally create a file named <filename>.htaccess</filename> in
+      <filename>cgi-bin/PyKota/</filename> with appropriate content in it. This file should tell <application>Apache</application> to automatically ask
+      for an authentication whenever something from this directory is accessed, and to use the password file previously
+      created to match usernames and passwords.
+      You may also have to tweak <application>Apache</application>'s default configuration to allow the
+      authentication mechanism.
+    </para>
+    
+    <para>
+      The detailed procedure to do all this is out of the scope of the present document, please refer to
+      <application>Apache</application>'s <ulink url="http://httpd.apache.org/docs-project/">documentation</ulink> 
+      for all the gory details.
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/warnpykota.sgml
===================================================================
--- pykota/tags/1.22/docs/warnpykota.sgml (revision 2147)
+++ pykota/tags/1.22/docs/warnpykota.sgml (revision 2147)
@@ -0,0 +1,74 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Warn users above print quota with warnpykota</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    Whenever a user tries to print a document, if he is over his print quota,
+    then the job is refused. Depending on <application>PyKota</application>'s
+    configuration, especially the <literal>mailto</literal> option, he and/or
+    the administrator may eventually receive an email message which explains
+    the situation and invites him to solve the problem before being allowed
+    to print again.
+  </para>
+  
+  <para>
+    However this may not be sufficient, and you may want to warn users who
+    have reached their print quota at
+    regular intervals, like every day, for example from a <application>cron</application> job.
+  </para>
+  
+  <para>
+    This may be useful if the user has reached his print quota, and have received an email message telling him so,
+    but then he doesn't print for some days and may forget to fix the problem, by buying more
+    paper for example.
+  </para>
+  
+  <para>
+    The <command>warnpykota</command> command was written with this in mind. 
+    If you put this command in your <filename>crontab</filename>, launching it for example
+    every day, then you'll be sure that all your users who are above their print quota
+    will not forget it ! Of course they may delete the messages without having read them,
+    but at least they won't be able to say that they didn't receive them ;-)
+  </para>
+  
+  <para>
+    When an user who is not a <application>PyKota</application> administrator launches this command, only him can receive a warning
+    message. He can specify a printer name's filter to check his quota only
+    on specific printers. If a normal user uses the <literal>--groups</literal> command line
+    argument, then for each group he is a member of in the Quota Storage, each
+    group member may receive a warning message. You can take care of this if this
+    becomes annoying by forbidding normal users to launch the <command>warnpykota</command>
+    command.
+  </para>
+  
+  <para>
+    <application>PyKota</application> administrators can pass additionnal user or group names 
+    (or wildcard filters) to only check the users or groups whose name matches.
+  </para>  
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>warnpykota</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <group choice="opt"><arg>-u</arg><arg>--users</arg></group>
+        <group choice="opt"><arg>-g</arg><arg>--groups</arg></group>
+        <group choice="opt">
+          <arg>-P <replaceable>printername</replaceable></arg>
+          <arg>--printer <replaceable>printername</replaceable></arg>
+        </group>  
+        <group choice="opt">
+          <arg><replaceable>name1</replaceable></arg>
+          <arg><replaceable>name2</replaceable></arg>
+          <arg><replaceable>...</replaceable></arg>
+          <arg><replaceable>nameN</replaceable></arg>
+        </group>  
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/autopykota.sgml
===================================================================
--- pykota/tags/1.22/docs/autopykota.sgml (revision 2147)
+++ pykota/tags/1.22/docs/autopykota.sgml (revision 2147)
@@ -0,0 +1,48 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Automate user account creation with autopykota</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    If you want to automate the users account and quota entries creation on first print,
+    you can do this easily with the <literal>policy: external( your command here )</literal>
+    directive in <filename>pykota.conf</filename>.
+    You just have to put your command of choice there.
+  </para>
+  
+  <para>
+    <command>autopykota</command> was designed to automatically set
+    an initial account balance value to newly added users, while taking
+    care of not resetting the balance value if the user already exists 
+    but doesn't have a quota entry on the current printer. 
+  </para>
+  
+  <para>
+    If you want to limit your users by page quota then you must not use
+    this command. Just use some form of the <command>edpykota</command>
+    command and it will work just fine. On the other hand, if you want
+    to limit your users by their account balance, this command was
+    made to ease your life : you don't have to design a complex shell
+    script to check if user already exists or have a quota entry on
+    the current printer before deciding if you have to set the initial
+    balance value or not : <command>autopykota</command> takes
+    care of all this automagically.
+  </para>
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>autopykota</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <group choice="opt">
+          <arg>-i <replaceable>value</replaceable></arg>
+          <arg>--initbalance <replaceable>value</replaceable></arg>
+        </group>
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/pkprinters.sgml
===================================================================
--- pykota/tags/1.22/docs/pkprinters.sgml (revision 2235)
+++ pykota/tags/1.22/docs/pkprinters.sgml (revision 2235)
@@ -0,0 +1,100 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Manage printers with pkprinters</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    <filename>pkprinters</filename> is the preferred tool to manage printers in <application>PyKota</application>.  
+    It only manages printers, and do it well. With it you can add or delete printers or printer groups, or modify
+    existing printers or printers groups. This is also the tool to use to put printers into one or more printers groups.
+  </para>  
+  
+  <para>
+    The very first thing you have to do once <application>PyKota</application> is installed but before it can work, 
+    is to add into <application>PyKota</application>'s database an entry for each of the print queues on
+    which you want to have print quota or accounting.
+  </para>
+  
+  <para>
+    Let's say your printing system has several print queues defined : <literal>HP2100</literal>, <literal>TekTro</literal>,
+    and <literal>StylusColor1</literal> and <literal>StylusColor2</literal>. You want to charge 5 cents per page on each of this print queues.
+    You just have to type :
+<screen>    
+$ pkprinters --add --charge 0.05 HP2100 TekTro StylusColor1 StylusColor2
+</screen>
+    <warning><title>Warning</title>
+      <para>Printers' names in PyKota are case-sensitive, so be careful to use the exact names
+            exposed by your printing system.
+      </para>
+    </warning>
+  </para>
+  
+  <para>
+    After some minutes, you think that you should charge more on the <literal>StylusColor1</literal> 
+    and <literal>StylusColor2</literal> because they can do color. 
+    You also want to enter a description for these printers, because you have several
+    of them :
+<screen>    
+$ pkprinters --charge 0.25 "StylusColor*"
+$ pkprinters --description "Stylus Color 900 First floor" StylusColor1
+$ pkprinters --description "Stylus Color 900 Second floor" StylusColor2
+</screen>
+  </para>
+  
+  <para>
+    You can now verify what you did :
+<screen>    
+$ pkprinters --list
+HP2100 [] (0.0 + #*0.05)
+TekTro [] (0.0 + #*0.05)
+StylusColor1 [Stylus Color 900 First floor] (0.0 + #*0.25)
+StylusColor2 [Stylus Color 900 Second floor] (0.0 + #*0.25)
+</screen>
+  </para>
+  
+  <para>
+    The command above has listed all print queues present in <application>PyKota</application>'s database,
+    along with their optional description and their base cost formula. 
+    The cost formula includes the price per job, <literal>0.0</literal> in our examples,
+    and the price per page (<literal>#</literal> representing the number of pages).
+  </para>
+  
+  <para>
+    If you defined printers groups, then the total cost is computed as the recursive
+    sum of the printing cost on the current printer plus all the printers groups it
+    is a member of. In addition, each user can have an overcharging (or undercharging)
+    factor, by which the total printing cost will be multiplied to determine the real
+    cost of printing on a particular printer for a particular user.
+  </para>
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>pkprinters</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <group choice="opt"><arg>-a</arg><arg>--add</arg></group>
+        <group choice="opt"><arg>-d</arg><arg>--delete</arg></group>
+        <group choice="opt">
+          <arg>-D <replaceable>desc</replaceable></arg>
+          <arg>--description <replaceable>desc</replaceable></arg>
+        </group>
+        <group choice="opt"><arg>-r</arg><arg>--remove</arg></group>
+        <group choice="opt">
+          <arg>-c <replaceable>p</replaceable>,<replaceable>j</replaceable></arg>
+          <arg>--charge <replaceable>p</replaceable>,<replaceable>j</replaceable></arg>
+        </group>  
+        <group choice="opt">
+          <arg>-g <replaceable>pgroup1</replaceable>,<replaceable>pgroup2</replaceable>,<replaceable>...</replaceable></arg>
+          <arg>--groups <replaceable>pgroup1</replaceable>,<replaceable>pgroup2</replaceable>,<replaceable>...</replaceable></arg>
+        </group>  
+        <group choice="opt"><arg>-l</arg><arg>--list</arg></group>
+        <group choice="opt"><arg>-r</arg><arg>--remove</arg></group>
+        <group choice="opt"><arg>-s</arg><arg>--skipexisting</arg></group>
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/installation.sgml
===================================================================
--- pykota/tags/1.22/docs/installation.sgml (revision 2231)
+++ pykota/tags/1.22/docs/installation.sgml (revision 2231)
@@ -0,0 +1,847 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title id="installation">Installation</title>
+  
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    Before being able to use <application>PyKota</application>, you have of course to
+    install it first. But before installing, you must carefully plan your installation.
+  </para>
+  
+  <para>
+    First you have to determine which machine will be the <application>PyKota</application>
+    <firstterm>Storage Server</firstterm>. The Storage Server is the host responsible
+    for keeping a centralized database of print usage for all your printers, users and groups.
+  </para>
+  
+  <para>
+    Then you have to list all the <firstterm>Print Servers</firstterm> for which
+    you plan to use <firstterm>print quota</firstterm> facilities.
+  </para>
+  
+  <para>
+    Finally you have to download <application>PyKota</application>'s latest version
+    or buy an official package, from 
+    <ulink url="http://www.librelogiciel.com/software/">http://www.librelogiciel.com/software/</ulink>.
+    If you've just bought an official package, then as soon as you've receive it you
+    have to decompress and visit its archive, to do so just type the following commands :
+    <screen>
+jerome@nordine:~$ tar -zxf pykota-1.22_official.tar.gz    
+jerome@nordine:~$ cd pykota-1.22_official
+jerome@nordine:~/pykota-1.22_official$
+    </screen>
+  </para>
+  
+  <para>
+    You can see many files in this directory, the first ones to read are <filename>README</filename>,
+    then <filename>COPYING</filename> and <filename>LICENSE</filename>. They will give you
+    basic installation instructions and explain the licensing terms under which 
+    <application>PyKota</application> is distributed. Of course they are also mostly
+    boring to read ! Detailed installation and operating instructions are defined
+    in the <filename>./docs</filename> directory, in the form of <acronym>SGML</acronym>
+    documentation in the <ulink url="http://www.docbook.org">DocBook</ulink> format.
+    You have to compile these files into readable documentation like the <acronym>HTML</acronym>
+    or <acronym>PDF</acronym> formats, or buy an official <application>PyKota</application> package
+    which already contains these compiled forms of the documentation. Of course you already
+    know this because that's what you are currently reading !
+  </para>
+  
+  <para>
+    Now we will see what has to be done on each of the servers we are planning to use.
+    <note>
+      <title>Note</title>
+      <para>
+        Of course, depending on the size of your network, you may very well
+        use the same machine as both a Print Server and a Storage Server.
+        This is especially the case if you've got only one server.
+      </para>
+    </note>  
+  </para>
+  
+  <sect1>
+    <title>Storage Server Installation</title>
+    
+    <para>
+      Depending on <application>PyKota</application>'s version number, different
+      types of storage backends may be supported, so we will see for each one of
+      them how to configure it.
+    </para>
+    
+    <sect2>
+      <title>PostgreSQL</title>
+      
+      <para>
+        <application>PostgreSQL</application> is an <firstterm>Object Relationnal DataBase
+        Management System</firstterm> distributed under a <firstterm>Free Software</firstterm>
+        license from the 
+        <ulink url="http://www.postgresql.org">http://www.postgresql.org</ulink>
+        web site. It certainely is the free <acronym>RDBMS</acronym> which has the most advanced
+        features, and is widely used all over the world.
+      </para>
+      
+      <para>
+        To configure your Storage Server, you must have PostgreSQL already working.
+        The complete installation of <application>PostgreSQL</application> is not covered by
+        the present manual, please refer to your system's documentation or to 
+        <ulink url="http://www.postgresql.org">http://www.postgresql.org</ulink> for
+        details.
+      </para>
+      
+      <para>
+        One thing you have to check, though, is that every Print Server on which you
+        want to install the print quota mechanism, must be able to connect to the
+        <application>PostgreSQL</application> server. In the default installation of
+        <application>PostgreSQL</application> this may not be the case for security reasons, except if both
+        servers are in fact the same machine. In any case, it is recommended that you
+        check the <filename>/etc/postgresql/pg_hba.conf</filename> file and modify it if
+        needed. This file is self documented and its modification is straightforward.
+        You also have to make sure that <application>PostgreSQL</application> accepts <acronym>TCP/IP</acronym> connections.
+        To do so you either have to launch it with the <option>-i</option> option or
+        modify the <filename>/etc/postgresql/postgresql.conf</filename> file, which is
+        self documented and easy to modify too. Allowing <acronym>TCP/IP</acronym> connections
+        is not necessary though if your Quota Storage Server and your Print Server are
+        the very same host.
+      </para>  
+      
+      <para>
+        Here's an excerpt from a <filename>pg_hba.conf</filename> file. This one rejects all
+        connections to PyKota's database excepted when made from the same host by <application>PostgreSQL</application> users
+        <literal>pykotauser</literal> or <literal>pykotaadmin</literal> with the correct password.
+<screen>        
+        local all    postgres                              ident sameuser
+        local all    all                                   reject
+        host  pykota pykotauser  127.0.0.1 255.255.255.255 crypt
+        host  pykota pykotaadmin 127.0.0.1 255.255.255.255 crypt
+        host  pykota all         127.0.0.1 255.255.255.255 reject
+</screen>
+     </para>
+     
+     <para>
+        Of course if your print server and your database servers have different <acronym>IP</acronym>
+        addresses, you have to replace the <literal>127.0.0.1</literal> address above with your print
+        server's <acronym>IP</acronym> address. As an alternative, you could still keep these
+        lines and add similar lines with other <acronym>IP</acronym> addresses if you have several
+        print servers for which you want a single centralized database.
+        <tip>
+          <title>Tip</title>
+          <para>
+            Don't forget to restart <application>PostgreSQL</application> if you modify
+            any of its configuration files, in order for the changes to take effect.
+          </para>
+        </tip>  
+      </para>
+      
+      <para>
+        Be careful, you may be unable to connect from a Print Server to the <application>PostgreSQL</application>
+        server even if the configuration is correct. Sometimes your connections may be blocked by
+        one or more network firewalls along the route from one machine to the other. If this
+        is the case, then the best thing you can do is to ask your <firstterm>Network Administrator</firstterm>
+        to not filter the IP port used by <application>PostgreSQL</application>, which is
+        usually port <literal>5432/tcp</literal>.
+        <note>
+          <title>Note</title>
+          <para>
+            The TCP/IP network port used by PostgreSQL may be different. When in doubt, ask your 
+            <firstterm>System Administrator</firstterm> for the correct value. 
+          </para>
+        </note>  
+      </para>
+      
+      <para>
+        Now that your <application>PostgreSQL</application> server is up and running, and
+        is waiting for your connections, you have to create the Quota Storage DataBase.
+        To do so, you'll have to feed <application>PostgreSQL</application> with the
+        <filename>pykota-1.22/initscripts/postgresql/pykota-postgresql.sql</filename> file.
+        This file will create a Quota DataBase administrator in the <application>PostgreSQL</application> system, then create an empty
+        Quota DataBase and set some permissions on it. The Quota DataBase administrator
+        is the <application>PostgreSQL</application>'s user used to manage the Quota database.
+        The Quota DataBase Administrator is not present in the Quota Database
+        itself, he is only defined in <application>PostgreSQL</application> and don't
+        have to exist on any system, nor in the Quota DataBase. His default name
+        is <literal>pykotaadmin</literal>. 
+        A Quota Storage read-only user is also created under the name of <literal>pykotauser</literal>.
+        This read-only user is used by <application>PyKota</application> to connect to the 
+        Quota Storage when an user who is not a <application>PyKota</application> administrator 
+        <footnote><para>a <application>PyKota</application> administrator is an user who can read the <filename>~pykota/pykotadmin.conf</filename> file.</para></footnote>
+        launches a pykota command. This prevents normal
+        users from being able to modify their own, or other users', quota information.
+        The database which will be created will be named <literal>pykota</literal> by default.
+        <note>
+          <title>Note</title>
+          <para>
+            You can choose other names if you want, just modify the 
+            <filename>initscripts/postgresql/pykota-postgresql.sql</filename> file
+            accordingly, and report your changes into <application>PyKota</application>'s
+            configuration files.
+          </para>
+        </note>  
+      </para>
+      
+      <para>
+        To run this script, you can use the <command>psql</command> frontend to
+        <application>PostgreSQL</application>, but your priviledges must be sufficient
+        to be allowed to create users and databases. You can launch <command>psql</command>
+        as the <literal>postgres</literal> user which is <application>PostgreSQL</application>'s
+        default administrator, and connect to the default database named <literal>template1</literal>.
+        From a command line interpreter (i.e. shell), type the following commands :
+        <screen>
+jerome@nordine:~$ cd pykota-1.22_official/initscripts/postgresql
+jerome@nordine:~/pykota-1.22_official/initscripts$ psql -h localhost -U postgres template1
+Welcome to psql, the PostgreSQL interactive terminal.
+
+Type:  \copyright for distribution terms
+       \h for help with SQL commands
+       \? for help on internal slash commands
+       \g or terminate with semicolon to execute query
+       \q to quit
+
+template1=# \i pykota-postgresql.sql 
+            ... a lot of output lines
+pykota=#       
+        </screen>
+        <note>
+          <title>Note</title>
+          <para>
+            If you use RPM or DEB packages, usually the
+            <filename>pykota-postgresql.sql</filename> file gets installed into the
+            <filename>/usr/share/pykota/postgresql</filename> directory, along 
+            with a README file.
+          </para>
+        </note>  
+      </para>
+      
+      <para>
+        For security reasons, you may want to set passwords in 
+        <application>PostgreSQL</application> for the 
+        <literal>pykotaadmin</literal> and <literal>pykotauser</literal> users.
+        Otherwise any user able to connect to 
+        <application>PostgreSQL</application> on your Quota Storage Server 
+        could connect to the quota database, and either see it, or even modify it without problem. 
+      </para>
+      
+      <para>
+        To do so, just type the following lines while still being at the <command>psql</command>
+        prompt (replace the password values by your own, and do the same for the <literal>pykotauser</literal> user) :
+        <screen>
+pykota=# ALTER USER pykotaadmin PASSWORD 'somepassword';
+ALTER USER
+pykota=# \q
+jerome@nordine:~/pykota-1.22_official/initscripts/postgresql$
+        </screen>
+      </para>
+      
+      <para>
+        The <literal>\q</literal> command above will quit the <command>psql</command>
+        program and return you to the shell's command line prompt.
+      </para>
+      
+      <para>
+        To improve security further, you could encrypt your database connections, or
+        take any other step as needed. Please refer to <application>PostgreSQL</application>'s
+        documentation for details. 
+        <warning>
+          <title>Warning</title>
+          <para>
+            Defining passwords may not be sufficient if your database access rule is
+            set to <literal>trust</literal> in the <filename>/etc/postgresql/pg_hba.conf</filename>.
+            Again, please refer to <application>PostgreSQL</application>'s documentation
+            for details. Also, passwords will fly unencrypted over the network by default,
+            so be sure to take any necessary step to secure your database server from
+            unauthorized use. This has nothing to do with <application>PyKota</application>
+            though, it is just a general rule to keep in mind.
+          </para>
+        </warning>  
+      </para>
+      
+      <para>
+        If no error occured, then your Quota DataBase is ready to be used.
+        Now you can let the Quota Storage Server alone, the remaining work
+        will have to be done on each one of the print servers which will
+        use this particular Quota Storage Server.
+        <tip>
+          <title>Tip</title>
+          <para>
+            If an error occured, maybe your PostgreSQL version is too old, or
+            an unexpected problem (like a bug) happened. Please contact us via email so that we
+            can try to fix the problem. Thanks in advance.
+          </para>
+        </tip>  
+      </para>
+      
+    </sect2>  
+    
+    <sect2>
+      <title>LDAP</title>
+      
+      <para>
+        Any <acronym>LDAP</acronym> server, and particularly <application>OpenLDAP</application>, can be used 
+        as a Quota Storage Backend.
+        Some other LDAP servers can be used, but this is currently untested in production.
+      </para>
+      
+      <para>
+        <application>OpenLDAP</application> is a Lightweight Directory Access Protocol server
+        implementation published as Free Software.
+        You can download it from <ulink url="http://www.openldap.org">http://www.openldap.org</ulink>.
+      </para>
+      
+      <para>
+        To use <application>OpenLDAP</application> as your Quota Storage Backend, you have to copy the
+        <filename>pykota/initscripts/ldap/pykota.schema</filename> into <application>OpenLDAP</application>'s 
+        schemas directory.
+        Under Debian GNU/Linux, this is something like :
+        <screen>        
+$ cp pykota.schema /etc/ldap/schema
+        </screen>
+        <note>
+          <title>Note</title>
+          <para>
+            If you use RPM or DEB packages, the
+            <filename>pykota.schema</filename> file is usually installed into the
+            <filename>/usr/share/pykota/ldap</filename> directory, along
+            with a README file, and may also be installed automatically in
+            your <acronym>LDAP</acronym> server's schemas directory.
+          </para>
+        </note>  
+     </para>
+     <para>   
+       Then edit <filename>/etc/ldap/slapd.conf</filename> and add a line to    
+       include the PyKota schema. You should have something
+       like :
+       <screen>    
+# Schema and objectClass definitions
+include         /etc/ldap/schema/core.schema
+include         /etc/ldap/schema/cosine.schema
+include         /etc/ldap/schema/nis.schema
+include         /etc/ldap/schema/inetorgperson.schema
+include         /etc/ldap/schema/pykota.schema
+        </screen>        
+      </para>
+      
+      <para>
+        While this is not mandatory, it is recommended that you setup
+        some indexes for some often accessed PyKota attributes.
+        Here are the minimal indexes
+        lines you may want to put in <filename>slapd.conf</filename> :
+        <screen>
+# Indexes for PyKota
+index pykotaUserName pres,eq,sub
+index pykotaGroupName pres,eq,sub
+index pykotaPrinterName pres,eq,sub
+index pykotaLastJobIdent eq
+        </screen>
+      </para>
+      
+      <para>
+        Now you must ensure that the DNs you'll use to bind to    
+        your OpenLDAP server don't have search queries size limits,
+        which gives for example (OpenLDAP 2.1.x or above) :
+        
+<screen>        
+# No Limits for PyKota's administrator and read-only user
+limits dn="cn=RWadmin,dc=example,dc=com" size.soft=-1 size.hard=soft
+limits dn="cn=ROadmin,dc=example,dc=com" size.soft=-1 size.hard=soft
+</screen>        
+
+        Where RWadmin and ROadmin are the usernames used to bind to your
+        OpenLDAP server within PyKota, respectively in ReadWrite mode 
+        (as set in pykotadmin.conf) and in ReadOnly mode (as set in pykota.conf).
+      </para>
+      
+      <para>
+        Finally, restart the <application>OpenLDAP</application> server :    
+        <screen>    
+$ /etc/init.d/slapd restart
+        </screen>
+      </para>
+      
+      <para>
+        With an <acronym>LDAP</acronym> backend, PyKota will need some branches
+        in your <acronym>LDAP</acronym> directory to put its own datas.
+        You can configure PyKota to either attach its datas to your existing
+        users and groups, or to put them in their own <literal>ou</literal>.
+        But some <literal>ou</literal>s dedicated to PyKota are needed in any case,
+        so the best bet may be to put all PyKota's datas below an <literal>ou=PyKota</literal>
+        branch. While this will separate these datas from your existing users and groups
+        entries, this may ease the maintainance.
+      </para>
+      
+      <para>
+        PyKota needs at least an <literal>ou</literal> for printers, for users quotas, for
+        groups quotas, for print jobs, and for pointers to the last job of each printer.
+        In the future, this last <literal>ou</literal> may disappear as its content
+        will probably be attached to each printer.
+      </para>
+      
+      <para>
+        Actually PyKota doesn't create these <literal>ou</literal>s for you, because it's
+        difficult to guess what is the best configuration for you. So you have to
+        create them by yourself, either directly with a text editor and the
+        <command>ldapadd</command> command, or with some specialized tool
+        like <command>gq</command>. You can look at the <filename>initscripts/ldap/pykota-sample.ldif</filename>
+        file to see which minimal branches are necessary.
+        <note>
+          <title>Note</title>
+          <para>
+            If you use RPM or DEB packages, usually the
+            <filename>pykota-sample.ldif</filename> file is installed into the
+            <filename>/usr/share/pykota/ldap</filename> directory, along 
+            with a README file.
+          </para>
+        </note>  
+      </para>
+      
+      <para>
+        If no error occured, then your Quota DataBase is ready to be used.
+        Now you can let the Quota Storage Server alone, the remaining work
+        will have to be done on each one of the print servers which will
+        use this particular Quota Storage Server.
+        <tip>
+          <title>Tip</title>
+          <para>
+            If an error occured, maybe your OpenLDAP version is too old, or
+            an unexpected problem (like a bug) happened. Please contact us via email so that we
+            can try to fix the problem. Thanks in advance.
+          </para>
+        </tip>  
+      </para>
+    </sect2>  
+    
+    <sect2>
+      <title>MySQL</title>
+      
+      <para>
+        A <application>MySQL</application> Storage Backend is planned, but it actually
+        doesn't exist.
+      </para>
+    </sect2>  
+    
+    <sect2>
+      <title>Berkeley DB</title>
+      
+      <para>
+        A <application>Berkeley DB</application> Storage Backend is planned, but it actually
+        doesn't exist. It seems that remote storage won't be possible with such a backend,
+        so in other terms this means that you will have a different quota database on
+        each print server. This may still prove to be useful for small configurations.
+      </para>
+    </sect2>  
+  </sect1>  
+  
+  <sect1>
+    <title>Print Server Installation</title>
+    
+    <para>
+      For each Print Server on which you plan to implement the print quota
+      mechanism, you have, of course, to have an already working printing environment. 
+      Currently <application>PyKota</application> works with either 
+      <ulink url="http://www.cups.org"><application>CUPS</application></ulink>
+      or <ulink url="http://lprng.sourceforge.net"><application>LPRng</application></ulink>,
+      but more printing systems may be added in the future.
+    </para>
+    
+    <para>
+      Here's the list of software you have to install on each Print Server, version numbers
+      are given as an indication of which was successfully tested, but older versions may 
+      work too.
+      <itemizedlist>
+        <listitem>
+          <para>
+            <application>CUPS</application> version 1.1.14 or above, or <application>LPRng</application>
+            version 3.8.27 or above (it probably works with older versions but this is untested).
+            You can download them from <ulink url="http://www.cups.org">http://www.cups.org</ulink>
+            or <ulink url="http://lprng.sourceforge.net">http://lprng.sourceforge.net</ulink>
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            <application>Python</application> version 2.1 or above.
+            You can download it from <ulink url="http://www.python.org">http://www.python.org</ulink>.
+            While <application>PyKota</application> itself will try to preserve compatibility
+            with <application>Python</application> version 2.1 for the near future, some <application>Python</application>
+            modules which are needed by <application>PyKota</application> may mandate the use of a more recent version
+            of this language.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            Quota Storage client libraries, depending on your Quota Storage Backend :
+            <itemizedlist>
+              <listitem>
+                <para>
+                  PostgreSQL backend :
+                  <itemizedlist>
+                    <listitem>
+                      <para>
+                        <application>PostgreSQL</application> client libraries. They must match the <application>PostgreSQL</application>
+                        version used on your Quota Storage Server.
+                      </para>
+                    </listitem>  
+                    <listitem>
+                      <para>
+                        The <application>PygreSQL</application> python module. 
+                        It must have been compiled against the same
+                        <application>PostgreSQL</application> client libraries.
+                        <application>PygreSQL</application> is normally included in
+                        <application>PostgreSQL</application>, but you may want to
+                        download it from <ulink url="http://www.pygresql.org">http://www.pygresql.org</ulink>
+                      </para>
+                    </listitem>  
+                  </itemizedlist>  
+                </para>
+              </listitem>  
+              <listitem>
+                <para>
+                  OpenLDAP backend : 
+                  <itemizedlist>
+                    <listitem>
+                      <para>
+                        <application>OpenLDAP</application> client libraries. They must match
+                        the <application>OpenLDAP</application> version used on your Quota Storage Server.
+                      </para>
+                    </listitem>  
+                    <listitem>
+                      <para>
+                        The <application>Python-LDAP</application> python module.
+                        It must have been compiled against the same
+                        <application>OpenLDAP</application> client libraries.
+                        You may download this module from <ulink url="http://python-ldap.sourceforge.net">http://python-ldap.sourceforge.net</ulink>
+                      </para>
+                    </listitem>  
+                  </itemizedlist>
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  MySQL backend : TODO
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  Berkeley DB backend : TODO
+                </para>
+              </listitem>
+            </itemizedlist>  
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            <application>ucd-snmp</application> or <application>net-snmp</application> tools, version 4.2.5 or above. You only need
+            the <command>snmpget</command> command.
+            You can download this software from <ulink url="http://www.sourceforge.net/projects/net-snmp/">http://www.sourceforge.net/projects/net-snmp/</ulink>.
+            You only need this if you plan to query your printers for their internal page counter via SNMP.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            <application>netatalk</application> version 1.6.1 or above. You only need
+            the <command>pap</command> command.
+            You can download this software from <ulink url="http://netatalk.sourceforge.net/">http://netatalk.sourceforge.net/</ulink>.
+            You only need this if you plan to query your printers for their internal page counter via AppleTalk.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            eGenix' mxDateTime Python module version 2.0.3 or above. It must match your default Python version.
+            You can download it from <ulink url="http://www.egenix.com">http://www.egenix.com</ulink>.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            The Python acccelerator <application>Psyco</application>. It must match your default Python version.
+            You can download it from <ulink url="http://psyco.sourceforge.net">http://psyco.sourceforge.net</ulink>.
+            You only need this if you run on the <literal>x86</literal> architecture because 
+            <application>Psyco</application> doesn't yet exist on other architectures.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            The <application>pysnmp</application> Python module version 3.4.2 or 3.4.3 exclusively. 
+            You can download it from <ulink url="http://pysnmp.sourceforge.net">http://pysnmp.sourceforge.net</ulink>.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            The <application>JAXML</application> Python module. 
+            You can download it from <ulink url="http://www.librelogiciel.com/software/">http://www.librelogiciel.com/software/</ulink>.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            The <application>ReportLab</application> Toolkit Python module. 
+            You can download it from <ulink url="http://www.reportlab.org">http://www.reportlab.org</ulink>.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            The <application>Python Imaging Library - PIL</application> module. 
+            You can download it from <ulink url="http://www.pythonware.com">http://www.pythonware.com</ulink>.
+          </para>
+        </listitem>  
+        <listitem>
+          <para>
+            The <application>PyOSD</application> Python module. 
+            You can download it from <ulink url="http://repose.cx/pyosd/">http://repose.cx/pyosd/</ulink>.
+          </para>
+        </listitem>  
+      </itemizedlist>  
+    </para>
+    
+    <para>
+      Instead of downloading all these programs' sources and compiling them, which really
+      is a boring task considering that many software are needed, you may prefer to look
+      into the packages included with your GNU/Linux distribution of choice (if you use
+      this operating system of course). Most, if not all, GNU/Linux distributions include
+      all the software mentionned above, in the form of packages which are easier to
+      install than sources tarballs. This is probably the same for the many *BSD
+      distributions.
+    </para>
+    
+    <para>
+       You can check that all needed software is installed by launching the <filename>checkdeps.py</filename>
+       command :
+      <screen>      
+$ python checkdeps.py      
+      </screen>
+    </para>
+    
+    <para>
+      Once all these software are installed, installing PyKota itself is a breeze.
+      PyKota being written entirely in the Python language, which is interpreted, 
+      there's no need to compile anything. You just have to execute the installation
+      script :
+      <screen>      
+$ python setup.py install      
+      </screen>
+    </para>
+    
+    <para>
+      The setup script will automatically create the 
+      <filename>/usr/share/pykota/conf</filename> directory and put the sample 
+      configuration files <filename>conf/pykota.conf.sample</filename> and
+      <filename>conf/pykotadmin.conf.sample</filename> there, along with
+      a <filename>README</filename> file explaining their purpose.
+    </para>
+    
+    <para>
+      Now you have to create a <literal>pykota</literal> system user and group. The <application>PyKota</application>
+      software will automatically search its configuration files in user <literal>pykota</literal>'s
+      home directory. For example we could create the user and group, and set <filename>/etc/pykota</filename>
+      as the home directory, but any other home directory will do :
+<screen>      
+    adduser --system --group --home /etc/pykota --gecos PyKota pykota
+</screen>
+    </para>
+    
+    <para>
+      You now have to copy the sample configuration files into the <filename>~pykota</filename>
+      directory, under the respective names <filename>pykota.conf</filename> and 
+      <filename>pykotadmin.conf</filename>. Once copied there, you just
+      have to modify these files to adapt them to your own setup.
+      These files are heavily commented, so you should have no problem.
+      Also their format is quite common, because it's the one used by
+      <application>Samba</application> for example, or by <literal>.ini</literal>
+      files under <application>MS-Windows</application>, so you may already
+      be familiar with this syntax.
+      In a future release, this documentation will include the complete
+      reference for all configuration fields available. Keep in mind that
+      <application>PyKota</application> can be really heavily customized, and can delegate some work
+      to any external command of your choice.
+    </para>
+    
+    <para>
+      Please create a backup copy of the <filename>~pykota</filename>
+      directory before modifying a working installation.
+    </para>
+    
+    <para>
+      PyKota features some interesting possibilities which allow you to
+      define options either globally so that they apply to all printers,
+      or on a per printer basis. Please see the sample configuration files
+      to see what I mean. In the simplest form, only a <literal>[global]</literal> section is
+      needed. In more complex configurations, you will have to create 
+      one section per printer. Each section in the configuration files
+      begins with a name between square brackets <literal>[]</literal>.
+      The name to use to define a particular printer section is the name
+      of the print queue on which you want to set quotas.
+    </para>
+    
+    <para>
+      After you have modified <application>PyKota</application>'s configuration files, you have to
+      double check their permissions, otherwise your installation may be
+      insecure or may not work at all.
+      The main configuration file <filename>~pykota/pykota.conf</filename>
+      doesn't contain much sensitive information, so it can be made
+      readable by anyone. If normal users read this file, at best they
+      will learn the username and optional password of the read-only
+      database user. This means that beside being allowed to read all the contents of
+      the quota database, they won't be allowed to modify or delete it.
+      On the other hand, the <filename>~pykota/pykotadmin.conf</filename>
+      file contains the read-write user's identity and password. You must then
+      ensure that no normal user can read this file. It should only be readable
+      by the <literal>root</literal> user, which is always the case, and by 
+      <application>PyKota</application> administrators. In addition, <application>LPRng</application>
+      users, or users for which <application>CUPS</application> doesn't run as user <literal>root</literal> will 
+      have to ensure that the user their printing system is run as
+      can read both of these files. An easy way to do so is to put the <literal>lp</literal> user
+      (for example) into the <literal>pykota</literal> system group, then
+      to give the correct permissions to <application>PyKota</application>'s configuration files :
+      <screen>
+$ chown pykota.pykota ~pykota/pykota.conf      
+$ chmod 644 ~pykota/pykota.conf      
+$ chown pykota.pykota ~pykota/pykotadmin.conf      
+$ chmod 640 ~pykota/pykotadmin.conf      
+      </screen>
+      
+      <warning>
+        <title>Warning</title>
+        <para>
+          All the users allowed to read the <filename>~pykota/pykotadmin.conf</filename> 
+          are considered to be <application>PyKota</application> administrators. So be
+          careful with these files permissions.
+        </para>
+      </warning>
+    </para>
+    
+    <para>
+      Don't forget to restart your print server sofware if you changed group membership for the user it runs
+      as, otherwise your change wouldn't be taken into account.
+    </para>
+    
+    <para>
+      Now depending on your printing system, the configuration to do is particular.
+      We will now see how to plug PyKota into your printing system.
+    </para>
+    
+    <sect2>
+      <title>With CUPS</title>
+      
+      <para>
+        From version 1.16alpha7 on, configuring <application>PyKota</application> to integrate
+        within <application>CUPS</application> is more than easy.
+      </para>
+      
+      <para>
+        You just have to create a symbolic link to the <filename>cupspykota</filename>
+        command in <application>CUPS</application>' backend directory :
+        <screen>        
+$ cd /usr/lib/cups/backend        
+$ ln -s /usr/share/pykota/cupspykota cupspykota
+        </screen>
+      </para>
+      
+      <para>
+        You have to restart <application>CUPS</application> for this modification to
+        take effect : 
+        <screen>
+$ /etc/init.d/cupsys restart        
+        </screen>
+      </para>
+      
+      <para>
+        Now point your web browser to CUPS configuration page, usually at 
+        <ulink url="http://localhost:631">http://localhost:631</ulink> on
+        your print server.
+      </para>
+      
+      <para>
+        Then when creating new printers or reconfiguring existing ones, just
+        choose devices which are <literal>PyKota managed</literal>
+        <footnote>
+          <para>
+            Debian 3.0 Woody is known to have problems : CUPS 1.1.14 doesn't automatically
+            detect <literal>PyKota managed</literal> devices. So you have to manually
+            modify CUPS' <filename>printers.conf</filename> file as explained in 
+            PyKota's toplevel <filename>README</filename> file.
+          </para>
+        </footnote>
+        instead of
+        normal devices. You've got one <literal>PyKota managed</literal> device
+        for each regular device available from CUPS, so just choose the appropriate
+        one.
+      </para>
+      
+      <para>
+        Repeat the above procedure for each print queue on which you want to use
+        PyKota. That's all !
+      </para>
+      
+      <sect3>
+        <title>Troubleshooting</title>
+        <para>
+          In case of problem, the simplest way to solve it is currently
+          to ask on PyKota's mailing list, describing the symptoms, as
+          well as the hardware and software you use.
+          In a future release of this document, a section dedicated to 
+          Frequently Asked Questions will be included.
+        </para>
+        
+        <para>
+          You can now also ask us questions on IRC :
+          <screen>
+/server irc.freenode.net          
+/join #pykota
+          </screen>
+        </para>  
+      </sect3>  
+      
+    </sect2>
+    
+    <sect2>
+      <title>With LPRng</title>
+      
+      <para>
+        For each printer on which you want to use <application>PyKota</application>, just modify the printer's 
+        entry in <filename>/etc/printcap</filename> : you have to add
+        the three following lines :
+        
+<screen>        
+  :achk=true:\
+  :as=/usr/share/pykota/lprngpykota:\
+  :ae=/usr/share/pykota/lprngpykota:\
+</screen>          
+
+        This will tell <application>LPRng</application> to activate accounting, and use the <filename>lprngpykota</filename> 
+        accounting filter both at the start and at the end of printing. 
+      </para>
+      
+      
+      <para>
+        Repeat the above procedure for each print queue on which you want to use
+        PyKota. That's all !
+      </para>
+      
+      <para>
+        When all modifications are done, just save the <filename>/etc/printcap</filename> file 
+        and restart <application>LPRng</application> for the changes to take effect : 
+        <screen>
+$ /etc/init.d/lprng restart        
+        </screen>
+      </para>
+      
+      <sect3>
+        <title>Troubleshooting</title>
+        <para>
+          In case of problem, the simplest way to solve it is currently
+          to ask on PyKota's mailing list, describing the symptoms, as
+          well as the hardware and software you use.
+          In a future release of this document, a section dedicated to 
+          Frequently Asked Questions will be included.
+        </para>
+        
+        <para>
+          You can now also ask us questions on IRC :
+          <screen>
+/server irc.freenode.net          
+/join #pykota
+          </screen>
+        </para>
+      </sect3>  
+      
+    </sect2>
+    
+  </sect1>  
+</chapter>
+
Index: pykota/tags/1.22/docs/spanish/README
===================================================================
--- pykota/tags/1.22/docs/spanish/README (revision 2146)
+++ pykota/tags/1.22/docs/spanish/README (revision 2146)
@@ -0,0 +1,39 @@
+# $Id$
+
+PyKota - Print Quota for CUPS
+
+(c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains some PyKota documentation in Spanish.
+
+Files :
+
+        - README : This file
+        
+        - instalacion.sxw : Complete installation guide for PyKota
+          with CUPS and PostgreSQL under SuSe GNU/Linux.
+          This file was generously contributed to this project 
+          by Dennis Romero L. I've added two paragraphs in
+          Helvetica 12 Italic, one describing the warning below.
+          
+          WARNING : This documentation is COMPLETELY OUTDATED.
+          Please don't use it for reasons other than historical
+          ones. Dennis has written a new version which he will
+          make available online in a few days.
+          
+====================================================================
Index: pykota/tags/1.22/docs/pykota.sgml
===================================================================
--- pykota/tags/1.22/docs/pykota.sgml (revision 2147)
+++ pykota/tags/1.22/docs/pykota.sgml (revision 2147)
@@ -0,0 +1,139 @@
+<!DOCTYPE Book PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
+
+  <!entity INSTALLATION system "installation.sgml">
+  <!entity FILTERPYKOTA system "filterpykota.sgml">
+  <!entity PKPRINTERS system "pkprinters.sgml">
+  <!entity EDPYKOTA system "edpykota.sgml">
+  <!entity REPYKOTA system "repykota.sgml">
+  <!entity PYKOTME system "pykotme.sgml">
+  <!entity WARNPYKOTA system "warnpykota.sgml">
+  <!entity SCRIPTS system "scripts.sgml">
+  <!entity PKHINT system "pkhint.sgml">
+  <!entity PYKOSD system "pykosd.sgml">
+  <!entity DUMPYKOTA system "dumpykota.sgml">
+  <!entity AUTOPYKOTA system "autopykota.sgml">
+  <!entity PKMAIL system "pkmail.sgml">
+  <!entity GNUGPL system "gnugpl.sgml">
+
+]>
+
+<!-- $Id$ -->
+
+<book lang="en">
+  <bookinfo>
+    <title>PyKota Documentation</title>
+    <subtitle>A full featured Print Quota Solution for CUPS and LPRng</subtitle>
+    <copyright>
+      <year>2003</year>
+      <year>2004</year>
+      <year>2005</year>
+      <holder>Jerome Alet</holder>
+    </copyright>
+
+    <date>$Date$</date>
+
+    <authorgroup>
+      <author>
+        <firstname>J�me</firstname>
+        <surname>Alet</surname>
+        <affiliation>
+          <orgname>C@LL - Conseil Internet &amp; Logiciels Libres</orgname>
+          <address>
+            <street>48 Avenue Vincent Arnaud</street>
+            <city>06300 Nice</city>
+            <country>France</country>
+            Email : <email><ulink url="mailto:alet@librelogiciel.com">alet@librelogiciel.com</ulink></email>
+            Phone : <phone>(+33) 4 93 27 12 98</phone>
+          </address>
+        </affiliation>
+      </author>
+    </authorgroup>
+
+    <abstract>
+      <title>Abstract</title>
+      <para>
+        This document will describe the setup of the PyKota Print Quota system
+        for the Common UNIX Printing Environment and LPRng, and its day-to-day use.
+      </para>
+    </abstract>
+
+    <legalnotice>
+      <title>Legal Notice</title>
+
+      <para>
+        This documentation is licensed under the terms of the GNU 
+        General Public License as described below.
+      </para>
+      
+      <para>
+        This program is free software; you can redistribute it and/or modify
+        it under the terms of the GNU General Public License as published by
+        the Free Software Foundation; either version 2 of the License, or
+        (at your option) any later version.
+      </para>  
+
+      <para>
+        This program is distributed in the hope that it will be useful,
+        but WITHOUT ANY WARRANTY; without even the implied warranty of
+        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+        GNU General Public License for more details.
+      </para>  
+
+      <para>
+        You should have received a copy of the GNU General Public License
+        along with this program; if not, write to the Free Software
+        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+      </para>
+      
+      <para>
+        A copy of the entire license is included in the section entitled "GNU
+        General Public License".
+      </para>
+
+      <para>
+        In case you encounter any problem, please contact
+        <ulink url="mailto:info@librelogiciel.com">
+          J�me Alet
+        </ulink>
+        , author of the present document.
+      </para>
+
+      <para>
+        $Date$
+        $Revision$
+      </para>
+
+    </legalnotice>
+
+  </bookinfo>
+
+  &INSTALLATION;
+  
+  &FILTERPYKOTA;
+  
+  &PKPRINTERS;
+
+  &EDPYKOTA;
+  
+  &AUTOPYKOTA;
+    
+  &REPYKOTA;
+    
+  &PYKOTME;  
+  
+  &WARNPYKOTA;
+  
+  &DUMPYKOTA;
+  
+  &PKHINT;
+  
+  &PYKOSD;
+  
+  &PKMAIL;
+  
+  &SCRIPTS;
+    
+  &GNUGPL;
+
+</book>
+
Index: pykota/tags/1.22/docs/pykosd.sgml
===================================================================
--- pykota/tags/1.22/docs/pykosd.sgml (revision 2147)
+++ pykota/tags/1.22/docs/pykosd.sgml (revision 2147)
@@ -0,0 +1,55 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Uses On Screen Display to show personal print quota information with pykosd</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    <filename>pykosd</filename> is a graphical <application>X Window</application> application which when launched 
+    will display print quota information for the current user.
+  </para>  
+  
+  <para>
+    Whenever you launch <filename>pykosd</filename>, it will display the current user's print quota
+    information in the top-left corner of the screen, above all existing windows, and with
+    a transparent background. 
+  </para>
+  
+  <para>
+    By default, the information will remain displayed during <literal>3</literal> seconds, and
+    will be refreshed every <literal>180</literal> seconds. The program will loop forever 
+    until <keysym>Ctrl+C</keysym> is pressed, unless a specific number of iterations was
+    asked for.
+    
+    <tip>
+      <title>Tip</title>
+      <para>
+        Use command line options to change this behaviour.
+      </para>
+    </tip>
+  </para>
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>pykosd</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <group choice="opt">
+          <arg>-d <replaceable>d</replaceable></arg>
+          <arg>--duration <replaceable>d</replaceable></arg>
+        </group>
+        <group choice="opt">
+          <arg>-l <replaceable>n</replaceable></arg>
+          <arg>--loop <replaceable>n</replaceable></arg>
+        </group>
+        <group choice="opt">
+          <arg>-s <replaceable>s</replaceable></arg>
+          <arg>--sleep <replaceable>s</replaceable></arg>
+        </group>
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/pkmail.sgml
===================================================================
--- pykota/tags/1.22/docs/pkmail.sgml (revision 2147)
+++ pykota/tags/1.22/docs/pkmail.sgml (revision 2147)
@@ -0,0 +1,101 @@
+<!-- $Id: -->
+
+<chapter>
+  <title>Control PyKota by email with pkmail</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    <command>pkmail</command> is an email gateway which allows you to control
+    <application>PyKota</application> using email messages.
+  </para>  
+  
+  <para>
+    For now, this command can't do more than print quota reports, but more
+    powerful functionnalities are planned for a future release.
+  </para>
+  
+  <sect1>
+    <title>Installation</title>
+    <para>
+      Contrary to other commands included with <application>PyKota</application>,
+      <command>pkmail</command> is not meant to be used from the command line,
+      but instead launched from your mail server when particular messages are
+      received.
+    </para>
+    
+    <para>
+      In order to achieve this, the easiest way is to define a special
+      email alias. Every message received on this address will cause your webserver to automatically
+      launch <command>pkmail</command>, passing the message's content on <command>pkmail</command>'s standard input.
+    </para>
+    
+    <para>
+      The name of the email alias is completely free, let's call it <literal>pykotacmd</literal> for example.
+      Now edit <filename>/etc/aliases</filename> with your favorite text editor and enter the following :
+<screen>      
+pykotacmd :     "|/usr/bin/pkmail"
+</screen>
+    </para>
+    
+    <para>
+      Finally, tell your mail server that new aliases are available. To do so, at the command prompt just
+      type :
+<screen>      
+$ newaliases
+</screen>      
+    </para>
+    
+    <para>
+      But to be useful, <command>pkmail</command> must be able to read <application>PyKota</application>'s
+      <filename>pykotadmin.conf</filename> configuration file. A simple way to do so is to put the system
+      user your mail server runs aliases commands as into the <literal>pykota</literal> system group, then
+      restart your mail server software.
+      <tip>
+        <title>Tip</title>
+        <para>
+          Depending on the software you use as the mail server, additional work may be needed. For example
+          <application>Exim</application> doesn't by default initialize all the groups when launching a
+          command from the <filename>/etc/aliases</filename> database. Please refer to your mail server's
+          documentation for details.
+        </para>
+      </tip>  
+    </para>
+  </sect1>  
+  
+  <sect1>
+    <title>Usage</title>
+    <para>
+      Now that <command>pkmail</command> is installed, we can use it by sending email messages to the address
+      <literal>pykotacmd@yourmailserver.example.com</literal>. This command will then process your request,
+      and send the result back to you by email.
+    </para>
+    
+    <para>
+      For now, <command>pkmail</command> only accepts commands in the <literal>Subject:</literal> field
+      of the email message you send to it.
+    </para>
+    
+    <para>
+      <command>pkmail</command> is still in a pretty experimental state, and only recognizes a single command :
+      <command>report</command>
+    </para>
+    
+    <para>
+      The <command>report</command> takes an username as its only optional argument. So for example to
+      receive a print quota report for user <literal>jerome</literal>, you'll just have to send
+      an email message with <literal>report jerome</literal> in the subject.
+    </para>
+  </sect1>  
+  
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>pkmail</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/docs/filterpykota.sgml
===================================================================
--- pykota/tags/1.22/docs/filterpykota.sgml (revision 2147)
+++ pykota/tags/1.22/docs/filterpykota.sgml (revision 2147)
@@ -0,0 +1,84 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title id="filter">PyKota's internals</title>
+  
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    To account for pages or eventually ink usage 
+    <footnote>
+      <para>
+        PyKota doesn't currently account for ink usage, it only accounts
+        pages. To account for ink usage, you should use PrintBill instead for now.
+      </para>  
+    </footnote>  
+    , you must plug your accounting
+    system somewhere into the printing system you use, be it either <application>CUPS</application>
+    or <application>LPRng</application>. One way to do this without having
+    to modify the printing system itself, is by using a <firstterm>filter</firstterm>.
+  </para>
+  
+  <para>
+    A filter is a computer program which takes data in one format as its input, and outputs the
+    same data but transformed into another format. <application>CUPS</application> already
+    contains many filters. For example there's one filter named <filename>pstops</filename> which accepts 
+    PostScript data as its input, and, as its name implies, outputs PostScript data too, but after having
+    eventually rearranged the pages to fit several pages on a single sheet of paper, or other manipulations
+    like that. <application>LPRng</application> also contains several filters like this.
+  </para>
+  
+  <para>
+    The <filename>pstops</filename> filter described above is also in charge of doing basic page
+    accounting, but <application>PyKota</application> currently doesn't use this facility since it may
+    prove to be unreliable depending on the drivers used or if a paper jam occurs for example.
+  </para>
+  
+  <para>
+    <application>LPRng</application> can also use filters, often used in combination with
+    <application>LPRng</application> are <application>magicfilter</application> which can convert 
+    different input formats to native printers languages like PostScript or ESC/P2 and 
+    <application>ifhp</application> which can do low-level accounting.
+  </para>  
+  
+  <para>
+    So to do its own accounting, <application>PyKota</application> has its own filters, for <application>CUPS</application>
+    it's named <filename>cupspykota</filename>, which is in fact a <application>CUPS</application> backends wrapper,
+    and for <application>LPRng</application> it's named <filename>lprngpykota</filename>, as you have probably guessed.
+    The procedure to plug the correct filter into your printing system is described in the 
+    <xref linkend="installation" endterm="installation"> chapter.
+  </para>
+  
+  <para>
+    Currently with a <application>CUPS</application> internal accounting mechanism, the <filename>pstops</filename>
+    filter can be bypassed. That's why <application>PyKota</application> uses its own backend.
+    The <filename>cupspykota</filename> backend wrapper ensures that jobs can't bypass it, so you can use
+    any printer with any driver and any command line option, and you can be sure that your
+    print job will be correctly accounted for.
+  </para>
+  
+  <para>
+    When using the <literal>hardware</literal> accounting method,
+    <application>PyKota</application> launches the script you specified to
+    ask the printer for its internal page counter at the start and at the end of the print job, and
+    computes the values' difference to know the job's size. 
+  </para>
+  
+  <para>
+    When using the <literal>software</literal> accounting method,
+    the command you specified is launched with the job's data on its 
+    standard input. Your command must print the job's size in number of
+    pages on a single line on its standard output. This number is then
+    read by <application>PyKota</application> and used to update the current user's quota information.
+  </para>
+  
+  <para>
+    If a problem occurs, it is logged either to the filter's standard error or to the system logger, depending on
+    your preferences in <application>PyKota</application>'s configuration files. Also if a print quota is reached
+    you may choose if the administrator, the user, both or no-one will receive an email message explaining
+    the situation and proposing a solution. You can even configure another action instead of sending email
+    messages if you want.
+  </para>
+  
+</chapter>
+
Index: pykota/tags/1.22/docs/dumpykota.sgml
===================================================================
--- pykota/tags/1.22/docs/dumpykota.sgml (revision 2236)
+++ pykota/tags/1.22/docs/dumpykota.sgml (revision 2236)
@@ -0,0 +1,121 @@
+<!-- $Id$ -->
+
+<chapter>
+  <title>Export datas to other software with dumpykota</title>
+  <para>Last modified on $Date$</para>
+  
+  <para>
+    If you want to reuse <application>PyKota</application> datas from another
+    software, but don't want to modify your existing application to
+    have it connect to <application>PyKota</application>'s database, your
+    best option is the new <command>dumpykota</command> command.
+  </para>
+  
+  <para>
+    <command>dumpykota</command> can export <application>PyKota</application>
+    datas in a number of formats. The supported output formats are
+    comma separated values, semicolon separated values, tab separated values, and <acronym>XML</acronym>.
+  </para>  
+  
+  <para>
+    For the print job history's datas, a special format identical to <application>CUPS</application>' <literal>page_log</literal>
+    format is also supported.
+    This allows you to interface <application>PyKota</application> with third party tools like
+    <application>phpPrintAnalyzer</application> which is a logfile analyzer for <application>CUPS</application>,
+    even in the case where you use <application>LPRng</application> instead of <application>CUPS</application>.
+  </para>  
+  
+  <para>
+    More formats may be added in the future. In particular, 
+    <acronym>SQL</acronym> and <acronym>LDIF</acronym> are planned, but 
+    are currently not implemented. 
+  </para>
+  
+  <para>
+    <command>dumpykota</command> can't dump all datas at once though, you have
+    to specify which type of datas you want. The possible types are :
+    <itemizedlist>
+      <listitem><para>Users</para></listitem>
+      <listitem><para>Users groups</para></listitem>
+      <listitem><para>Printers</para></listitem>
+      <listitem><para>Printers groups membership</para></listitem>
+      <listitem><para>Users groups membership</para></listitem>
+      <listitem><para>Users print quota entries</para></listitem>
+      <listitem><para>Users groups print quota entries</para></listitem>
+      <listitem><para>History of payments</para></listitem>
+      <listitem><para>History of print jobs</para></listitem>
+    </itemizedlist>  
+  </para>
+  
+  <para>
+    You can then import the dumped datas into a spreadsheet for example, 
+    if you want to create complex reports with nice looking graphs and
+    the like.
+  </para>
+  
+  <para>
+    An important feature of this command is the possibility to use
+    a simple but powerful filtering mechanism to only export the datas
+    you want. You can pass any number of filter expressions which will
+    be ANDed together to select only certain records in the database.
+    For example the filter expression <literal>username=jerome</literal>
+    would only dump datas pertaining to user <literal>jerome</literal>.
+  </para>
+  
+  <para>
+    Several keys like <literal>username</literal> are possible, but some
+    only apply to certain data types. Using a key which is not supported
+    for a particular data type will return an empty result.
+    <tip><title>Tip</title>
+      <para>
+        Please refer to dumpykota's help or manual page to obtain
+        the complete list of supported keys.
+      </para>
+    </tip>  
+  </para>
+  
+  <para>
+    This command could also be used if you plan to write your own management
+    tools : just write wrappers around the <command>pkprinters</command>,
+    <command>edpykota</command>, and <command>dumpykota</command>
+    tools, and your own tools will automatically benefit from <application>PyKota</application>
+    database backend independance layer.
+    This is exactly what the third party software <application>phpPykotaAdmin</application> does.
+  </para>
+  
+  <para>
+    Finally, <command>dumpykota</command>'s functionnality is now also available remotely through
+    the use of the <filename>dumpykota.cgi</filename> <acronym>CGI</acronym> script.
+  </para>
+  
+  <warning>
+    <title>Warning</title>
+    <para>
+      Only <application>PyKota</application> administrators can dump PyKota's datas.
+    </para>
+  </warning>  
+        
+  <sect1>
+    <title>Reference</title>
+    <para>
+      <cmdsynopsis>
+        <command>dumpykota</command>
+        <group choice="opt"><arg>-v</arg><arg>--version</arg></group>
+        <group choice="opt"><arg>-h</arg><arg>--help</arg></group>
+        <group choice="opt">
+          <arg>-f <replaceable>outputformat</replaceable></arg>
+          <arg>--format <replaceable>outputformat</replaceable></arg>
+        </group>
+        <group choice="opt">
+          <arg>-o <replaceable>filename</replaceable></arg>
+          <arg>--output <replaceable>filename</replaceable></arg>
+        </group>
+        <group choice="req">
+          <arg>-d <replaceable>datatype</replaceable></arg>
+          <arg>--data <replaceable>datatype</replaceable></arg>
+        </group>
+      </cmdsynopsis>
+    </para>
+  </sect1>
+</chapter>
+
Index: pykota/tags/1.22/extractmsg.sh
===================================================================
--- pykota/tags/1.22/extractmsg.sh (revision 2146)
+++ pykota/tags/1.22/extractmsg.sh (revision 2146)
@@ -0,0 +1,22 @@
+#! /bin/sh
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# You're welcome to redistribute this software under the
+# terms of the GNU General Public Licence version 2.0
+# or, at your option, any higher version.
+#
+# You can read the complete GNU GPL in the file COPYING
+# which should come along with this software, or visit
+# the Free Software Foundation's WEB site http://www.fsf.org
+#
+# $Id$
+#
+#
+# First ensures there's no existing file
+rm -f /tmp/pykota.po
+#
+# Then extract messages
+xgettext --keyword=N_ --language=python --default-domain=pykota --output-dir=/tmp --no-location --msgid-bugs-address="alet@librelogiciel.com" $*
+
Index: pykota/tags/1.22/untested/netatalk/pagecount.ps
===================================================================
--- pykota/tags/1.22/untested/netatalk/pagecount.ps (revision 2162)
+++ pykota/tags/1.22/untested/netatalk/pagecount.ps (revision 2162)
@@ -0,0 +1,2 @@
+%! PS-Adobe-2.0
+statusdict begin pagecount == end flush
Index: pykota/tags/1.22/untested/netatalk/Makefile.am
===================================================================
--- pykota/tags/1.22/untested/netatalk/Makefile.am (revision 2146)
+++ pykota/tags/1.22/untested/netatalk/Makefile.am (revision 2146)
@@ -0,0 +1,7 @@
+pykotanetatalkdir = $(datadir)/pykota
+pykotanetatalk_DATA = 	\
+	netatalk.sh			\
+	pagecount.ps
+
+EXTRA_DIST = \
+	$(pykotanetatalk_DATA)
Index: pykota/tags/1.22/untested/netatalk/netatalk.sh
===================================================================
--- pykota/tags/1.22/untested/netatalk/netatalk.sh (revision 2146)
+++ pykota/tags/1.22/untested/netatalk/netatalk.sh (revision 2146)
@@ -0,0 +1,15 @@
+#! /bin/sh
+#
+# $Id$
+#
+# The following was adapted from a post found on usenet.
+#
+# It works with my Apple LaserWriter 16/600 PS and with
+# my HP LasetJet 2100 TN with AppleTalk enabled.
+#
+# As always, YMMV.
+# 
+echo Please uncomment one of the lines, adapt the script and restart.
+echo You can get AppleTalk printer\'s names with the nbplkup command.
+# /usr/bin/pap -p "RAMPAL-16/600:LaserWriter" pagecount.ps 2>/dev/null | grep -v status | grep -v Connect
+# /usr/bin/pap -p "LaserJet 2100 NT:LaserWriter" pagecount.ps 2>/dev/null | grep -v status | grep -v Connect
Index: pykota/tags/1.22/untested/pjl/status.pjl
===================================================================
--- pykota/tags/1.22/untested/pjl/status.pjl (revision 2161)
+++ pykota/tags/1.22/untested/pjl/status.pjl (revision 2161)
@@ -0,0 +1,6 @@
+%-12345X@PJL
+@PJL USTATUSOFF
+@PJL USTATUS DEVICE=ON
+%-12345X%-12345X@PJL
+@PJL INFO STATUS
+%-12345X
Index: pykota/tags/1.22/untested/pjl/Makefile.am
===================================================================
--- pykota/tags/1.22/untested/pjl/Makefile.am (revision 2146)
+++ pykota/tags/1.22/untested/pjl/Makefile.am (revision 2146)
@@ -0,0 +1,7 @@
+pykotapjldir = $(datadir)/pykota
+pykotapjl_DATA = 	\
+	pagecount.pjl	\
+	status.pjl
+
+EXTRA_DIST = \
+	$(pykotapjl_DATA)
Index: pykota/tags/1.22/untested/pjl/pagecount.pjl
===================================================================
--- pykota/tags/1.22/untested/pjl/pagecount.pjl (revision 2161)
+++ pykota/tags/1.22/untested/pjl/pagecount.pjl (revision 2161)
@@ -0,0 +1,3 @@
+%-12345X@PJL
+@PJL INFO PAGECOUNT
+%-12345X
Index: pykota/tags/1.22/untested/Makefile.am
===================================================================
--- pykota/tags/1.22/untested/Makefile.am (revision 2146)
+++ pykota/tags/1.22/untested/Makefile.am (revision 2146)
@@ -0,0 +1,1 @@
+SUBDIRS = netatalk parallel pjl postscript
Index: pykota/tags/1.22/untested/postscript/Makefile.am
===================================================================
--- pykota/tags/1.22/untested/postscript/Makefile.am (revision 2146)
+++ pykota/tags/1.22/untested/postscript/Makefile.am (revision 2146)
@@ -0,0 +1,6 @@
+pykotapostscriptdir = $(datadir)/pykota
+pykotapostscript_DATA = 	\
+	pagecount.sh
+
+EXTRA_DIST =	\
+	$(pykotapostscript_DATA)
Index: pykota/tags/1.22/untested/postscript/pagecount.sh
===================================================================
--- pykota/tags/1.22/untested/postscript/pagecount.sh (revision 2146)
+++ pykota/tags/1.22/untested/postscript/pagecount.sh (revision 2146)
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+#
+# This script was freely adapted and modified from the printquota project 
+# http://printquota.sourceforge.net for inclusion into PyKota.
+#
+# printquota (c) 2002-2003 Ahmet Ozturk & Cagatay Koksoy
+# printquota is distributed under the GNU General Public License
+#
+# Usage : pagecount.sh <file.ps
+#
+(
+(sed -n -e '/%!PS-Adobe-/,/\%\%EOF/p' | grep -E -v "/Duplex|PageSize")
+echo currentdevice /PageCount gsgetdeviceprop == flush
+) | gs -q -sDEVICE=bit -sOutputFile=/dev/null -r5 - | tail -1
+
Index: pykota/tags/1.22/untested/parallel/parallel.sh
===================================================================
--- pykota/tags/1.22/untested/parallel/parallel.sh (revision 2146)
+++ pykota/tags/1.22/untested/parallel/parallel.sh (revision 2146)
@@ -0,0 +1,46 @@
+#! /bin/sh
+
+# This script was generously contributed by Jem E. Berkes.
+# It can't work as-is with PyKota, you first have to adapt it
+# and this may require some work on your part.
+
+# It is aimed at printers which support the PJL language, which
+# are plugged through a bidirectionnal parallel port.
+
+# Read what Jem has to say about it :
+
+# It seems that network sockets or some other control specific method is the 
+# best way to query the printers. What I have is a bit (well, more than just 
+# a bit) of a brute forced solution. However, it has been working for us for 
+# about a month and only needs a bidirectional /dev/lp0
+
+# I'm not at all happy about the sleep's I have in there. On occasion, there 
+# are missing page counts in the log but since the * next * user to print 
+# gets a good pagecount, the parser (a separate program) finds the 
+# responsibility.
+# 
+# If you find a way to improve what I have, please let me know. Note that 
+# when this is invoked from printcap, it's expecting that the data coming it 
+# at stdin is a pre-formatted print job (the Windows machines do that 
+# anyway).
+
+# Copyright (C) 2003 Jem E. Berkes
+# jb2003@pc9.org
+# This script queries the HP LaserJet 1200 for pagecount, then prints a
+# pre-formatted job
+# Log format: DATE\tUSERNAME\tPRECOUNT
+
+PRINTDEV=/dev/lp0
+LOGFILE=$SPOOL_DIR/pagelog
+
+echo -e "\33%-12345X@PJL\n@PJL INFO VARIABLES\n\33%-12345X" > $PRINTDEV
+sleep 1
+cat $PRINTDEV > /dev/null
+echo -e "\33%-12345X@PJL\n@PJL INFO PAGECOUNT\n\33%-12345X" > $PRINTDEV
+sleep 1
+PAGECOUNT=`cat $PRINTDEV | grep "^[0-9]"`
+USERID=`echo $1 | cut -b 3- | sed "s/@.*//"`
+echo -e "`date \"+%Y-%m-%d %H:%M:%S\"`\t$USERID\t$PAGECOUNT" >> $LOGFILE
+cat > $PRINTDEV
+
+
Index: pykota/tags/1.22/untested/parallel/Makefile.am
===================================================================
--- pykota/tags/1.22/untested/parallel/Makefile.am (revision 2146)
+++ pykota/tags/1.22/untested/parallel/Makefile.am (revision 2146)
@@ -0,0 +1,6 @@
+pykotaparalleldir = $(datadir)/pykota
+pykotaparallel_DATA = 	\
+	parallel.sh
+	
+EXTRA_DIST = \
+	$(pykotaparallel_DATA)
Index: pykota/tags/1.22/untested/README
===================================================================
--- pykota/tags/1.22/untested/README (revision 2146)
+++ pykota/tags/1.22/untested/README (revision 2146)
@@ -0,0 +1,31 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains scripts which may be used to query printers 
+for their life time page counter, so you could define them as
+hardware accounters in PyKota configuration file.
+
+They are completely untested, and you certainely have to edit them to
+make them work as part of PyKota.
+
+Any success or failure report is more than welcome.
+
+====================================================================
Index: pykota/tags/1.22/CREDITS
===================================================================
--- pykota/tags/1.22/CREDITS (revision 2230)
+++ pykota/tags/1.22/CREDITS (revision 2230)
@@ -0,0 +1,201 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+Supporters :
+------------
+
+  The following people supports the PyKota project enhancement
+  by funding it :
+  
+  - Daniel Garcia
+  - Ted Buchanan - Vincennes University
+  - Victor Hiebert - Simon Fraser University
+  - Andres de la Cruz
+  - Anwar Bashir - University of Teesside
+  - Jan-David Hoivik - Oslo University College
+  - Peg Shafer - Tufts University
+  - Lonnie Norton - University of Utah
+  - Ian Taylor - University of Melbourne
+  - Steven Blair - Parergy
+  - Greg Paynter
+  - Pablo Acchiardio
+  - Peter Allmaker - Massachusetts College of Liberal Arts
+  - Nigel Pallett - Optimus UK Ltd
+  - Joby Mathew
+  - Alejandra Rodriguez
+  - Matt Hyclak - Ohio University
+  - Brian Choy
+  - Oscar Maqueda Hortells 
+  - Roger Crawford - University of Oxford
+  - Paolo Del Romano
+  - Peter Strauss/Stefan Marschall/Christian Ritter - University of Mannheim
+  - Kennie Cruz - Universidad de Puerto Rico
+  - Johan Fehrman - Kungliga Tekniska H�olan
+  - Pam Luther - Georgia Institute of Technology
+  - Xavier Palou - Ecole Fran�se de Gestion Commerciale
+  - Jean-Fran�s Pollozec - Austral Informatique
+  - Alain Soyeur
+  - David Collier-Brown - Sun Microsystems Canada
+  - Laurent Evrard - Polytechnic of Namibia
+  - James Affeld
+  - King Man Leung
+  - Stephen Markan - Faculty of Environmental Studies, University of Waterloo
+  - Jeremy Worth - University of Oxford
+  - Roger Morgan - H�e Technische Bundeslehranstalt Steyr
+  - Pal Monstad
+  - Richard Potter
+  - Ryan Lim
+  - Michael Allerhand - University of Edinburgh
+  - Kjetil Knudsen
+  - Felix Hilmer
+  - Michael Stone - University of Texas
+  - Konstantin Schikarski
+  - Philippe Ciaravola - McGill University
+  - Jose Luis - Instituto Polit�ico de Bragan�  - David Ball
+  - Daniel Fonseca
+  - Computer Network Service - Rhode Island School of Design
+  - Nicholas Wai - University of Ballarat
+  - Peter Palmer - Bournville College of Further Education
+  - Faouzi Gassemi - University of Montreal
+  - Dave Williams
+  - Nelson Vieira
+  - Robert M. Martel - Cleveland State University
+  - Julie Leary - Villa Julie College
+  - Nessim Hemmer - Universit�Bremen
+  - Morten Hoyrup - Ribe Katedralskole
+  - Jean-Pascal Lahieyte - Universit�e Bretagne Occidentale
+  - David Tepa� - Universit�Bielefeld
+  - Jane Gao - University of New South Wales
+  - Oliver Klagges - FH Detmold
+  - Daryl Sarwan
+  - Bj�Bastian Behnke
+  - Ryan Suarez - Sheridan College Institute of Technology & Advanced Learning
+  - Thomas Harding
+  - Alessandra Maria Marmo - Universit�i Camerino
+  - Fabian Wenzel
+  - William Szkotnicki - University of Guelph
+  - Rob Chapman
+  - Jean-Yves Bouron - Centre National de la Recherche Scientifique
+  - Immanuel Derks - Translucent Systems
+  - Sarah Ponarathanam - InterUniversity Centre for Astronomy and Astrophysics
+  - David Huckaby - Portland Adventist Academy
+  - Raul Bras - Universidade T�ica de Lisboa
+  - Paolo Mazzanti - Istituto Nazionale di Fisica Nucleare Sezione di Bologna
+  - Leif Keane - St Margaret's College
+  - K3M Consultoria
+  - Systematics Network Services GmbH
+  - Alldora Technologia
+  - Jill Nedved - Winnebago Industries
+  - Judith Cattaneo
+  - William F. Lott - University of Connecticut
+  - Britt Matych - Hochschule f�ewandte Wissenschaften Hamburg
+  - Olivier Villin - Conservatoire National des Arts et M�ers
+  - John Nicholson - Swinburne Senior Secondary College
+  - Ignacio Torralba 
+  - Stefan Peuckert
+  - Mark Hellar - San Francisco Art Institute
+  - Sheldon Poon
+  - Jean-Fran�s Lac - Institut de M�nique des Fluides de Toulouse
+  - Gagan S. Sidhu 
+  - Daniel Houlbrooke
+  - Tanguy Mongodin - Universit�e Caen - Ecole d'ing�eurs de Cherbourg
+  - Jeff Kotlyar - University of New South Wales
+  - Bernd Schindler - FH Deggendorf
+  - Bruce Vrieling
+  - James C Davis - Sunnydale Adventist Academy
+  - Richard Heys
+  - Damien Veron - Pentasonic
+  - Pablo Gandulfo
+  - Fran�s Gr�ire - Lyc� Jean Jaur�& Marc Chagall de Reims
+  - Clif Windecker
+  - Rick Pelletier - University of Alberta
+  - Meriza Doiron
+  - St�ane Conan - R�s Communication
+  - Ethnic Broadcasting G Unsworth
+  - Brian Chivers - Portsmouth College
+  - Jo Tang - University of Technology Sydney
+  - Alex Wood - IBM United Kingdom
+  - Ruth E. Briscoe - Idaho State University
+  - R� Collin - RemTech
+  - Phillip Hagedorn
+  - Julian Pilfold Bagwell - Borden Grammar School
+  - Marie-Claude Marques - Lyc�Suzanne Valadon de Limoges
+  - Samuel Tenon - Universit�aul Verlaine de Metz
+  - Fabien Chaudier - Institut National des Sciences Appliqu� de Lyon
+  - Ruffener - Wynford Local School District
+  
+
+Contributors :
+--------------
+
+  The following people contributed code or ideas to PyKota :
+  
+  - Jo�Collet : PyKota's logo
+  - Stefan Wold - Stockholm University : inital code for external policies
+  - John Flynn - University of Belize : LDAP support
+  - Wayne Godoy - University of Belize : LDAP support
+  - Leif Johansson - Stockholm University : LDAP support
+  - Bob Martel - Cleveland State University : SNMP examples
+  - Michael Stuebiger : Non-postscript printers support documentation
+  - Oleg Biteryakov - University of Michigan : Bug fix in SQL code
+  - Charl W. M�r - University of Stellenbosch : LDAP testing
+  - Dennis Romero L. : Spanish translation and installation guide.
+  - Daniel Mikkelsen : Sample configuration file fix
+  - Carlos Fernandes : Brazilian Portuguese translation
+  - Ren�und Jensen : Contributed the pagecount.pl script
+  - Henrik Janhagen - Kungliga Tekniska H�olan : Swedish translation
+  - Hugo Monteiro : Portuguese Portuguese translation
+  - Peter Hawkins : First try at Debian packaging 
+  - Michele Baldessari : Italian translation
+  - Ryan Suarez : Created a WiKi with lots of shemas
+  - Eduardo Gielamo Oliveira and Rodolfo Broco Manin : PCL page counter
+  - Sergey Romanov : bug fix
+  - Sergio Gonz�z Gonz�z : Debianization + Doc + Spanish translation.
+  - Suthep Yonpimai : Thai translation
+  - Jurandy Martins - Universidade Estadual de Campinas : Brazilian translation
+  - Spyros Melissovas - University of Ioannina : Greek translation
+  - Alban Crequy - Revolution Linux 
+  - Johannes Laemmermann - German translation
+  - Paulo Silva - Eurotux - Improved ESC/P2 miniparser
+  - Christian Andreetta - SNMP waiting script
+  - Paolo Nobili - Universit�egli Studi di Padova - SNMP waiting script
+  - Beda Szukics - Kantonsschule Obwalden - German translation
+  - Klaus Ade Johnstad - SkoleLinux - Norwegian Bokm�translation
+  - Matt Hyclak - Wrote the banner handling stuff.
+  - Wilson Roberto Afonso - Sent a patch for PJL.
+  - Baris Cicek - Turkish translation.
+  - Kanakorn Horsiritham - Wrote phpPykotaAdmin.
+  - Tsang Yu Pong, Teddy - PHC Wing Kwong College - Chinese (Trad.) translation 
+  - Marcus Fl�o de Lima - Universidade Federal de Minas Gerais : Brazilian PyKota+LDAP Documentation
+  - Rong-En Fan - Helped improve the PJL stuff.
+
+==============================================================
+
+  IF YOUR NAME DOESN'T APPEAR IN THE LISTS ABOVE, AND YOU
+  THINK YOU DESERVE TO BE LISTED, JUST SEND ME AN EMAIL
+  ASKING FOR BEING INCLUDED.
+  
+  I APOLOGIZE IN ADVANCE IF I'VE FORGOTTEN TO ADD YOUR NAME.
+  
+  ALSO, SOME PEOPLE MAY HAVE REFUSED TO BE LISTED HERE, THIS 
+  IS YOUR RIGHT TO DO SO TOO, JUST TELL ME.
+  
+==============================================================
Index: pykota/tags/1.22/tests/README
===================================================================
--- pykota/tags/1.22/tests/README (revision 2146)
+++ pykota/tags/1.22/tests/README (revision 2146)
@@ -0,0 +1,36 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains a gzipped PostScript file, master.ps.gz, 
+obtained by printing to a file a part of the SlashDot.org website 
+from the Galeon web browser on July 2nd 2004. 
+
+When uncompressed, this 16 pages file can be used to test the 
+accuracy of the generic Page Description Language analyzer included 
+in PyKota for different conversion outputs of gs. 
+
+To see if it works, simply launch :
+
+        $ ./runtests.sh
+        
+It should report 16 pages for each document. If it doesn't then 
+there's a bug in the generic Page Description Language analyzer. 
+Please report this to : alet@librelogiciel.com
Index: pykota/tags/1.22/tests/runtest.sh
===================================================================
--- pykota/tags/1.22/tests/runtest.sh (revision 2146)
+++ pykota/tags/1.22/tests/runtest.sh (revision 2146)
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+echo -n "Generating testsuite..."
+gunzip <master.ps.gz >master2.ps
+for device in lj250 lj4dithp ljet2p ljet4pjl ljetplus laserjet ljet3 ljet4 lj5gray lj5mono pxlmono pxlcolor pdfwrite pswrite psgray psmono psrgb epson epsonc eps9mid eps9high stcolor st800 escp escpc pcl3 cdeskjet cdj1600 cdj500 cdj550 cdj670 cdj850 cdj880 cdj890 cdj970 cdjcolor cdjmono dj505j djet500 djet500c hpdj1120c hpdj310 hpdj320 hpdj340 hpdj400 hpdj500 hpdj500c hpdj510 hpdj520 hpdj540 hpdj550c hpdj560c hpdj600 hpdj660c hpdj670c hpdj680c hpdj690c hpdj850c hpdj855c hpdj870c hpdj890c hpdjplus hpdjportable ; do
+    if ! [ -f "testsuite.$device" ]  ; then
+        gs -dQUIET -dBATCH -dNOPAUSE -sOutputFile="testsuite.$device" -sDEVICE="$device" master2.ps ; 
+    fi ;
+    done
+echo 
+
+echo -n "File master.ps should be 16 pages long, result is : "
+python ../pykota/pdlanalyzer.py master2.ps
+
+echo "Analyzing testsuite..."
+for file in testsuite.* ; do
+    echo -n "$file ===> " && python ../pykota/pdlanalyzer.py "$file" ;
+done    
Index: pykota/tags/1.22/COPYING
===================================================================
--- pykota/tags/1.22/COPYING (revision 2146)
+++ pykota/tags/1.22/COPYING (revision 2146)
@@ -0,0 +1,340 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          59 Temple Place, Suite 330
+                          Boston, MA 02111-1307, USA.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+        Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: pykota/tags/1.22/bin/edpykota
===================================================================
--- pykota/tags/1.22/bin/edpykota (revision 2225)
+++ pykota/tags/1.22/bin/edpykota (revision 2225)
@@ -0,0 +1,562 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Editor 
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+import grp
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+from pykota.config import PyKotaConfigError
+from pykota.storage import PyKotaStorageError
+
+__doc__ = N_("""edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+
+command line usage :
+
+  edpykota [options] user1 user2 ... userN
+  
+  edpykota [options] group1 group2 ... groupN
+
+options :
+
+  -v | --version       Prints edpykota's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -a | --add           Adds users and/or printers if they don't 
+                       exist on the Quota Storage Server.
+                       
+  -d | --delete        Deletes users/groups from the quota storage.
+                       Printers are never deleted.
+                       
+  -c | --charge p[,j]  Sets the price per page and per job to charge
+                       for a particular printer. Job price is optional.
+                       If both are to be set, separate them with a comma.
+                       Floating point values are allowed.
+                       
+  -o | --overcharge f  Sets the overcharging factor applied to the user 
+                       when computing the cost of a print job. Positive or 
+                       negative floating point values are allowed,
+                       this allows you to do some really creative
+                       things like giving money to an user whenever
+                       he prints. The number of pages in a print job
+                       is not modified by this coefficient, only the
+                       cost of the job for a particular user.
+                       Only users have a coefficient.
+  
+  -i | --ingroups g1[,g2...]  Puts the users into each of the groups
+                              listed, separated by commas. The groups
+                              must already exist in the Quota Storage.
+  
+  -u | --users         Edit users print quotas, this is the default.
+  
+  -P | --printer p     Edit quotas on printer p only. Actually p can
+                       use wildcards characters to select only
+                       some printers. The default value is *, meaning
+                       all printers. 
+                       You can specify several names or wildcards, 
+                       by separating them with commas.
+  
+  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups
+                       pg1, pg2, etc... which must already exist.
+                       A printer group is just like a normal printer,
+                       only that it is usually unknown from the printing
+                       system. Create printer groups exactly the same
+                       way that you create printers, then add other 
+                       printers to them with this option.
+                       Accounting is done on a printer and on all
+                       the printer groups it belongs to, quota checking
+                       is done on a printer and on all the printer groups
+                       it belongs to.
+  
+  -g | --groups        Edit users groups print quotas instead of users.
+                          
+  -p | --prototype u|g Uses user u or group g as a prototype to set
+                       print quotas
+                       
+  -n | --noquota       Doesn't set a quota but only does accounting.
+  
+  -r | --reset         Resets the actual page counter for the user
+                       or group to zero on the specified printers. 
+                       The life time page counter is kept unchanged.
+                       
+  -R | --hardreset     Resets the actual and life time page counters
+                       for the user or group to zero on the specified 
+                       printers. This is a shortcut for '--used 0'.
+                       
+  -l | --limitby l     Choose if the user/group is limited in printing                     
+                       by its account balance or by its page quota.
+                       The default value is 'quota'. Allowed values
+                       are 'quota' 'balance' 'quota-then-balance' and
+                       'balance-then-quota'.
+                       WARNING : quota-then-balance and balance-then-quota
+                       are not yet implemented.
+                       
+  -b | --balance b     Sets the user's account balance to b.                     
+                       Account balance may be increase or decreased
+                       if b is prefixed with + or -.
+                       WARNING : when decreasing account balance,
+                       the total paid so far by the user is decreased
+                       too.
+                       Groups don't have a real balance, but the
+                       sum of their users' account balance.
+                       
+  -S | --softlimit sl  Sets the quota soft limit to sl pages.                       
+  
+  -H | --hardlimit hl  Sets the quota hard limit to hl pages.
+
+  -U | --used usage    Sets the pagecounters for the user to usage pages;
+                       useful for migrating users from a different system
+                       where they have already used some pages. Actual
+                       and Life Time page counters may be increased or decreased
+                       if usage is prefixed with + or -.
+                       WARNING : BOTH page counters are modified in all cases,
+                       so be careful.
+                       NB : if 'usage' equals '0', then the action taken is
+                       the same as if --hardreset was used.
+
+  user1 through userN and group1 through groupN can use wildcards
+  if the --add option is not set.
+  
+examples :                              
+
+  $ edpykota --add -p jerome john paul george ringo/ringo@example.com
+  
+  This will add users john, paul, george and ringo to the quota
+  database, and set their print quotas to the same values than user 
+  jerome. User jerome must already exist.
+  User ringo's email address will also be set to 'ringo@example.com'
+  
+  $ edpykota --printer lp -S 50 -H 60 jerome
+  
+  This will set jerome's print quota on the lp printer to a soft limit
+  of 50 pages, and a hard limit of 60 pages. If either user jerome or
+  printer lp doesn't exist on the Quota Storage Server then nothing is done.
+
+  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome
+  
+  Same as above, but if either user jerome or printer lp doesn't exist 
+  on the Quota Storage Server they are automatically added. Also
+  user jerome is put into the groups "coders" and "it" which must
+  already exist in the Quota Storage.
+            
+  $ edpykota -g -S 500 -H 550 financial support            
+  
+  This will set print quota soft limit to 500 pages and hard limit
+  to 550 pages for groups financial and support on all printers.
+  
+  $ edpykota --reset jerome "jo*"
+  
+  This will reset jerome's page counter to zero on all printers, as
+  well as every user whose name begins with 'jo'.
+  Their life time page counter on each printer will be kept unchanged.
+  You can also reset the life time page counters by using the
+  --hardreset | -R command line option.
+  
+  $ edpykota --printer hpcolor --noquota jerome
+  
+  This will tell PyKota to not limit jerome when printing on the 
+  hpcolor printer. All his jobs will be allowed on this printer, but 
+  accounting of the pages he prints will still be kept.
+  Print Quotas for jerome on other printers are unchanged.
+  
+  $ edpykota --limitby balance jerome
+  
+  This will tell PyKota to limit jerome by his account's balance
+  when printing.
+  
+  $ edpykota --balance +10.0 jerome
+  
+  This will increase jerome's account balance by 10.0 (in your
+  own currency). You can decrease the account balance with a
+  dash prefix, and set it to a fixed amount with no prefix.
+  
+  $ edpykota --delete jerome rachel
+  
+  This will completely delete jerome and rachel from the Quota Storage
+  database. All their quotas and jobs will be deleted too.
+  
+  $ edpykota --printer lp --charge 0.1
+  
+  This will set the page price for printer lp to 0.1. Job price
+  will not be changed.
+  
+  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP
+  
+  This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+  When printing either on hplj1 or hplj2, print quota will also be 
+  checked and accounted for on virtual printers Laser and HP.
+  
+  $ edpykota --overcharge 2.5 poorstudent
+  
+  This will overcharge the poorstudent user by a factor of 2.5.
+  
+  $ edpykota --overcharge -1 jerome
+  
+  User jerome will actually earn money whenever he prints.
+  
+  $ edpykota --overcharge 0 boss
+  
+  User boss can print at will, it won't cost him anything because the
+  cost of each print job will be multiplied by zero before charging
+  his account.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""") 
+        
+class EdPyKota(PyKotaTool) :        
+    """A class for edpykota."""
+    def main(self, names, options) :
+        """Edit user or group quotas."""
+        if not self.config.isAdmin :
+            raise PyKotaToolError, "%s : %s" % (pwd.getpwuid(os.geteuid())[0], _("You're not allowed to use this command."))
+        
+        suffix = (options["groups"] and "Group") or "User"        
+        
+        softlimit = hardlimit = None
+
+        used = options["used"]
+        if used :
+            used = used.strip()
+            try :
+                int(used)
+            except ValueError :
+                raise PyKotaToolError, _("Invalid used value %s.") % used
+
+        if not options["noquota"] :
+            if options["softlimit"] :
+                try :
+                    softlimit = int(options["softlimit"].strip())
+                except ValueError :    
+                    raise PyKotaToolError, _("Invalid softlimit value %s.") % options["softlimit"]
+            if options["hardlimit"] :
+                try :
+                    hardlimit = int(options["hardlimit"].strip())
+                except ValueError :    
+                    raise PyKotaToolError, _("Invalid hardlimit value %s.") % options["hardlimit"]
+            if (softlimit is not None) and (hardlimit is not None) and (hardlimit < softlimit) :        
+                # error, exchange them
+                self.printInfo(_("Hard limit %i is less than soft limit %i, values will be exchanged.") % (hardlimit, softlimit))
+                (softlimit, hardlimit) = (hardlimit, softlimit)
+            
+        overcharge = options["overcharge"]
+        if overcharge :
+            try :
+                overcharge = float(overcharge.strip())
+            except (ValueError, AttributeError) :    
+                raise PyKotaToolError, _("Invalid overcharge value %s") % options["overcharge"]
+                
+        balance = options["balance"]
+        if balance :
+            balance = balance.strip()
+            try :
+                balancevalue = float(balance)
+            except ValueError :    
+                raise PyKotaToolError, _("Invalid balance value %s") % options["balance"]
+            
+        if options["charge"] :
+            try :
+                charges = [float(part) for part in options["charge"].split(',', 1)]
+            except ValueError :    
+                raise PyKotaToolError, _("Invalid charge amount value %s") % options["charge"]
+            else :    
+                if len(charges) > 2 :
+                    charges = charges[:2]
+                if len(charges) != 2 :
+                    charges = [charges[0], None]
+                    
+        limitby = options["limitby"]
+        if limitby :
+            limitby = limitby.strip().lower()
+        if limitby and (limitby not in ('quota', 'balance', 'quota-then-balance', 'balance-then-quota')) :    
+            raise PyKotaToolError, _("Invalid limitby value %s") % options["limitby"]
+            
+        if options["ingroups"] :    
+            groupnames = [gname.strip() for gname in options["ingroups"].split(',')]
+        else :    
+            groupnames = []
+            
+        rejectunknown = self.config.getRejectUnknown()    
+        printeradded = 0
+        printers = self.storage.getMatchingPrinters(options["printer"])
+        if not printers :
+            pname = options["printer"]
+            if options["add"] and pname :
+                if self.isValidName(pname) :
+                    printers = [ self.storage.addPrinter(pname) ]
+                    if printers[0].Exists :
+                        printeradded = 1
+                    else :    
+                        raise PyKotaToolError, _("Impossible to add printer %s") % pname
+                else :    
+                    raise PyKotaToolError, _("Invalid printer name %s") % pname
+            else :
+                raise PyKotaToolError, _("There's no printer matching %s") % pname
+        if not names :    
+            if options["delete"] :    
+                raise PyKotaToolError, _("You have to pass user or group names on the command line")
+            else :
+                names = getattr(self.storage, "getAll%ssNames" % suffix)() # all users or groups
+                
+        printersgroups = []        
+        if options["pgroups"] :        
+            printersgroups = self.storage.getMatchingPrinters(options["pgroups"])
+            
+        if options["prototype"] :    
+            protoentry = getattr(self.storage, "get%s" % suffix)(options["prototype"])
+            if not protoentry.Exists :
+                raise PyKotaToolError, _("Prototype object %s not found in Quota Storage.") % protoentry.Name
+            else :    
+                limitby = protoentry.LimitBy
+                balancevalue = protoentry.AccountBalance
+                balance = str(balance)
+                overcharge = getattr(protoentry, "OverCharge", None)
+            
+        todelete = {}    
+        changed = {} # tracks changes made at the user/group level
+        for printer in printers :
+            for pgroup in printersgroups :
+                pgroup.addPrinterToGroup(printer)    
+                
+            if options["charge"] :
+                (perpage, perjob) = charges
+                printer.setPrices(perpage, perjob)    
+                
+            if options["prototype"] :
+                protoquota = getattr(self.storage, "get%sPQuota" % suffix)(protoentry, printer)
+                if not protoquota.Exists :
+                    self.printInfo(_("Prototype %s not found in Quota Storage for printer %s.") % (protoentry.Name, printer.Name))
+                else :    
+                    (softlimit, hardlimit) = (protoquota.SoftLimit, protoquota.HardLimit)
+                    
+            if not options["noquota"] :    
+                if hardlimit is None :    
+                    hardlimit = softlimit
+                    if hardlimit is not None :
+                        self.printInfo(_("Undefined hard limit set to soft limit (%s) on printer %s.") % (str(hardlimit), printer.Name))
+                if softlimit is None :    
+                    softlimit = hardlimit
+                    if softlimit is not None :
+                        self.printInfo(_("Undefined soft limit set to hard limit (%s) on printer %s.") % (str(softlimit), printer.Name))
+                        
+            if options["add"] :    
+                allentries = []    
+                for name in names :
+                    email = ""
+                    if not options["groups"] :
+                        splitname = name.split('/', 1)     # username/email
+                        if len(splitname) == 1 :
+                            splitname.append("")
+                        (name, email) = splitname
+                        if email and (email.count('@') != 1) :
+                            self.printInfo(_("Invalid email address %s") % email)
+                            email = ""
+                    entry = getattr(self.storage, "get%s" % suffix)(name)
+                    if email and not options["groups"] :
+                        entry.Email = email
+                    entrypquota = getattr(self.storage, "get%sPQuota" % suffix)(entry, printer)
+                    allentries.append((entry, entrypquota))
+            else :   
+                allentries = getattr(self.storage, "getPrinter%ssAndQuotas" % suffix)(printer, names)
+                
+            for (entry, entrypquota) in allentries :
+                if not changed.has_key(entry.Name) :
+                    changed[entry.Name] = {}
+                    if not options["groups"] :
+                        changed[entry.Name]["ingroups"] = []
+                        
+                if not entry.Exists :        
+                    # not found
+                    if options["add"] :
+                        # In case we want to add something, it is crucial
+                        # that we DON'T check with the system accounts files
+                        # like /etc/passwd because users may be defined 
+                        # only remotely
+                        if self.isValidName(entry.Name) :
+                            reject = 0
+                            if rejectunknown :
+                                if options["groups"] :
+                                    try :
+                                        grp.getgrnam(entry.Name)
+                                    except KeyError :    
+                                        self.printInfo(_("Unknown group %s") % entry.Name, "error")
+                                        reject = 1
+                                else :    
+                                    try :
+                                        pwd.getpwnam(entry.Name)
+                                    except KeyError :    
+                                        self.printInfo(_("Unknown user %s") % entry.Name, "error")
+                                        reject = 1
+                            if not reject :        
+                                entry = getattr(self.storage, "add%s" % suffix)(entry)
+                        else :    
+                            if options["groups"] :
+                                self.printInfo(_("Invalid group name %s") % entry.Name)
+                            else :    
+                                self.printInfo(_("Invalid user name %s") % entry.Name)
+                elif options["delete"] :                
+                    todelete[entry.Name] = entry
+                                
+                if entry.Exists and (not entrypquota.Exists) :
+                    # not found
+                    if options["add"] :
+                        entrypquota = getattr(self.storage, "add%sPQuota" % suffix)(entry, printer)
+                        
+                if not entrypquota.Exists :     
+                    self.printInfo(_("Quota not found for object %s on printer %s.") % (entry.Name, printer.Name))
+                else :    
+                    if options["noquota"] or options["prototype"] or ((softlimit is not None) and (hardlimit is not None)) :
+                        entrypquota.setLimits(softlimit, hardlimit)
+                    if limitby :
+                        if changed[entry.Name].get("limitby") is None :
+                            entry.setLimitBy(limitby)
+                            changed[entry.Name]["limitby"] = limitby
+                    
+                    if options["reset"] :
+                        entrypquota.reset()
+                        
+                    if options["hardreset"] :    
+                        entrypquota.hardreset()
+                        
+                    if not options["groups"] :
+                        if used :
+                            entrypquota.setUsage(used)
+                            
+                        if overcharge is not None :    
+                            if changed[entry.Name].get("overcharge") is None :
+                                entry.setOverChargeFactor(overcharge)
+                                changed[entry.Name]["overcharge"] = overcharge
+                                
+                        if balance :
+                            if changed[entry.Name].get("balance") is None :
+                                if balance.startswith("+") or balance.startswith("-") :
+                                    newbalance = float(entry.AccountBalance or 0.0) + balancevalue
+                                    newlifetimepaid = float(entry.LifeTimePaid or 0.0) + balancevalue
+                                    entry.setAccountBalance(newbalance, newlifetimepaid)
+                                else :
+                                    diff = balancevalue - float(entry.AccountBalance or 0.0)
+                                    newlifetimepaid = float(entry.LifeTimePaid or 0.0) + diff
+                                    entry.setAccountBalance(balancevalue, newlifetimepaid)
+                                changed[entry.Name]["balance"] = balance
+                                
+                        for groupname in groupnames :        
+                            # not executed if option --ingroups is not used
+                            if groupname not in changed[entry.Name]["ingroups"] :
+                                group = self.storage.getGroup(groupname)
+                                if group.Exists :
+                                    self.storage.addUserToGroup(entry, group)
+                                    changed[entry.Name]["ingroups"].append(groupname)
+                                else :
+                                    self.printInfo(_("Group %s not found in the PyKota Storage.") % groupname)
+                        
+        # Now delete what has to be deleted                
+        for (name, entry) in todelete.items() :                
+            entry.delete()
+                     
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        defaults = { \
+                     "printer" : "*", \
+                   }
+        short_options = "vhdo:c:l:b:i:naugrp:P:S:H:G:RU:"
+        long_options = ["help", "version", "overcharge=", "charge=", "delete", "limitby=", "balance=", "ingroups=", "noquota", "add", "users", "groups", "reset", "hardreset", "prototype=", "printer=", "softlimit=", "hardlimit=", "pgroups=", "used="]
+        
+        # Initializes the command line tool
+        editor = EdPyKota(doc=__doc__)
+        editor.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = editor.parseCommandline(sys.argv[1:], short_options, long_options)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["add"] = options["a"] or options["add"]
+        options["users"] = options["u"] or options["users"]
+        options["groups"] = options["g"] or options["groups"]
+        options["prototype"] = options["p"] or options["prototype"]
+        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
+        options["softlimit"] = options["S"] or options["softlimit"]
+        options["hardlimit"] = options["H"] or options["hardlimit"] 
+        options["reset"] = options["r"] or options["reset"] 
+        options["noquota"] = options["n"] or options["noquota"]
+        options["limitby"] = options["l"] or options["limitby"]
+        options["balance"] = options["b"] or options["balance"] 
+        options["delete"] = options["d"] or options["delete"] 
+        options["ingroups"] = options["i"] or options["ingroups"]
+        options["charge"] = options["c"] or options["charge"]
+        options["pgroups"] = options["G"] or options["pgroups"]
+        options["hardreset"] = options["R"] or options["hardreset"] 
+        options["used"] = options["U"] or options["used"]
+        options["overcharge"] = options["o"] or options["overcharge"]
+        
+        if options["help"] :
+            editor.display_usage_and_quit()
+        elif options["version"] :
+            editor.display_version_and_quit()
+        elif options["users"] and options["groups"] :    
+            raise PyKotaToolError, _("incompatible options, see help.")
+        elif (options["add"] or options["prototype"]) and options["delete"] :    
+            raise PyKotaToolError, _("incompatible options, see help.")
+        elif (options["reset"] or options["hardreset"] or options["limitby"] or options["used"] or options["balance"] or options["overcharge"] or options["softlimit"] or options["hardlimit"]) and options["prototype"] :
+            raise PyKotaToolError, _("incompatible options, see help.")
+        elif options["noquota"] and (options["prototype"] or options["hardlimit"] or options["softlimit"]) :
+            raise PyKotaToolError, _("incompatible options, see help.")
+        elif options["groups"] and (options["balance"] or options["ingroups"] or options["used"] or options["overcharge"]) :
+            raise PyKotaToolError, _("incompatible options, see help.")
+        else :
+            retcode = editor.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            editor.crashed("edpykota failed")
+        except :    
+            crashed("edpykota failed")
+        retcode = -1
+
+    try :
+        editor.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/waitprinter.sh
===================================================================
--- pykota/tags/1.22/bin/waitprinter.sh (revision 2146)
+++ pykota/tags/1.22/bin/waitprinter.sh (revision 2146)
@@ -0,0 +1,89 @@
+#! /bin/sh
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# You're welcome to redistribute this software under the
+# terms of the GNU General Public Licence version 2.0
+# or, at your option, any higher version.
+#
+# You can read the complete GNU GPL in the file COPYING
+# which should come along with this software, or visit
+# the Free Software Foundation's WEB site http://www.fsf.org
+#
+# $Id$
+#
+# First version by Matt Hyclak & Jerome Alet
+# Rewritten from scratch, and contributed to PyKota, by Christian Andreetta
+# and Paolo Nobili
+
+# If ending phase, after the job has been fully transmitted to the printer
+# we have to wait for the printer being in printing mode before checking
+# if it is idle, otherwise we could have problems with slow printers.
+#--------------------------------------------------------------------------
+PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin
+#--------------------------------------------------------------------------
+LOG_FILE=/var/log/pykota-waitprinter-snmpread.log
+LOG_DO_FLAG=""  #set different from null for file logging
+IDLE_WAIT_NUM=3 #number of snmp reads to consider the printer _really_ idle
+SNMP_DELAY=2    #seconds between snmp reads
+#--------------------------------------------------------------------------
+# END OF CONF
+#--------------------------------------------------------------------------
+function log_msg() {
+        if [ -n "${LOG_DO_FLAG}" ]; then
+                echo `date` "$*" >> ${LOG_FILE}
+        fi
+}
+#--------------------------------------------------------------------------
+function printer_status_get() {
+        local printer="$1"
+        PRINTER_STATUS=`snmpget -v1 -c public -Ov ${printer} HOST-RESOURCES-MIB::hrPrinterStatus.1`
+}
+#--------------------------------------------------------------------------
+function printing_wait() {
+        local printer="$1"
+        log_msg "CICLE: printing_wait"
+        while [ 1 ]; do
+                printer_status_get "${printer}"
+                log_msg "${PRINTER_STATUS}"
+                echo "${PRINTER_STATUS}" | grep -iE '(printing)|(idle)' >/dev/null && break
+                sleep ${SNMP_DELAY}
+        done
+}
+#--------------------------------------------------------------------------
+function idle_wait() {
+        local printer="$1" idle_num=0 idle_flag=0
+        log_msg "CICLE: idle_wait"
+        while [ ${idle_num} -lt ${IDLE_WAIT_NUM} ]; do
+                printer_status_get "${printer}"
+                log_msg "${PRINTER_STATUS}"
+                idle_flag=0
+                echo "${PRINTER_STATUS}" | grep -iE '(idle)' >/dev/null && idle_flag=1
+                if [ ${idle_flag} -gt 0 ]; then
+                        idle_num=$((idle_num+1))
+                else
+                        idle_num=0
+                fi
+                sleep ${SNMP_DELAY}
+        done
+}
+#--------------------------------------------------------------------------
+function main() {
+        local printer="$1"
+        log_msg "BEGIN"
+        ##log_msg "`ls -la /var/spool/{cups,samba}`"
+        log_msg "Pykota Phase: ${PYKOTAPHASE}"
+        if [ x$PYKOTASTATUS != "xCANCELLED" ] && [ x$PYKOTAACTION != "xDENY" ] && [ x$PYKOTAPHASE = "xAFTER" ] ; then
+                printing_wait "${printer}"
+        fi
+        idle_wait "${printer}" #in any case
+        ##log_msg "`ls -la /var/spool/{cups,samba}`"
+        log_msg "END"
+}
+#==========================================================================
+# MAIN
+#==========================================================================
+PRINTER_STATUS=""
+main "$1"
+exit $?
Index: pykota/tags/1.22/bin/papwaitprinter.sh
===================================================================
--- pykota/tags/1.22/bin/papwaitprinter.sh (revision 2146)
+++ pykota/tags/1.22/bin/papwaitprinter.sh (revision 2146)
@@ -0,0 +1,20 @@
+#! /bin/sh
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# You're welcome to redistribute this software under the
+# terms of the GNU General Public Licence version 2.0
+# or, at your option, any higher version.
+#
+# You can read the complete GNU GPL in the file COPYING
+# which should come along with this software, or visit
+# the Free Software Foundation's WEB site http://www.fsf.org
+#
+# $Id$
+#
+PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin
+sleep 5;
+until papstatus -p "$1" | grep -i idle >/dev/null ; do 
+   sleep 1 ; 
+done
Index: pykota/tags/1.22/bin/snmpprinterstatus
===================================================================
--- pykota/tags/1.22/bin/snmpprinterstatus (revision 2146)
+++ pykota/tags/1.22/bin/snmpprinterstatus (revision 2146)
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import time
+
+OIDS = ["hrPrinterDetectedErrorState", "hrPrinterStatus", "hrDeviceStatus"]
+SNMPCOMMAND = "snmpget -v1 -c public -Ov %(printer)s HOST-RESOURCES-MIB::%(oid)s.1" 
+
+def main() :
+    if len(sys.argv) != 2 :
+        sys.stderr.write("usage : snmpprinterstatus yourprinter.example.com\n")
+    else :    
+        printer = sys.argv[1]
+        while 1 :
+            try :
+                for oid in OIDS :    
+                    command = SNMPCOMMAND % locals()
+                    output = os.popen(command)
+                    result = output.read().strip()
+                    status = output.close()
+                    print oid, "===>", result
+            except KeyboardInterrupt :        
+                break
+            time.sleep(0.5)
+
+if __name__ == "__main__" :
+    sys.exit(main())
+
Index: pykota/tags/1.22/bin/pykotme
===================================================================
--- pykota/tags/1.22/bin/pykotme (revision 2232)
+++ pykota/tags/1.22/bin/pykotme (revision 2232)
@@ -0,0 +1,166 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Quote sender
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+from pykota.pdlanalyzer import PDLAnalyzer, PDLAnalyzerError
+
+__doc__ = N_("""pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+
+Gives print quotes to users.
+
+command line usage :
+
+  pykotme  [options]  [files]
+
+options :
+
+  -v | --version       Prints pykotme's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -P | --printer p     Gives a quote for this printer only. Actually p can
+                       use wildcards characters to select only
+                       some printers. The default value is *, meaning
+                       all printers.
+                       You can specify several names or wildcards, 
+                       by separating them with commas.
+  
+examples :                              
+
+  $ pykotme --printer apple file1.ps file2.ps
+  
+  This will give a print quote to the current user. The quote will show
+  the price and size of a job consisting in file1.ps and file2.ps 
+  which would be sent to the apple printer.
+  
+  $ pykotme --printer apple,hplaser <file1.ps
+  
+  This will give a print quote to the current user. The quote will show
+  the price and size of a job consisting in file1.ps as read from
+  standard input, which would be sent to the apple or hplaser
+  printer.
+
+  $ pykotme 
+  
+  This will give a quote for a job consisting of what is on standard 
+  input. The quote will list the job size, and the price the job
+  would cost on each printer.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+        
+class PyKotMe(PyKotaTool) :        
+    """A class for pykotme."""
+    def main(self, files, options) :
+        """Gives print quotes."""
+        if (not sys.stdin.isatty()) and ("-" not in files) :
+            files.append("-")
+        totalsize = 0    
+        for filename in files :    
+            try :
+                parser = PDLAnalyzer(filename)
+                totalsize += parser.getJobSize()
+            except PDLAnalyzerError, msg :    
+                self.printInfo(msg)
+            
+        printers = self.storage.getMatchingPrinters(options["printer"])
+        if not printers :
+            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
+            
+        username = pwd.getpwuid(os.getuid())[0]
+        user = self.storage.getUser(username)
+        if user.Exists and user.LimitBy and (user.LimitBy.lower() == "balance"):
+            print _("Your account balance : %.2f") % (user.AccountBalance or 0.0)
+            
+        print _("Job size : %i pages") % totalsize    
+        if user.Exists :
+            for printer in printers :
+                userpquota = self.storage.getUserPQuota(user, printer)
+                if userpquota.Exists :
+                    cost = userpquota.computeJobPrice(totalsize)
+                    print _("Cost on printer %s : %.2f") % (printer.Name, cost)
+            
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        defaults = { \
+                     "printer" : "*", \
+                   }
+        short_options = "vhP:"
+        long_options = ["help", "version", "printer="]
+        
+        # Initializes the command line tool
+        sender = PyKotMe(doc=__doc__)
+        sender.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = sender.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
+        
+        if options["help"] :
+            sender.display_usage_and_quit()
+        elif options["version"] :
+            sender.display_version_and_quit()
+        else :
+            retcode = sender.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            sender.crashed("pykotme failed")
+        except :    
+            crashed("pykotme failed")
+        retcode = -1
+
+    try :
+        sender.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/pkhint
===================================================================
--- pykota/tags/1.22/bin/pkhint (revision 2216)
+++ pykota/tags/1.22/bin/pkhint (revision 2216)
@@ -0,0 +1,264 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota tool to hint for printer accounters
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+
+from pykota.tool import Tool, PyKotaToolError, crashed, N_
+try :
+    import pysnmp
+except ImportError :    
+    hasSNMP = 0
+else :    
+    hasSNMP = 1
+
+__doc__ = N_("""pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+
+command line usage :
+
+  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+
+options :
+
+  -v | --version       Prints pkhint's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+examples :                              
+
+  $ pkhint "hp*" printer103 </etc/cups/printers.conf
+  
+  Will analyze your printing system to test which accounter
+  is the best for each of the defined printer which
+  name matches one of the parameters.
+  
+  If you don't pass any argument on the command line, all
+  printers will be analyzed.
+  
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+SNMPTESTS = [ \
+              'npadmin --pagecount %(printer)s 2>/dev/null', \
+              'snmpget -v1 -c public -Ov %(printer)s mib-2.43.10.2.1.4.1.1 2>/dev/null | cut -f 2,2 -d " "', \
+              'snmpwalk -v 1 -Cc -c public %(printer)s 2>/dev/null | grep mib-2.43.10.2.1.4.1.1 | cut -d " " -f4', \
+              'snmpwalk -v 1 -Cc -c public -Ov %(printer)s 2>/dev/null | grep Counter32 | tail -2 | head -1 | cut -d " " -f2', \
+            ]
+            
+NETPJLTESTS = [ \
+                '/usr/share/pykota/pagecount.pl %(printer)s %(port)s 2>/dev/null', \
+                'nc -w 2 %(printer)s %(port)s </usr/share/pykota/pagecount.pjl 2>/dev/null | tail -2', \
+              ]
+              
+class PKHint(Tool) :
+    """A class to autodetect the best accounting method for printers."""
+    def extractPrintersInformation(self) :    
+        """Extracts printer information from the printing system.
+          
+           Returns a mapping { queuename : device, ... }
+        """   
+        printers = {}
+        current_printer = None
+        for line in [l.strip() for l in sys.stdin.readlines()] :
+            testline = line.lower()
+            if testline.startswith("<printer ") or testline.startswith("<defaultprinter ") :
+                # beginning of a CUPS printer definition
+                current_printer = line.split()[-1][:-1]
+            elif testline.startswith("</printer ") :
+                # end of a CUPS printer definition
+                current_printer = None
+            elif testline.startswith("deviceuri ") :
+                # CUPS printer device_uri
+                device = testline.split()[-1]
+                if current_printer is not None :
+                    printers[current_printer] = device
+            else :        
+                # LPRng printcap specific code here
+                pass
+        return printers
+        
+    def extractDevices(self) :    
+        """Extracts the list of available CUPS devices.
+        
+           Returns a mapping { device : devicetype, ... }
+           
+           WARNING : CUPS ONLY FOR NOW
+        """   
+        inp = os.popen("lpinfo -v 2>/dev/null")
+        deviceslist = [l.strip() for l in inp.readlines()]
+        inp.close()
+        devicestypes = {}
+        for device in deviceslist :
+            (dtype, dname) = device.split()
+            devicestypes[dname] = dtype
+        return devicestypes
+        
+    def searchDeviceType(self, devicestypes, device) :    
+        """Returns the device type for current device."""
+        if device.startswith("cupspykota:") :
+            fulldevice = device[:]
+            device = fulldevice[len("cupspykota:"):]
+            if device.startswith("//") :
+                device = device[2:]
+        for (k, v) in devicestypes.items() :
+            if device.startswith(k) :
+                return v
+                
+    def extractDeviceFromURI(self, device) :    
+        """Cleans the device URI to remove any trace of PyKota."""
+        if device.startswith("cupspykota:") :
+            fulldevice = device[:]
+            device = fulldevice[len("cupspykota:"):]
+            if device.startswith("//") :
+                device = device[2:]
+        try :
+            (backend, destination) = device.split(":", 1) 
+        except ValueError :    
+            raise PyKotaToolError, _("Invalid DeviceURI : %s") % device
+        while destination.startswith("/") :
+            destination = destination[1:]
+        checkauth = destination.split("@", 1)    
+        if len(checkauth) == 2 :
+            destination = checkauth[1]
+        return destination.split("/")[0]
+        
+    def accepts(self, commands, printer, port=None) :    
+        """Tries to get the printer's internal page counter via SNMP."""
+        for command in commands :
+            inp = os.popen(command % locals())
+            value = inp.readline().strip()
+            inp.close()
+            try :
+                pagecounter = int(value)
+            except :    
+                pass
+            else :    
+                if port is None :
+                    return command
+                else :    
+                    return command.replace("%(port)s", str(port))
+        
+    def main(self, args, options) :
+        """Main work is done here."""
+        os.environ["PATH"] = "%s:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin" % os.environ.get("PATH", "")
+        sys.stderr.write("BEWARE : This tool doesn't support LPRng's printcap files yet.\n")
+        print _("\nPlease wait while pkhint analyzes your printing system's configuration...")
+        printers = self.extractPrintersInformation()
+        devicestypes = self.extractDevices() # TODO : IT'S CUPS ONLY FOR NOW
+        configuration = []
+        for (printer, deviceuri) in printers.items() :
+            if self.matchString(printer, args) :
+                devicetype = self.searchDeviceType(devicestypes, deviceuri)
+                device = self.extractDeviceFromURI(deviceuri)
+                if devicetype is None :
+                    self.printInfo(_("Unknown device %s for printer %s") % (device, printer))
+                elif devicetype == "network" :
+                    try :
+                        hostname, port = device.split(':')
+                    except ValueError :    
+                        hostname = device
+                        port = 9100             # TODO : may cause problems with other protocols.
+                        
+                    snmpcommand = self.accepts(SNMPTESTS, hostname)
+                    if snmpcommand is not None :
+                        if hasSNMP and snmpcommand.startswith("snmpget ") :
+                            # don't do a more complex test, just consider it will work
+                            accounter = 'hardware(snmp)'
+                        else :    
+                            accounter = 'hardware(/usr/share/pykota/waitprinter.sh %(printer)s && ' + snmpcommand + ')'
+                        configuration.append((printer, accounter))
+                    else :    
+                        netpjlcommand = self.accepts(NETPJLTESTS, hostname, port)
+                        if netpjlcommand is not None :
+                            #accounter = 'hardware(' + netpjlcommand + ')'
+                            accounter = 'hardware(pjl)'
+                            configuration.append((printer, accounter))
+                        else :    
+                            configuration.append((printer, "software()"))
+                else :
+                    configuration.append((printer, "software()"))
+                    
+        if not configuration :            
+            print "\nSorry, pkhint can't help you for now. Please configure PyKota manually."
+        else :
+            print _("\nPut the following lines into your /etc/pykota/pykota.conf file :\n")
+            print _("# BEWARE : if software accounting is suggested, this doesn't mean")
+            print _("# that hardware accounting wouldn't work, this only means that PyKota")
+            print _("# wasn't able to autodetect which hardware accounting method to use.")
+            for (printer, accounter) in configuration :
+                print "[%s]" % printer
+                print "accounter: %s" % accounter
+                print    
+        
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        short_options = "hv"
+        long_options = ["help", "version"]
+        
+        # Initializes the command line tool
+        manager = PKHint(doc=__doc__)
+        manager.deferredInit()
+        
+        (options, args) = manager.parseCommandline(sys.argv[1:], short_options, long_options)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        
+        if options["help"] :
+            manager.display_usage_and_quit()
+        elif options["version"] :
+            manager.display_version_and_quit()
+        else :
+            if not args :
+                args = [ "*" ]
+            retcode = manager.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            manager.crashed("pkhint failed")
+        except :    
+            crashed("pkhint failed")
+        retcode = -1
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/README
===================================================================
--- pykota/tags/1.22/bin/README (revision 2146)
+++ pykota/tags/1.22/bin/README (revision 2146)
@@ -0,0 +1,25 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains the print filters and command line tools
+which really make PyKota what it is.
+
+====================================================================
Index: pykota/tags/1.22/bin/repykota
===================================================================
--- pykota/tags/1.22/bin/repykota (revision 2216)
+++ pykota/tags/1.22/bin/repykota (revision 2216)
@@ -0,0 +1,176 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Reports generator
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+
+from mx import DateTime
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+from pykota.config import PyKotaConfigError
+from pykota.storage import PyKotaStorageError
+from pykota.reporter import PyKotaReporterError
+from pykota import reporter
+
+__doc__ = N_("""repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+
+Generates print quota reports.
+
+command line usage :
+
+  repykota [options] 
+
+options :
+
+  -v | --version       Prints repykota's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -u | --users         Generates a report on users quota, this is 
+                       the default.
+  
+  -g | --groups        Generates a report on group quota instead of users.
+  
+  -P | --printer p     Report quotas on this printer only. Actually p can
+                       use wildcards characters to select only
+                       some printers. The default value is *, meaning
+                       all printers.
+                       You can specify several names or wildcards, 
+                       by separating them with commas.
+  
+examples :                              
+
+  $ repykota --printer lp
+  
+  This will print the quota status for all users who use the lp printer.
+
+  $ repykota 
+  
+  This will print the quota status for all users on all printers.
+  
+  $ repykota --printer "laser*,*pson" jerome "jo*"
+  
+  This will print the quota status for user jerome and all users
+  whose name begins with "jo" on all printers which name begins
+  with "laser" or ends with "pson".
+  
+  If launched by an user who is not a PyKota administrator, additionnal
+  arguments representing users or groups names are ignored, and only the
+  current user/group is reported.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+class RePyKota(PyKotaTool) :        
+    """A class for repykota."""
+    def main(self, ugnames, options) :
+        """Print Quota reports generator."""
+        if self.config.isAdmin :
+            # PyKota administrator
+            if not ugnames :
+                # no username, means all usernames
+                ugnames = [ "*" ]
+        else :        
+            # not the root user
+            # reports only the current user
+            username = pwd.getpwuid(os.geteuid())[0]
+            if options["groups"] :
+                user = self.storage.getUser(username)
+                if user.Exists :
+                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
+                else :    
+                    ugnames = [ ]
+            else :
+                ugnames = [ username ]
+        
+        printers = self.storage.getMatchingPrinters(options["printer"])
+        if not printers :
+            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
+            
+        self.reportingtool = reporter.openReporter(self, "text", printers, ugnames, (options["groups"] and 1) or 0)    
+        print self.reportingtool.generateReport()
+                    
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        defaults = { \
+                     "printer" : "*", \
+                   }
+        short_options = "vhugP:"
+        long_options = ["help", "version", "users", "groups", "printer="]
+        
+        # Initializes the command line tool
+        reportTool = RePyKota(doc=__doc__)
+        reportTool.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = reportTool.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["users"] = options["u"] or options["users"]
+        options["groups"] = options["g"] or options["groups"]
+        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
+        
+        if options["help"] :
+            reportTool.display_usage_and_quit()
+        elif options["version"] :
+            reportTool.display_version_and_quit()
+        elif options["users"] and options["groups"] :    
+            raise PyKotaToolError, _("incompatible options, see help.")
+        else :
+            retcode = reportTool.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            reportTool.crashed("repykota failed")
+        except :    
+            crashed("repykota failed")
+        retcode = -1
+
+    try :
+        reportTool.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/warnpykota
===================================================================
--- pykota/tags/1.22/bin/warnpykota (revision 2216)
+++ pykota/tags/1.22/bin/warnpykota (revision 2216)
@@ -0,0 +1,191 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Warning sender
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+from pykota.config import PyKotaConfigError
+from pykota.storage import PyKotaStorageError
+
+__doc__ = N_("""warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+
+Sends mail to users over print quota.
+
+command line usage :
+
+  warnpykota  [options]  [names]
+
+options :
+
+  -v | --version       Prints warnpykota's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -u | --users         Warns users over their print quota, this is the 
+                       default.
+  
+  -g | --groups        Warns users whose groups quota are over limit.
+  
+  -P | --printer p     Verify quotas on this printer only. Actually p can
+                       use wildcards characters to select only
+                       some printers. The default value is *, meaning
+                       all printers.
+                       You can specify several names or wildcards, 
+                       by separating them with commas.
+  
+examples :                              
+
+  $ warnpykota --printer lp
+  
+  This will warn all users of the lp printer who have exceeded their
+  print quota.
+
+  $ warnpykota 
+  
+  This will warn all users  who have exceeded their print quota on
+  any printer.
+
+  $ warnpykota --groups --printer "laserjet*" "dev*"
+  
+  This will warn all users of groups which names begins with "dev" and
+  who have exceeded their print quota on any printer which name begins 
+  with "laserjet"
+  
+  If launched by an user who is not a PyKota administrator, additionnal
+  arguments representing users or groups names are ignored, and only the
+  current user/group is reported.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+class WarnPyKota(PyKotaTool) :        
+    """A class for warnpykota."""
+    def main(self, ugnames, options) :
+        """Warn users or groups over print quota."""
+        if self.config.isAdmin :
+            # PyKota administrator
+            if not ugnames :
+                # no username, means all usernames
+                ugnames = [ "*" ]
+        else :        
+            # not a PyKota administrator
+            # warns only the current user
+            # the utility of this is discutable, but at least it
+            # protects other users from mail bombing if they are
+            # over quota.
+            username = pwd.getpwuid(os.geteuid())[0]
+            if options["groups"] :
+                user = self.storage.getUser(username)
+                if user.Exists :
+                    ugnames = [ g.Name for g in self.storage.getUserGroups(user) ]
+                else :    
+                    ugnames = [ ]
+            else :
+                ugnames = [ username ]
+        
+        printers = self.storage.getMatchingPrinters(options["printer"])
+        if not printers :
+            raise PyKotaToolError, _("There's no printer matching %s") % options["printer"]
+        alreadydone = {}
+        for printer in printers :
+            if options["groups"] :
+                for (group, grouppquota) in self.storage.getPrinterGroupsAndQuotas(printer, ugnames) :
+                    self.warnGroupPQuota(grouppquota)
+            else :
+                for (user, userpquota) in self.storage.getPrinterUsersAndQuotas(printer, ugnames) :
+                    # we only want to warn users who have ever printed something
+                    # and don't want to warn users who have never printed
+                    if (user.AccountBalance and (user.AccountBalance != user.LifeTimePaid)) or \
+                       userpquota.PageCounter or userpquota.LifePageCounter or \
+                       self.storage.getUserNbJobsFromHistory(user) :
+                        done = alreadydone.get(user.Name)
+                        if (user.LimitBy.lower() != 'balance') or not done :
+                            action = self.warnUserPQuota(userpquota)
+                            if not done :
+                                alreadydone[user.Name] = (action in ('WARN', 'DENY'))
+                     
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        defaults = { \
+                     "printer" : "*", \
+                   }
+        short_options = "vhugP:"
+        long_options = ["help", "version", "users", "groups", "printer="]
+        
+        # Initializes the command line tool
+        sender = WarnPyKota(doc=__doc__)
+        sender.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = sender.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["users"] = options["u"] or options["users"]
+        options["groups"] = options["g"] or options["groups"]
+        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
+        
+        if options["help"] :
+            sender.display_usage_and_quit()
+        elif options["version"] :
+            sender.display_version_and_quit()
+        elif options["users"] and options["groups"] :    
+            raise PyKotaToolError, _("incompatible options, see help.")
+        else :
+            retcode = sender.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            sender.crashed("warnpykota failed")
+        except :    
+            crashed("warnpykota failed")
+        retcode = -1
+        
+    try :
+        sender.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/pkbanner
===================================================================
--- pykota/tags/1.22/bin/pkbanner (revision 2216)
+++ pykota/tags/1.22/bin/pkbanner (revision 2216)
@@ -0,0 +1,338 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# A banner generator for PyKota
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import time
+import cStringIO
+import popen2
+
+try :
+    from reportlab.pdfgen import canvas
+    from reportlab.lib import pagesizes
+    from reportlab.lib.units import cm
+except ImportError :    
+    hasRL = 0
+else :    
+    hasRL = 1
+    
+try :
+    import PIL.Image 
+except ImportError :    
+    hasPIL = 0
+else :    
+    hasPIL = 1
+    
+from pykota.tool import Tool, PyKotaToolError, crashed, N_
+
+__doc__ = N_("""pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+
+Generates banners.
+
+command line usage :
+
+  pkbanner  [options]  [more info]
+
+options :
+
+  -v | --version       Prints pkbanner's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -l | --logo img      Use the image as the banner's logo. The logo will
+                       be drawn at the center top of the page. The default
+                       logo is /usr/share/pykota/logos/pykota.jpeg
+                       
+  -p | --pagesize sz   Sets sz as the page size. Most well known
+                       page sizes are recognized, like 'A4' or 'Letter'
+                       to name a few. The default size is A4.
+  
+  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be 
+                       used to save toner. The default value is 0, which
+                       means that no toner saving will be done.
+  
+  -u | --url u         Uses u as an url to be written at the bottom of 
+                       the banner page. The default url is :
+                       http://www.librelogiciel.com/software/
+  
+examples :                              
+
+  Using pkbanner directly from the command line is not recommended,
+  excepted for testing purposes. You should use pkbanner in the
+  'startingbanner' or 'endingbanner' directives in pykota.conf
+  
+    startingbanner: /usr/bin/pkbanner --logo="" --savetoner=75
+  
+      With such a setting in pykota.conf, all print jobs will be 
+      prefixed with an A4 banner with no logo, and text luminosity will
+      be increased by 75%%. The PostScript output will be directly sent
+      to your printer.
+      
+  You'll find more examples in the sample configuration file included    
+  in PyKota.
+      
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+class PyKotaBanner(Tool) :        
+    """A class for pkbanner."""
+    def getPageSize(self, pgsize) :
+        """Returns the correct page size or None if not found."""
+        try :
+            return getattr(pagesizes, pgsize.upper())
+        except AttributeError :    
+            try :
+                return getattr(pagesizes, pgsize.lower())
+            except AttributeError :
+                pass
+                
+    def getVar(self, varname) :            
+        """Extracts a variable from the environment and returns its value or 'Unknown' in the current locale."""
+        return os.environ.get(varname) or _("Unknown")
+        
+    def printVar(self, canvas, x, y, label, value, size, savetoner) :
+        """Outputs a variable onto the PDF canvas.
+        
+           Returns the number of points to substract to current Y coordinate.
+        """   
+        canvas.saveState()
+        canvas.setFont("Helvetica-Bold", size)
+        (r, g, b) =  [ color + (savetoner * (1.0 - color)) for color in (0, 0, 0) ] # Black * savetoner
+        canvas.setFillColorRGB(r, g, b)
+        message = "%s :" % _(label)
+        canvas.drawRightString(x, y, message)
+        canvas.setFont("Courier-Bold", size)
+        (r, g, b) =  [ color + (savetoner * (1.0 - color)) for color in (1, 0, 0) ] # Red * savetoner
+        canvas.setFillColorRGB(r, g, b)
+        canvas.drawString(x + 0.5*cm, y, value)
+        canvas.restoreState()
+        return (size + 4)
+    
+    def genPDF(self, pagesize, logo, url, text, savetoner) :
+        """Generates the banner in PDF format, return the PDF document as a string."""
+        document = cStringIO.StringIO()
+        c = canvas.Canvas(document, pagesize=pagesize, pageCompression=1)
+        
+        c.setAuthor("Jerome Alet")
+        c.setTitle("PyKota generated Banner")
+        c.setSubject("This is a print banner generated with PyKota")
+        
+        xcenter = pagesize[0] / 2.0
+        ycenter = pagesize[1] / 2.0
+                    
+        ypos = pagesize[1] - (2 * cm)            
+        
+        if logo :
+            try :    
+                imglogo = PIL.Image.open(logo)
+            except :    
+                self.printInfo("Unable to open image %s" % logo, "warn")
+            else :
+                (width, height) = imglogo.size
+                multi = float(width) / (8 * cm) 
+                width = float(width) / multi
+                height = float(height) / multi
+                xpos = xcenter - (width / 2.0)
+                ypos -= height
+                c.drawImage(logo, xpos, ypos, width, height)
+        
+        # New top
+        xpos = pagesize[0] / 5.0
+        ypos -= (1 * cm) + 20
+        
+        printername = self.getVar("PYKOTAPRINTERNAME")
+        username = self.getVar("PYKOTAUSERNAME")
+        accountbanner = self.config.getAccountBanner(printername)
+        
+        # Outputs the username
+        ypos -= self.printVar(c, xcenter, ypos, _("Username"), username, 20, savetoner) 
+        
+        # Text    
+        if text :
+            ypos -= self.printVar(c, xcenter, ypos, _("More Info"), text, 20, savetoner) 
+        
+        # Printer and Job Id
+        job = "%s - %s" % (printername, self.getVar("PYKOTAJOBID"))
+        ypos -= self.printVar(c, xcenter, ypos, _("Job"), job, 14, savetoner) 
+        
+        # Current date (TODO : at the time the banner was printed ! Change this to job's submission date)
+        datetime = time.strftime("%c", time.localtime())
+        ypos -= self.printVar(c, xcenter, ypos, _("Date"), datetime, 14, savetoner) 
+        
+        # Result of the print job
+        action = self.getVar("PYKOTAACTION")
+        if action == "ALLOW" :
+            action = _("Allowed")
+        elif action == "DENY" :    
+            action = _("Denied")
+        elif action == "WARN" :    
+            action = _("Allowed with Warning")
+        ypos -= self.printVar(c, xcenter, ypos, _("Result"), action, 14, savetoner) 
+        
+        # skip some space
+        ypos -= 20
+        
+        # Outputs title and filename
+        # We put them at x=0.25*pagewidth so that the line is long enough to hold them
+        title = self.getVar("PYKOTATITLE")
+        ypos -= self.printVar(c, xcenter / 2.0, ypos, _("Title"), title, 10, savetoner) 
+        
+        filename = self.getVar("PYKOTAFILENAME")
+        ypos -= self.printVar(c, xcenter / 2.0, ypos, _("Filename"), filename, 10, savetoner) 
+        
+        # skip some space
+        ypos -= 20
+        
+        # Now outputs the user's account balance or page counter
+        ypos -= self.printVar(c, xcenter, ypos, _("Pages printed so far on %s") % printername, self.getVar("PYKOTAPAGECOUNTER"), 14, savetoner) 
+        limitby = self.getVar("PYKOTALIMITBY")
+        if limitby == "balance" :  
+            ypos -= self.printVar(c, xcenter, ypos, _("Account balance"), self.getVar("PYKOTABALANCE"), 14, savetoner) 
+        else :
+            ypos -= self.printVar(c, xcenter, ypos, _("Soft Limit"), self.getVar("PYKOTASOFTLIMIT"), 14, savetoner) 
+            ypos -= self.printVar(c, xcenter, ypos, _("Hard Limit"), self.getVar("PYKOTAHARDLIMIT"), 14, savetoner) 
+            ypos -= self.printVar(c, xcenter, ypos, _("Date Limit"), self.getVar("PYKOTADATELIMIT"), 14, savetoner) 
+            
+        # URL
+        if url :
+            c.saveState()
+            c.setFont("Courier-Bold", 16)
+            (r, g, b) =  [ color + (savetoner * (1.0 - color)) for color in (0, 0, 1) ] # Blue * savetoner
+            c.setFillColorRGB(r, g, b)
+            c.drawCentredString(xcenter, 2 * cm, url)
+            c.restoreState()
+        
+        c.showPage()
+        c.save()
+        return document.getvalue()
+        
+    def main(self, arguments, options) :
+        """Generates a banner."""
+        if not hasRL :
+            raise PyKotaToolError, "The ReportLab module is missing. Download it from http://www.reportlab.org"
+        if not hasPIL :
+            raise PyKotaToolError, "The Python Imaging Library is missing. Download it from http://www.pythonware.com/downloads"
+            
+        try :
+            savetoner = int(options["savetoner"])
+            if (savetoner < 0) or (savetoner > 99) :
+                raise ValueError, _("Allowed range is (0..99)")
+            savetoner /= 100.0    
+        except (TypeError, ValueError), msg :
+            self.printInfo(_("Invalid 'savetoner' option %s : %s") % (options["savetoner"], msg), "warn")
+            savetoner = 0.0
+            
+        pagesize = self.getPageSize(options["pagesize"])
+        if pagesize is None :
+            pagesize = self.getPageSize("a4")
+            self.printInfo(_("Invalid 'pagesize' option %s, defaulting to A4.") % options["pagesize"], "warn")
+            
+        self.logdebug("Generating the banner in PDF format...")    
+        doc = self.genPDF(pagesize, 
+                          options["logo"].strip(), 
+                          options["url"].strip(), 
+                          " ".join(arguments).strip(), 
+                          savetoner)
+        
+        self.logdebug("Converting the banner to PostScript...")    
+        os.environ["PATH"] = "%s:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin" % os.environ.get("PATH", "")
+        child = popen2.Popen3("gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sDEVICE=pswrite -sOutputFile=- -")
+        try :
+            child.tochild.write(doc)
+            child.tochild.close()
+            sys.stdout.write(child.fromchild.read())
+            sys.stdout.flush()
+            child.fromchild.close()
+        except IOError, msg :    
+            self.printInfo("I/O Error %s" % msg, "error")
+        status = child.wait()
+        if os.WIFEXITED(status) :
+            status = os.WEXITSTATUS(status)
+        self.logdebug("PDF to PostScript converter exit code is %s" % str(status))
+        self.logdebug("Banner completed.")
+        return status
+
+if __name__ == "__main__" :
+    # TODO : --papertray : to print banners on a different paper (colored for example)
+    retcode = 0
+    try :
+        defaults = { \
+                     "savetoner" : "0", \
+                     "pagesize" : "a4", \
+                     "logo" : "/usr/share/pykota/logos/pykota.jpeg",
+                     "url" : "http://www.librelogiciel.com/software/",
+                   }
+        short_options = "vhs:l:p:u:"
+        long_options = ["help", "version", "savetoner=", "pagesize=", "logo=", "url="]
+        
+        # Initializes the command line tool
+        banner = PyKotaBanner(doc=__doc__)
+        banner.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = banner.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["savetoner"] = options["s"] or options["savetoner"] or defaults["savetoner"]
+        options["pagesize"] = options["p"] or options["pagesize"] or defaults["pagesize"]
+        options["url"] = options["u"] or options["url"] or defaults["url"]
+        
+        options["logo"] = options["l"] or options["logo"]
+        if options["logo"] is None : # Allows --logo="" to disable the logo entirely
+            options["logo"] = defaults["logo"]  
+        
+        if options["help"] :
+            banner.display_usage_and_quit()
+        elif options["version"] :
+            banner.display_version_and_quit()
+        else :
+            retcode = banner.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            banner.crashed("pkbanner failed")
+        except :    
+            crashed("pkbanner failed")
+        retcode = -1
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/autopykota
===================================================================
--- pykota/tags/1.22/bin/autopykota (revision 2216)
+++ pykota/tags/1.22/bin/autopykota (revision 2216)
@@ -0,0 +1,144 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# autopykota : script to automate user creation in PyKota
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+
+__doc__ = N_("""autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+
+command line usage :
+
+  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+  OF AN external policy IN pykota.conf
+  
+  autopykota { -i | --initbalance value } 
+
+options :
+
+  -v | --version       Prints autopykota's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -i | --initbalance b Sets the user's account initial balance value to b.
+                       If the user already exists, actual balance is left
+                       unmodified. If unset, the default value is 0.
+                       
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+
+class AutoPyKota(PyKotaTool) :
+    """A class for the automat."""
+    def main(self, arguments, options) :
+        """Main entry point."""
+        os.environ["PATH"] = "%s:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin" % os.environ.get("PATH", "")
+        username = os.environ.get("PYKOTAUSERNAME")
+        printername = os.environ.get("PYKOTAPRINTERNAME")
+        if (username is None) or (printername is None) :
+            raise PyKotaToolError, "Either the username or the printername is undefined. Fatal Error."
+        else :
+            user = self.storage.getUser(username)
+            if user.Exists :
+                self.logdebug("User %s already exits." % username) 
+                printer = self.storage.getPrinter(printername)
+                if printer.Exists :
+                    userpquota = self.storage.getUserPQuota(user, printer)
+                    if userpquota.Exists :
+                        self.logdebug("User %s's quota entry on printer %s already exists. Nothing to do." % (username, printername))
+                        return 0
+                    else :    
+                        self.logdebug("Creating a quota entry for user %s on printer %s." % (username, printername))
+                        return os.system('edpykota --add --printer "%s" "%s"' % (printername, username))
+                else :
+                    self.logdebug("Printer %s doesn't exist. Creating printer %s and a quota entry for user %s on printer %s." % (printername, printername, username, printername))
+                    return os.system('edpykota --add --printer "%s" "%s"' % (printername, username))
+            else :
+                self.logdebug("User %s doesn't exist yet." % username)
+                self.logdebug("Creating user %s's account with balance %s and quota entries on all existing printers." % (username, options["initbalance"]))
+                return os.system('edpykota --add --limitby balance --balance "%s" "%s"' % (options["initbalance"], username))
+    
+if __name__ == "__main__" :    
+    retcode = 0
+    try :
+        defaults = { \
+                     "initbalance" : 0.0
+                   }
+        short_options = "vhi:"
+        long_options = ["help", "version", "initbalance="]
+        
+        # Initializes the command line tool
+        automat = AutoPyKota(doc=__doc__)
+        automat.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = automat.parseCommandline(sys.argv[1:], short_options, long_options)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["initbalance"] = options["i"] or options["initbalance"] or defaults["initbalance"]
+        
+        if options["help"] :
+            automat.display_usage_and_quit()
+        elif options["version"] :
+            automat.display_version_and_quit()
+        elif args :    
+            raise PyKotaToolError, "autopykota doesn't accept non option arguments !"
+        else :
+            retcode = automat.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            automat.crashed("autopykota failed")
+        except :    
+            crashed("autopykota failed")
+        retcode = -1
+
+    try :
+        automat.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/pkprinters
===================================================================
--- pykota/tags/1.22/bin/pkprinters (revision 2216)
+++ pykota/tags/1.22/bin/pkprinters (revision 2216)
@@ -0,0 +1,255 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Printers Manager
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+import sys
+import pwd
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+
+__doc__ = N_("""pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+
+command line usage :
+
+  pkprinters [options] printer1 printer2 printer3 ... printerN
+
+options :
+
+  -v | --version       Prints pkprinters's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -a | --add           Adds printers if they don't exist on the Quota 
+                       Storage Server. If they exist, they are modified
+                       unless -s|--skipexisting is also used.
+                       
+  -d | --delete        Deletes printers from the quota storage.
+  
+  -D | --description d Adds a textual description to printers.
+                       
+  -c | --charge p[,j]  Sets the price per page and per job to charge.
+                       Job price is optional.
+                       If both are to be set, separate them with a comma.
+                       Floating point and negative values are allowed.
+  
+  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer 
+                       groups pg1, pg2, etc... which must already exist.
+                       A printer group is just like a normal printer,
+                       only that it is usually unknown from the printing
+                       system. Create printer groups exactly the same
+                       way that you create printers, then add other 
+                       printers to them with this option.
+                       Accounting is done on a printer and on all
+                       the printer groups it belongs to, quota checking
+                       is done on a printer and on all the printer groups
+                       it belongs to.
+                       If the --remove option below is not used, the 
+                       default action is to add printers to the specified
+                       printer groups.
+                       
+  -l | --list          List informations about the printer(s) and the
+                       printers groups it is a member of.
+                       
+  -r | --remove        In combination with the --groups option above,                       
+                       remove printers from the specified printers groups.
+                       
+  -s | --skipexisting  In combination with the --add option above, tells
+                       pkprinters to not modify existing printers.
+  
+  printer1 through printerN can contain wildcards if the --add option 
+  is not set.
+  
+examples :                              
+
+  $ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000
+  
+  Will create three printers named hp2100, hp2200 and hp8000.
+  Their price per page will be set at 0.05 unit, and their price
+  per job will be set at 0.1 unit. Units are in your own currency,
+  or whatever you want them to mean.
+  All of their descriptions will be set to the string "HP Printer".
+  If any of these printers already exists, it will also be modified 
+  unless the -s|--skipexisting command line option is also used.
+            
+  $ pkprinters --delete "*"
+  
+  This will completely delete all printers and associated quota information,
+  as well as their job history. USE WITH CARE !
+  
+  $ pkprinters --groups Laser,HP "hp*"
+  
+  This will put all printers which name matches "hp*" into printers groups 
+  Laser and HP, which MUST already exist.
+  
+  $ pkprinters --groups LexMark --remove hp2200
+  
+  This will remove the hp2200 printer from the LexMark printer group.
+  
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+class PKPrinters(PyKotaTool) :        
+    """A class for edpykota."""
+    def main(self, names, options) :
+        """Manage printers."""
+        if (not self.config.isAdmin) and (not options["list"]) :
+            raise PyKotaToolError, "%s : %s" % (pwd.getpwuid(os.geteuid())[0], _("You're not allowed to use this command."))
+            
+        if options["list"] and not names :
+            names = ["*"]
+            
+        if options["groups"] :        
+            printersgroups = self.storage.getMatchingPrinters(options["groups"])
+            if not printersgroups :
+                raise PyKotaToolError, _("There's no printer matching %s") % " ".join(options["groups"].split(','))
+            
+        if options["charge"] :
+            try :
+                charges = [float(part) for part in options["charge"].split(',', 1)]
+            except ValueError :    
+                raise PyKotaToolError, _("Invalid charge amount value %s") % options["charge"]
+            else :    
+                if len(charges) > 2 :
+                    charges = charges[:2]
+                if len(charges) != 2 :
+                    charges = [charges[0], None]
+                (perpage, perjob) = charges
+                
+        if options["add"] :    
+            printers = []
+            for pname in names :
+                printer = self.storage.getPrinter(pname)
+                if printer.Exists :
+                    if options["skipexisting"] :
+                        self.printInfo(_("Printer %s already exists, skipping.") % printer.Name)
+                    else :    
+                        self.printInfo(_("Printer %s already exists, will be modified.") % printer.Name)
+                        printers.append(printer)
+                else :
+                    if self.isValidName(pname) :
+                        printer = self.storage.addPrinter(pname)
+                        if not printer.Exists :
+                            raise PyKotaToolError, _("Impossible to add printer %s") % pname
+                        else :    
+                            printers.append(printer)
+                    else :    
+                        raise PyKotaToolError, _("Invalid printer name %s") % pname
+        else :        
+            printers = self.storage.getMatchingPrinters(",".join(names))
+            if not printers :
+                raise PyKotaToolError, _("There's no printer matching %s") % " ".join(names)
+                    
+        for printer in printers :        
+            if options["delete"] :
+                printer.delete()
+            elif options["list"] :    
+                parents = ", ".join([p.Name for p in self.storage.getParentPrinters(printer)])
+                if parents : 
+                    parents = "%s %s" % (_("in"), parents)
+                print "%s [%s] (%s + #*%s) %s" % \
+                      (printer.Name, printer.Description, printer.PricePerJob, \
+                       printer.PricePerPage, parents)
+            else :    
+                if options["charge"] :
+                    printer.setPrices(perpage, perjob)    
+                if options["description"] is not None :
+                    printer.setDescription(options["description"].strip())
+                if options["groups"] :    
+                    for pgroup in printersgroups :
+                        if options["remove"] :
+                            pgroup.delPrinterFromGroup(printer)
+                        else :
+                            pgroup.addPrinterToGroup(printer)    
+                     
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        short_options = "hvac:D:dg:lrs"
+        long_options = ["help", "version", "add", "charge=", "description=", "delete", "groups=", "list", "remove", "skipexisting"]
+        
+        # Initializes the command line tool
+        manager = PKPrinters(doc=__doc__)
+        manager.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = manager.parseCommandline(sys.argv[1:], short_options, long_options)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["add"] = options["a"] or options["add"]
+        options["charge"] = options["c"] or options["charge"]
+        options["description"] = options["D"] or options["description"]
+        options["delete"] = options["d"] or options["delete"] 
+        options["groups"] = options["g"] or options["groups"]
+        options["list"] = options["l"] or options["list"]
+        options["remove"] = options["r"] or options["remove"]
+        options["skipexisting"] = options["s"] or options["skipexisting"]
+        
+        if options["help"] :
+            manager.display_usage_and_quit()
+        elif options["version"] :
+            manager.display_version_and_quit()
+        elif (options["delete"] and (options["add"] or options["groups"] or options["charge"] or options["remove"] or options["description"])) \
+           or (options["skipexisting"] and not options["add"]) \
+           or (options["list"] and (options["add"] or options["delete"] or options["groups"] or options["charge"] or options["remove"] or options["description"])) :
+            raise PyKotaToolError, _("incompatible options, see help.")
+        elif options["remove"] and not options["groups"] :    
+            raise PyKotaToolError, _("You have to pass printer groups names on the command line")
+        elif (not args) and (not options["list"]) :    
+            raise PyKotaToolError, _("You have to pass printer names on the command line")
+        else :
+            retcode = manager.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            manager.crashed("pkprinters failed")
+        except :    
+            crashed("pkprinters failed")
+        retcode = -1
+
+    try :
+        manager.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/pkpgcounter
===================================================================
--- pykota/tags/1.22/bin/pkpgcounter (revision 2147)
+++ pykota/tags/1.22/bin/pkpgcounter (revision 2147)
@@ -0,0 +1,30 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# pkpgcounter, a smart software page counter
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+from pykota import pdlanalyzer
+    
+if __name__ == "__main__" :    
+    pdlanalyzer.main()
Index: pykota/tags/1.22/bin/mailandpopup.sh
===================================================================
--- pykota/tags/1.22/bin/mailandpopup.sh (revision 2146)
+++ pykota/tags/1.22/bin/mailandpopup.sh (revision 2146)
@@ -0,0 +1,47 @@
+#! /bin/sh
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# You're welcome to redistribute this software under the
+# terms of the GNU General Public Licence version 2.0
+# or, at your option, any higher version.
+#
+# You can read the complete GNU GPL in the file COPYING
+# which should come along with this software, or visit
+# the Free Software Foundation's WEB site http://www.fsf.org
+#
+# $Id$
+#
+PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/opt/bin
+#
+# user's name
+UNAME=$1
+# printer's name
+PNAME=$2
+# message's recipient
+RECIPIENT=$3
+# message's body
+MESSAGE=$4
+#
+# Convert message body to UTF8 for WinPopup
+UTF8MESSAGE=`echo "$MESSAGE" | iconv --to-code utf-8 --from-code iso-8859-15`
+#
+# Send original message to user
+mail -s "Print Quota problem" $RECIPIENT <<EOF1
+$MESSAGE
+EOF1
+# 
+# Send some information to root as well
+mail -s "Print Quota problem on printer $PNAME" root <<EOF2
+Print Quota problem for user $UNAME
+EOF2
+#
+# Launch WinPopup on user's host (may need a real Samba or NT domain) 
+# In some cases the username does not suffice for smbclient to send a message;
+# we must also supply the IP address. This will use smbstatus to get all IPs
+# where the user is logged in and send the message there:
+IPS=`smbstatus -b -u $UNAME | grep '(' | cut -d'(' -f 2 | cut -d')' -f 1`
+for i in $IPS; do
+    echo $UTF8MESSAGE | smbclient -M "$UNAME" -I $i 2>&1 >/dev/null;
+done
Index: pykota/tags/1.22/bin/cupspykota
===================================================================
--- pykota/tags/1.22/bin/cupspykota (revision 2217)
+++ pykota/tags/1.22/bin/cupspykota (revision 2217)
@@ -0,0 +1,727 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# CUPSPyKota accounting backend
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import errno
+import tempfile
+import popen2
+import cStringIO
+import shlex
+import select
+import signal
+import time
+
+from pykota.tool import PyKotaFilterOrBackend, PyKotaToolError, crashed
+from pykota.config import PyKotaConfigError
+from pykota.storage import PyKotaStorageError
+from pykota.accounter import PyKotaAccounterError
+from pykota.ipp import IPPMessage, PyKotaIPPError
+    
+class PyKotaPopen4(popen2.Popen4) :
+    """Our own class to execute real backends.
+    
+       Their first argument is different from their path so using
+       native popen2.Popen3 would not be feasible.
+    """
+    def __init__(self, cmd, bufsize=-1, arg0=None) :
+        self.arg0 = arg0
+        popen2.Popen4.__init__(self, cmd, bufsize)
+        
+    def _run_child(self, cmd):
+        try :
+            MAXFD = os.sysconf("SC_OPEN_MAX")
+        except (AttributeError, ValueError) :    
+            MAXFD = 256
+        for i in range(3, MAXFD) : 
+            try:
+                os.close(i)
+            except OSError:
+                pass
+        try:
+            os.execvpe(cmd[0], [self.arg0 or cmd[0]] + cmd[1:], os.environ)
+        finally:
+            os._exit(1)
+    
+class PyKotaBackend(PyKotaFilterOrBackend) :        
+    """A class for the pykota backend."""
+    def acceptJob(self) :        
+        """Returns the appropriate exit code to tell CUPS all is OK."""
+        return 0
+            
+    def removeJob(self) :            
+        """Returns the appropriate exit code to let CUPS think all is OK.
+        
+           Returning 0 (success) prevents CUPS from stopping the print queue.
+        """   
+        return 0
+        
+    def genBanner(self, bannerfileorcommand) :
+        """Reads a banner or generates one through an external command.
+        
+           Returns the banner's content in a format which MUST be accepted
+           by the printer.
+        """
+        if bannerfileorcommand :
+            banner = "" # no banner by default
+            if os.access(bannerfileorcommand, os.X_OK) or not os.path.isfile(bannerfileorcommand) :
+                self.logdebug("Launching %s to generate a banner." % bannerfileorcommand)
+                child = popen2.Popen3(bannerfileorcommand, capturestderr=1)
+                banner = child.fromchild.read()
+                child.tochild.close()
+                child.childerr.close()
+                child.fromchild.close()
+                status = child.wait()
+                if os.WIFEXITED(status) :
+                    status = os.WEXITSTATUS(status)
+                self.printInfo(_("Banner generator %s exit code is %s") % (bannerfileorcommand, str(status)))
+            else :
+                self.logdebug("Using %s as the banner." % bannerfileorcommand)
+                try :
+                    fh = open(bannerfileorcommand, 'r')
+                except IOError, msg :    
+                    self.printInfo("Impossible to open %s : %s" % (bannerfileorcommand, msg), "error")
+                else :    
+                    banner = fh.read()
+                    fh.close()
+            if banner :        
+                return cStringIO.StringIO(banner)
+    
+    def startingBanner(self, printername) :
+        """Retrieves a starting banner for current printer and returns its content."""
+        self.logdebug("Retrieving starting banner...")
+        return self.genBanner(self.config.getStartingBanner(printername))
+    
+    def endingBanner(self, printername) :
+        """Retrieves an ending banner for current printer and returns its content."""
+        self.logdebug("Retrieving ending banner...")
+        return self.genBanner(self.config.getEndingBanner(printername))
+        
+    def getCupsConfigDirectives(self, directives=[]) :
+        """Retrieves some CUPS directives from its configuration file.
+        
+           Returns a mapping with lowercased directives as keys and 
+           their setting as values.
+        """
+        dirvalues = {} 
+        cupsroot = os.environ.get("CUPS_SERVERROOT", "/etc/cups")
+        cupsdconf = os.path.join(cupsroot, "cupsd.conf")
+        try :
+            conffile = open(cupsdconf, "r")
+        except IOError :    
+            self.logdebug("Unable to open %s" % cupsdconf)
+        else :    
+            for line in conffile.readlines() :
+                linecopy = line.strip().lower()
+                for di in [d.lower() for d in directives] :
+                    if linecopy.startswith("%s " % di) :
+                        try :
+                            val = line.split()[1]
+                        except :    
+                            pass # ignore errors, we take the last value in any case.
+                        else :    
+                            dirvalues[di] = val
+            conffile.close()            
+        return dirvalues       
+            
+    def getJobInfosFromPageLog(self, cupsconfig, printername, username, jobid) :
+        """Retrieves the job-originating-hostname and job-billing attributes from the CUPS page_log file if possible."""
+        pagelogpath = cupsconfig.get("pagelog", "/var/log/cups/page_log")
+        self.logdebug("Trying to extract job-originating-host-name from %s" % pagelogpath)
+        try :
+            pagelog = open(pagelogpath, "r")
+        except IOError :    
+            self.logdebug("Unable to open %s" % pagelogpath)
+            return (None, None) # no page log or can't read it, originating hostname unknown yet
+        else :    
+            # TODO : read backward so we could take first value seen
+            # TODO : here we read forward so we must take the last value seen
+            prefix = ("%s %s %s " % (printername, username, jobid)).lower()
+            matchingline = None
+            while 1 :
+                line = pagelog.readline()
+                if not line :
+                    break
+                else :
+                    line = line.strip()
+                    if line.lower().startswith(prefix) :    
+                        matchingline = line # no break, because we read forward
+            pagelog.close()        
+            if matchingline is None :
+                self.logdebug("No matching line found in %s" % pagelogpath)
+                return (None, None) # correct line not found, job-originating-host-name unknown
+            else :    
+                (jobbilling, hostname) = matchingline.split()[-2:]
+                if jobbilling == "-" :
+                    jobbilling = ""
+                return (jobbilling, hostname)   
+                
+    def doWork(self, policy, printer, user, userpquota) :    
+        """Most of the work is done here."""
+        # Two different values possible for policy here :
+        # ALLOW means : Either printer, user or user print quota doesn't exist,
+        #               but the job should be allowed anyway.
+        # OK means : Both printer, user and user print quota exist, job should
+        #            be allowed if current user is allowed to print on this printer
+        if policy == "OK" :
+            # exports user information with initial values
+            self.exportUserInfo(userpquota)
+            
+            # tries to extract job-originating-host-name and other information
+            self.regainPriv()
+            cupsdconf = self.getCupsConfigDirectives(["PageLog", "RequestRoot"])
+            requestroot = cupsdconf.get("requestroot", "/var/spool/cups")
+            if (len(self.jobid) < 5) and self.jobid.isdigit() :
+                ippmessagefile = "c%05i" % int(self.jobid)
+            else :    
+                ippmessagefile = "c%s" % self.jobid
+            ippmessagefile = os.path.join(requestroot, ippmessagefile)
+            ippmessage = {}
+            try :
+                ippdatafile = open(ippmessagefile)
+            except :    
+                self.printInfo("Unable to open IPP message file %s" % ippmessagefile, "warn")
+            else :    
+                self.logdebug("Parsing of IPP message file %s begins." % ippmessagefile)
+                try :
+                    ippmessage = IPPMessage(ippdatafile.read())
+                except PyKotaIPPError, msg :    
+                    self.printInfo("Error while parsing %s : %s" % (ippmessagefile, msg), "warn")
+                else :    
+                    self.logdebug("Parsing of IPP message file %s ends." % ippmessagefile)
+                ippdatafile.close()
+            self.dropPriv()    
+            clienthost = ippmessage.get("job-originating-host-name") 
+            billingcode = ippmessage.get("job-billing")
+            if clienthost is None :
+                (billingcode, clienthost) = self.getJobInfosFromPageLog(cupsdconf, printer.Name, user.Name, self.jobid)
+            self.logdebug("Client Hostname : %s" % (clienthost or "Unknown"))    
+            self.logdebug("Billing Code : %s" % (billingcode or "None"))    
+            os.environ["PYKOTAJOBORIGINATINGHOSTNAME"] = clienthost or ""
+            os.environ["PYKOTAJOBBILLING"] = billingcode or ""
+            
+            # enters first phase
+            os.environ["PYKOTAPHASE"] = "BEFORE"
+            
+            # precomputes the job's price
+            self.softwareJobPrice = userpquota.computeJobPrice(self.softwareJobSize)
+            os.environ["PYKOTAPRECOMPUTEDJOBPRICE"] = str(self.softwareJobPrice)
+            self.logdebug("Precomputed job's size is %s pages, price is %s units" % (self.softwareJobSize, self.softwareJobPrice))
+            
+            if not self.jobSizeBytes :
+                # if no data to pass to real backend, probably a filter
+                # higher in the chain failed because of a misconfiguration.
+                # we deny the job in this case (nothing to print anyway)
+                self.printMoreInfo(user, printer, _("Job contains no data. Printing is denied."), "warn")
+                action = "DENY"
+            elif self.config.getDenyDuplicates(printer.Name) \
+                 and printer.LastJob.Exists \
+                 and (printer.LastJob.UserName == user.Name) \
+                 and (printer.LastJob.JobMD5Sum == self.checksum) :
+                self.printMoreInfo(user, printer, _("Job is a duplicate. Printing is denied."), "warn")
+                action = "DENY" 
+            else :    
+                # checks the user's quota
+                action = self.warnUserPQuota(userpquota)
+            
+            # exports some new environment variables
+            os.environ["PYKOTAACTION"] = action
+            
+            # launches the pre hook
+            self.prehook(userpquota)
+
+            # saves the size of banners which have to be accounted for
+            # this is needed in the case of software accounting
+            bannersize = 0
+            
+            # handle starting banner pages before accounting
+            accountbanner = self.config.getAccountBanner(printer.Name)
+            if accountbanner in ["ENDING", "NONE"] :
+                if (action == 'DENY') and (userpquota.WarnCount >= self.config.getMaxDenyBanners(printer.Name)) :
+                    self.printInfo(_("Banner won't be printed : maximum number of deny banners reached."), "warn")
+                else :
+                    if action == 'DENY' :
+                        self.logdebug("Incrementing the number of deny banners for user %s on printer %s" % (user.Name, printer.Name))
+                        userpquota.incDenyBannerCounter() # increments the warning counter
+                        self.exportUserInfo(userpquota)
+                    banner = self.startingBanner(printer.Name)
+                    if banner :
+                        self.logdebug("Printing starting banner before accounting begins.")
+                        self.handleData(banner)
+ 
+            self.printMoreInfo(user, printer, _("Job accounting begins."))
+            self.accounter.beginJob(printer)
+            
+            # handle starting banner pages during accounting
+            if accountbanner in ["STARTING", "BOTH"] :
+                if (action == 'DENY') and (userpquota.WarnCount >= self.config.getMaxDenyBanners(printer.Name)) :
+                    self.printInfo(_("Banner won't be printed : maximum number of deny banners reached."), "warn")
+                else :
+                    if action == 'DENY' :
+                        self.logdebug("Incrementing the number of deny banners for user %s on printer %s" % (user.Name, printer.Name))
+                        userpquota.incDenyBannerCounter() # increments the warning counter
+                        self.exportUserInfo(userpquota)
+                    banner = self.startingBanner(printer.Name)
+                    if banner :
+                        self.logdebug("Printing starting banner during accounting.")
+                        self.handleData(banner)
+                        if self.accounter.isSoftware :
+                            bannersize += 1 # TODO : fix this by passing the banner's content through PDLAnalyzer
+        else :    
+            action = "ALLOW"
+            os.environ["PYKOTAACTION"] = action
+            
+        # pass the job's data to the real backend    
+        if action in ["ALLOW", "WARN"] :
+            if self.gotSigTerm :
+                retcode = self.removeJob()
+            else :    
+                retcode = self.handleData()        
+        else :        
+            retcode = self.removeJob()
+        
+        if policy == "OK" :        
+            # indicate phase change
+            os.environ["PYKOTAPHASE"] = "AFTER"
+            
+            # handle ending banner pages during accounting
+            if accountbanner in ["ENDING", "BOTH"] :
+                if (action == 'DENY') and (userpquota.WarnCount >= self.config.getMaxDenyBanners(printer.Name)) :
+                    self.printInfo(_("Banner won't be printed : maximum number of deny banners reached."), "warn")
+                else :
+                    if action == 'DENY' :
+                        self.logdebug("Incrementing the number of deny banners for user %s on printer %s" % (user.Name, printer.Name))
+                        userpquota.incDenyBannerCounter() # increments the warning counter
+                        self.exportUserInfo(userpquota)
+                    banner = self.endingBanner(printer.Name)
+                    if banner :
+                        self.logdebug("Printing ending banner during accounting.")
+                        self.handleData(banner)
+                        if self.accounter.isSoftware :
+                            bannersize += 1 # TODO : fix this by passing the banner's content through PDLAnalyzer
+ 
+            # stops accounting. 
+            self.accounter.endJob(printer)
+            self.printMoreInfo(user, printer, _("Job accounting ends."))
+                
+            # retrieve the job size    
+            if action == "DENY" :
+                jobsize = 0
+                self.printMoreInfo(user, printer, _("Job size forced to 0 because printing is denied."))
+            else :    
+                userpquota.resetDenyBannerCounter()
+                jobsize = self.accounter.getJobSize(printer)
+                if self.softwareJobSize and (jobsize != self.softwareJobSize) :
+                    self.printInfo(_("Beware : computed job size (%s) != precomputed job size (%s)") % (jobsize, self.softwareJobSize), "error")
+                    (limit, replacement) = self.config.getTrustJobSize(printer.Name)
+                    if limit is None :
+                        self.printInfo(_("The job size will be trusted anyway according to the 'trustjobsize' directive"), "warn")
+                    else :
+                        if jobsize <= limit :
+                            self.printInfo(_("The job size will be trusted because it is inferior to the 'trustjobsize' directive's limit %s") % limit, "warn")
+                        else :
+                            self.printInfo(_("The job size will be modified according to the 'trustjobsize' directive : %s") % replacement, "warn")
+                            if replacement == "PRECOMPUTED" :
+                                jobsize = self.softwareJobSize
+                            else :    
+                                jobsize = replacement
+                jobsize += bannersize    
+            self.printMoreInfo(user, printer, _("Job size : %i") % jobsize)
+            
+            # update the quota for the current user on this printer 
+            self.printInfo(_("Updating user %s's quota on printer %s") % (user.Name, printer.Name))
+            jobprice = userpquota.increasePagesUsage(jobsize)
+            
+            # adds the current job to history    
+            printer.addJobToHistory(self.jobid, user, self.accounter.getLastPageCounter(), \
+                                    action, jobsize, jobprice, self.preserveinputfile, \
+                                    self.title, self.copies, self.options, clienthost, \
+                                    self.jobSizeBytes, self.checksum, None, billingcode)
+            self.printMoreInfo(user, printer, _("Job added to history."))
+            
+            # exports some new environment variables
+            os.environ["PYKOTAJOBSIZE"] = str(jobsize)
+            os.environ["PYKOTAJOBPRICE"] = str(jobprice)
+            
+            # then re-export user information with new value
+            self.exportUserInfo(userpquota)
+            
+            # handle ending banner pages after accounting ends
+            if accountbanner in ["STARTING", "NONE"] :
+                if (action == 'DENY') and (userpquota.WarnCount >= self.config.getMaxDenyBanners(printer.Name)) :
+                    self.printInfo(_("Banner won't be printed : maximum number of deny banners reached."), "warn")
+                else :
+                    if action == 'DENY' :
+                        self.logdebug("Incrementing the number of deny banners for user %s on printer %s" % (user.Name, printer.Name))
+                        userpquota.incDenyBannerCounter() # increments the warning counter
+                        self.exportUserInfo(userpquota)
+                    banner = self.endingBanner(printer.Name)
+                    if banner :
+                        self.logdebug("Printing ending banner after accounting ends.")
+                        self.handleData(banner)
+                        
+            # Launches the post hook
+            self.posthook(userpquota)
+            
+        return retcode    
+               
+    def unregisterFileNo(self, pollobj, fileno) :                
+        """Removes a file handle from the polling object."""
+        try :
+            pollobj.unregister(fileno)
+        except KeyError :    
+            self.printInfo(_("File number %s unregistered twice from polling object, ignored.") % fileno, "warn")
+        except :    
+            self.logdebug("Error while unregistering file number %s from polling object." % fileno)
+        else :    
+            self.logdebug("File number %s unregistered from polling object." % fileno)
+            
+    def formatFileEvent(self, fd, mask) :        
+        """Formats file debug info."""
+        maskval = []
+        if mask & select.POLLIN :
+            maskval.append("POLLIN")
+        if mask & select.POLLOUT :
+            maskval.append("POLLOUT")
+        if mask & select.POLLPRI :
+            maskval.append("POLLPRI")
+        if mask & select.POLLERR :
+            maskval.append("POLLERR")
+        if mask & select.POLLHUP :
+            maskval.append("POLLHUP")
+        if mask & select.POLLNVAL :
+            maskval.append("POLLNVAL")
+        return "%s (%s)" % (fd, " | ".join(maskval))
+        
+    def handleData(self, filehandle=None) :
+        """Pass the job's data to the real backend."""
+        # Find the real backend pathname    
+        realbackend = os.path.join(os.path.split(sys.argv[0])[0], self.originalbackend)
+        
+        # And launch it
+        if filehandle is None :
+            arguments = sys.argv
+        else :    
+            # Here we absolutely WANT to remove any filename from the command line !
+            arguments = [ "Fake this because we are printing a banner" ] + sys.argv[1:6]
+            
+        self.regainPriv()    
+        
+        self.logdebug("Starting real backend %s with args %s" % (realbackend, " ".join(['"%s"' % a for a in ([os.environ["DEVICE_URI"]] + arguments[1:])])))
+        subprocess = PyKotaPopen4([realbackend] + arguments[1:], bufsize=0, arg0=os.environ["DEVICE_URI"])
+        
+        # Save file descriptors, we will need them later.
+        stderrfno = sys.stderr.fileno()
+        fromcfno = subprocess.fromchild.fileno()
+        tocfno = subprocess.tochild.fileno()
+        
+        # We will have to be careful when dealing with I/O 
+        # So we use a poll object to know when to read or write
+        pollster = select.poll()
+        pollster.register(fromcfno, select.POLLIN | select.POLLPRI)
+        pollster.register(stderrfno, select.POLLOUT)
+        pollster.register(tocfno, select.POLLOUT)
+        
+        # Initialize our buffers
+        indata = ""
+        outdata = ""
+        endinput = endoutput = 0
+        inputclosed = outputclosed = 0
+        totaltochild = totalfromcups = 0
+        totalfromchild = totaltocups = 0
+        
+        if filehandle is None:
+            if self.preserveinputfile is None :
+               # this is not a real file, we read the job's data
+                # from our temporary file which is a copy of stdin 
+                infno = self.jobdatastream.fileno()
+                self.jobdatastream.seek(0)
+                pollster.register(infno, select.POLLIN | select.POLLPRI)
+            else :    
+                # job's data is in a file, no need to pass the data
+                # to the real backend
+                self.logdebug("Job's data is in %s" % self.preserveinputfile)
+                infno = None
+                endinput = 1
+        else:
+            self.logdebug("Printing data passed from filehandle")
+            indata = filehandle.read()
+            infno = None
+            endinput = 1
+            filehandle.close()
+        
+        self.logdebug("Entering streams polling loop...")
+        MEGABYTE = 1024*1024
+        killed = 0
+        status = -1
+        while (status == -1) and (not killed) and not (inputclosed and outputclosed) :
+            # First check if original backend is still alive
+            status = subprocess.poll()
+            
+            # Now if we got SIGTERM, we have 
+            # to kill -TERM the original backend
+            if self.gotSigTerm and not killed :
+                try :
+                    os.kill(subprocess.pid, signal.SIGTERM)
+                except OSError, msg : # ignore but logs if process was already killed.
+                    self.logdebug("Error while sending signal to pid %s : %s" % (subprocess.pid, msg))
+                else :    
+                    self.printInfo(_("SIGTERM was sent to real backend %s (pid: %s)") % (realbackend, subprocess.pid))
+                    killed = 1
+            
+            # In any case, deal with any remaining I/O
+            try :
+                availablefds = pollster.poll(5000)
+            except select.error, msg :    
+                self.logdebug("Interrupted poll : %s" % msg)
+                availablefds = []
+            if not availablefds :
+                self.logdebug("Nothing to do, sleeping a bit...")
+                time.sleep(0.01) # give some time to the system
+            else :
+                for (fd, mask) in availablefds :
+                    # self.logdebug(self.formatFileEvent(fd, mask))
+                    try :
+                        if mask & select.POLLOUT :
+                            # We can write
+                            if fd == tocfno :
+                                if indata :
+                                    try :
+                                        nbwritten = os.write(fd, indata)    
+                                    except (OSError, IOError), msg :    
+                                        self.logdebug("Error while writing to real backend's stdin %s : %s" % (fd, msg))
+                                    else :    
+                                        if len(indata) != nbwritten :
+                                            self.logdebug("Short write to real backend's input !")
+                                        totaltochild += nbwritten    
+                                        self.logdebug("%s bytes sent to real backend so far..." % totaltochild)
+                                        indata = indata[nbwritten:]
+                                else :        
+                                    self.logdebug("No data to send to real backend yet, sleeping a bit...")
+                                    time.sleep(0.01)
+                                    
+                                if endinput :    
+                                    self.unregisterFileNo(pollster, tocfno)        
+                                    self.logdebug("Closing real backend's stdin.")
+                                    os.close(tocfno)
+                                    inputclosed = 1
+                            elif fd == stderrfno :
+                                if outdata :
+                                    try :
+                                        nbwritten = os.write(fd, outdata)
+                                    except (OSError, IOError), msg :    
+                                        self.logdebug("Error while writing to CUPS back channel (stderr) %s : %s" % (fd, msg))
+                                    else :
+                                        if len(outdata) != nbwritten :
+                                            self.logdebug("Short write to stderr (CUPS) !")
+                                        totaltocups += nbwritten    
+                                        self.logdebug("%s bytes sent back to CUPS so far..." % totaltocups)
+                                        outdata = outdata[nbwritten:]
+                                else :        
+                                    # self.logdebug("No data to send back to CUPS yet, sleeping a bit...") # Uncommenting this fills your logs
+                                    time.sleep(0.01) # Give some time to the system, stderr is ALWAYS writeable it seems.
+                                    
+                                if endoutput :    
+                                    self.unregisterFileNo(pollster, stderrfno)        
+                                    outputclosed = 1
+                            else :    
+                                self.logdebug("Unexpected : %s - Sleeping a bit..." % self.formatFileEvent(fd, mask))
+                                time.sleep(0.01)
+                                
+                        if mask & (select.POLLIN | select.POLLPRI) :     
+                            # We have something to read
+                            try :
+                                data = os.read(fd, MEGABYTE)
+                            except (IOError, OSError), msg :    
+                                self.logdebug("Error while reading file %s : %s" % (fd, msg))
+                            else :
+                                if fd == infno :
+                                    if not data :    # If yes, then no more input data
+                                        self.unregisterFileNo(pollster, infno)
+                                        self.logdebug("Input data ends.")
+                                        endinput = 1 # this happens with real files.
+                                    else :    
+                                        indata += data
+                                        totalfromcups += len(data)
+                                        self.logdebug("%s bytes read from CUPS so far..." % totalfromcups)
+                                elif fd == fromcfno :
+                                    if not data :
+                                        self.logdebug("No back channel data to read from real backend yet, sleeping a bit...")
+                                        time.sleep(0.01)
+                                    else :
+                                        outdata += data
+                                        totalfromchild += len(data)
+                                        self.logdebug("%s bytes read from real backend so far..." % totalfromchild)
+                                else :    
+                                    self.logdebug("Unexpected : %s - Sleeping a bit..." % self.formatFileEvent(fd, mask))
+                                    time.sleep(0.01)
+                                    
+                        if mask & (select.POLLHUP | select.POLLERR) :
+                            # Treat POLLERR as an EOF.
+                            # Some standard I/O stream has no more datas
+                            self.unregisterFileNo(pollster, fd)
+                            if fd == infno :
+                                # Here we are in the case where the input file is stdin.
+                                # which has no more data to be read.
+                                self.logdebug("Input data ends.")
+                                endinput = 1
+                            elif fd == fromcfno :    
+                                # We are no more interested in this file descriptor        
+                                self.logdebug("Closing real backend's stdout+stderr.")
+                                os.close(fromcfno)
+                                endoutput = 1
+                            else :    
+                                self.logdebug("Unexpected : %s - Sleeping a bit..." % self.formatFileEvent(fd, mask))
+                                time.sleep(0.01)
+                                
+                        if mask & select.POLLNVAL :        
+                            self.logdebug("File %s was closed. Unregistering from polling object." % fd)
+                            self.unregisterFileNo(pollster, fd)
+                    except IOError, msg :            
+                        self.logdebug("Got an IOError : %s" % msg) # we got signalled during an I/O
+                
+        # We must close the real backend's input stream
+        if killed and not inputclosed :
+            self.logdebug("Forcing close of real backend's stdin.")
+            os.close(tocfno)
+        
+        self.logdebug("Exiting streams polling loop...")
+        
+        self.logdebug("input data's final length : %s" % len(indata))
+        self.logdebug("back-channel data's final length : %s" % len(outdata))
+        
+        self.logdebug("Total bytes read from CUPS (job's datas) : %s" % totalfromcups)
+        self.logdebug("Total bytes sent to real backend (job's datas) : %s" % totaltochild)
+        
+        self.logdebug("Total bytes read from real backend (back-channel datas) : %s" % totalfromchild)
+        self.logdebug("Total bytes sent back to CUPS (back-channel datas) : %s" % totaltocups)
+        
+        # Check exit code of original CUPS backend.    
+        if status == -1 :
+            # we exited the loop before the real backend exited
+            # now we have to wait for it to finish and get its status
+            self.logdebug("Waiting for real backend to exit...")
+            try :
+                status = subprocess.wait()
+            except OSError : # already dead : TODO : detect when abnormal
+                status = 0
+        if os.WIFEXITED(status) :
+            retcode = os.WEXITSTATUS(status)
+        elif not killed :    
+            self.sendBackChannelData(_("CUPS backend %s died abnormally.") % realbackend, "error")
+            retcode = -1
+        else :    
+            retcode = self.removeJob()
+            
+        self.dropPriv()    
+        
+        return retcode    
+    
+if __name__ == "__main__" :    
+    # This is a CUPS backend, we should act and die like a CUPS backend
+    retcode = 0
+    if len(sys.argv) == 1 :
+        (directory, myname) = os.path.split(sys.argv[0])
+        tmpdir = tempfile.gettempdir()
+        lockfilename = os.path.join(tmpdir, "%s..LCK" % myname)
+        if os.path.exists(lockfilename) :
+            # there's already a lockfile, see if still used
+            lockfile = open(lockfilename, "r")
+            pid = int(lockfile.read())
+            lockfile.close()
+            try :
+                # see if the pid contained in the lock file is still running
+                os.kill(pid, 0)
+            except OSError, e :    
+                if e.errno != errno.EPERM :
+                    # process doesn't exist anymore, remove the lock
+                    os.remove(lockfilename)
+            
+        if not os.path.exists(lockfilename) :
+            lockfile = open(lockfilename, "w")
+            lockfile.write("%i" % os.getpid())
+            lockfile.close()
+            # we will execute each existing backend in device enumeration mode
+            # and generate their PyKota accounting counterpart
+            allbackends = [ os.path.join(directory, b) \
+                                for b in os.listdir(directory) 
+                                    if os.access(os.path.join(directory, b), os.X_OK) \
+                                        and (b != myname)] 
+            for backend in allbackends :                            
+                answer = os.popen(backend, "r")
+                try :
+                    devices = [line.strip() for line in answer.readlines()]
+                except :    
+                    devices = []
+                status = answer.close()
+                if status is None :
+                    for d in devices :
+                        # each line is of the form : 'xxxx xxxx "xxxx xxx" "xxxx xxx"'
+                        # so we have to decompose it carefully
+                        fdevice = cStringIO.StringIO("%s" % d)
+                        tokenizer = shlex.shlex(fdevice)
+                        tokenizer.wordchars = tokenizer.wordchars + r".:,?!~/\_$*-+={}[]()#"
+                        arguments = []
+                        while 1 :
+                            token = tokenizer.get_token()
+                            if token :
+                                arguments.append(token)
+                            else :
+                                break
+                        fdevice.close()
+                        try :
+                            (devicetype, device, name, fullname) = arguments
+                        except ValueError :    
+                            pass    # ignore this 'bizarre' device
+                        else :    
+                            if name.startswith('"') and name.endswith('"') :
+                                name = name[1:-1]
+                            if fullname.startswith('"') and fullname.endswith('"') :
+                                fullname = fullname[1:-1]
+                            print '%s cupspykota:%s "PyKota+%s" "PyKota managed %s"' % (devicetype, device, name, fullname)
+            os.remove(lockfilename)
+        retcode = 0                
+    elif len(sys.argv) not in (6, 7) :    
+        sys.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0])
+        retcode = 1
+    else :    
+        try :
+            # Initializes the backend
+            kotabackend = PyKotaBackend()    
+            kotabackend.deferredInit()
+            retcode = kotabackend.mainWork()
+            kotabackend.storage.close()
+            kotabackend.closeJobDataStream()    
+        except SystemExit :    
+            retcode = -1
+        except :
+            try :
+                kotabackend.crashed("cupspykota backend failed")
+            except :    
+                crashed("cupspykota backend failed")
+            retcode = 1    
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/pykosd
===================================================================
--- pykota/tags/1.22/bin/pykosd (revision 2232)
+++ pykota/tags/1.22/bin/pykosd (revision 2232)
@@ -0,0 +1,206 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Editor 
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+import time
+
+try :
+    import pyosd
+except ImportError :    
+    sys.stderr.write("Sorry ! You need both xosd and the Python OSD library (pyosd) for this software to work.\n")
+    sys.exit(-1)
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+
+__doc__ = N_("""pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+
+command line usage :
+
+  pykosd [options]
+
+options :
+
+  -v | --version       Prints pykosd's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -c | --color #rrggbb Sets the color to use for display as an hexadecimal
+                       triplet, for example #FF0000 is 100%% red.
+                       Defaults to 100%% green (#00FF00).
+                       
+  -d | --duration d    Sets the duration of the display in seconds. 
+                       Defaults to 3 seconds.
+                       
+  -f | --font f        Sets the font to use for display.                      
+                       Defaults to the Python OSD library's default.
+  
+  -l | --loop n        Sets the number of times the info will be displayed.
+                       Defaults to 0, which means loop forever.
+                       
+  -s | --sleep s       Sets the sleeping duration between two displays 
+                       in seconds. Defaults to 180 seconds (3 minutes).
+                       
+  
+examples :                              
+
+  $ pykosd -s 60 --loop 5
+  
+  Will launch pykosd. Display will be refreshed every 60 seconds,
+  and will last for 3 seconds (the default) each time. After five
+  iterations, the program will exit.
+  
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+
+
+class PyKOSD(PyKotaTool) :
+    def main(self, args, options) :
+        """Main function starts here."""
+        try :    
+            duration = int(options["duration"])
+        except :    
+            raise PyKotaToolError, _("Invalid duration option %s") % str(options["duration"])
+            
+        try :    
+            loop = int(options["loop"])
+        except :    
+            raise PyKotaToolError, _("Invalid loop option %s") % str(options["loop"])
+            
+        try :    
+            sleep = float(options["sleep"])
+        except :    
+            raise PyKotaToolError, _("Invalid sleep option %s") % str(options["sleep"])
+            
+        color = options["color"]    
+        if not color.startswith("#") :
+            color = "#%s" % color
+        if len(color) != 7 :    
+            raise PyKotaToolError, _("Invalid color option %s") % str(color)
+        savecolor = color
+        
+        uname = pwd.getpwuid(os.getuid())[0]
+        while 1 :
+            color = savecolor
+            user = cmd.storage.getUserFromBackend(uname)        # don't use cache
+            if not user.Exists :
+                raise PyKotaToolError, _("User %s doesn't exist in PyKota's database") % uname
+            if user.LimitBy == "quota" :    
+                printers = cmd.storage.getMatchingPrinters("*")
+                upquotas = [ cmd.storage.getUserPQuotaFromBackend(user, p) for p in printers ] # don't use cache
+                nblines = len(upquotas)
+                display = pyosd.osd(font=options["font"], colour=color, timeout=duration, shadow=2, lines=nblines)
+                for line in range(nblines) :
+                    upq = upquotas[line]
+                    if upq.HardLimit is None :
+                        if upq.SoftLimit is None :
+                            percent = "%s" % upq.PageCounter
+                        else :        
+                            percent = "%s%%" % min((upq.PageCounter * 100) / upq.SoftLimit, 100)
+                    else :        
+                        percent = "%s%%" % min((upq.PageCounter * 100) / upq.HardLimit, 100)
+                    display.display(_("Pages used on %s : %s") % (upq.Printer.Name, percent), type=pyosd.TYPE_STRING, line=line)
+            else :
+                if user.AccountBalance <= 0 :
+                    color = "#FF0000"
+                display = pyosd.osd(font=options["font"], colour=color, timeout=duration, shadow=2)
+                display.display(_("PyKota Units left : %.2f") % user.AccountBalance, type=pyosd.TYPE_STRING)
+                
+            time.sleep(duration + 1)
+            if loop :
+                loop -= 1
+                if not loop :
+                    break
+            time.sleep(sleep)        
+            
+        return 0    
+        
+if __name__ == "__main__" :
+    retcode = -1
+    try :
+        defaults = { \
+                     "color" : "#00FF00", \
+                     "duration" : "3", \
+                     "font" : pyosd.default_font, \
+                     "loop" : "0", \
+                     "sleep" : "180", \
+                   }
+        short_options = "hvc:d:f:l:s:"
+        long_options = ["help", "version", "color=", "colour=", "duration=", "font=", "loop=", "sleep="]
+        
+        cmd = PyKOSD(doc=__doc__)
+        cmd.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = cmd.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["color"] = options["c"] or options["color"] or options["colour"] or defaults["color"]
+        options["duration"] = options["d"] or options["duration"] or defaults["duration"]
+        options["font"] = options["f"] or options["font"] or defaults["font"]
+        options["loop"] = options["l"] or options["loop"] or defaults["loop"]
+        options["sleep"] = options["s"] or options["sleep"] or defaults["sleep"]
+        
+        if options["help"] :
+            cmd.display_usage_and_quit()
+        elif options["version"] :
+            cmd.display_version_and_quit()
+        else :    
+            retcode = cmd.main(args, options)
+    except KeyboardInterrupt :
+        retcode = 0
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :    
+        try :
+            cmd.crashed("pykosd failed")
+        except :    
+            crashed("pykosd failed")
+        
+    try :
+        cmd.storage.close()
+    except :    
+        pass
+        
+    sys.exit(retcode)
Index: pykota/tags/1.22/bin/Makefile.am
===================================================================
--- pykota/tags/1.22/bin/Makefile.am (revision 2146)
+++ pykota/tags/1.22/bin/Makefile.am (revision 2146)
@@ -0,0 +1,20 @@
+bin_SCRIPTS = edpykota snmpprinterstatus repykota warnpykota pykotme pkprinters pkhint
+
+pykotasharedir = $(datadir)/pykota
+pykotashare_DATA = 		\
+	cupspykota			\
+	mailandpopup.sh		\
+	papwaitprinter.sh	\
+	waitprinter.sh
+
+EXTRA_DIST = 			\
+	$(bin_SCRIPTS)		\
+	$(pykotashare_DATA)
+#	edpykota 			\
+#	snmpprinterstatus 	\
+#	repykota 			\
+#	warnpykota 			\
+#	pykotme 			\
+#	pkprinters 			\
+#	pkhint				\
+#	pkpgcounter
Index: pykota/tags/1.22/bin/lprngpykota
===================================================================
--- pykota/tags/1.22/bin/lprngpykota (revision 2217)
+++ pykota/tags/1.22/bin/lprngpykota (revision 2217)
@@ -0,0 +1,285 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# LPRngPyKota accounting filter
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+
+from pykota.tool import PyKotaFilterOrBackend, PyKotaToolError, crashed
+from pykota.config import PyKotaConfigError
+from pykota.storage import PyKotaStorageError
+from pykota.accounter import PyKotaAccounterError
+    
+# Exit codes
+JSUCC = 0       # filter succeeded
+JFAIL = 1       # filter failed, print server should retry later
+JABORT = 2      # filter failed, print server should suspend the queue
+JREMOVE = 3     # job will be removed from print queue
+JHOLD = 6       # job will be prevented from printing until lpc release
+
+# Environment variables
+# PRINTER = printer name
+# PRINTCAP_ENTRY = complete printcap entry for this printer
+# HF = job hold file contents
+# SPOOL_DIR = spool directory
+
+# HF contains df_name which is DataFile_Name created in SPOOL_DIR
+
+class PyKotaFilter(PyKotaFilterOrBackend) :        
+    """A class for the pykota filter for LPRng."""
+    def acceptJob(self) :        
+        """Returns the appropriate exit code to tell LPRng all is OK."""
+        return JSUCC
+            
+    def removeJob(self) :            
+        """Returns the appropriate exit code to tell LPRng job has to be removed."""   
+        return JREMOVE
+        
+    def getJobOriginatingHostname(self, printername, username, jobid) :
+        """Retrieves the job-originating-hostname if possible."""
+        try :
+            return [line[11:] for line in os.environ.get("HF", "").split() if line.startswith("remotehost=")][0]
+        except IndexError :    
+            try :
+                return [line[1:] for line in os.environ.get("CONTROL", "").split() if line.startswith("H")][0]
+            except IndexError :    
+                return None
+                
+    def firstPass(self, policy, printer, user, userpquota) :            
+        """First pass done here."""
+        # first we have to check if previous job was correctly accounted for
+        self.logdebug("First pass begins : POLICY_%s => %s => %s" % (policy, getattr(printer, "Name", None), getattr(user, "Name", None)))
+        if printer.LastJob.Exists and not printer.LastJob.JobSize :
+            # here we know that previous job wasn't accounted for correctly
+            # we are sure (?) that it was hardware accounting which was used
+            # and that the second pass didn't work or wasn't even launched
+            # we know have to act just as if we were in second pass
+            # for previous user on this printer, then we will continue
+            # with normal processing of current user.
+            self.secondPass(policy, printer, None, None)
+        
+        # export user info with initial values
+        self.exportUserInfo(userpquota)
+        
+        # tries to extract job-originating-hostname 
+        clienthost = self.getJobOriginatingHostname(printer.Name, user.Name, self.jobid)
+        self.logdebug("Client Hostname : %s" % (clienthost or "Unknown"))    
+        os.environ["PYKOTAJOBORIGINATINGHOSTNAME"] = str(clienthost or "")
+        
+        # indicates first pass
+        os.environ["PYKOTAPHASE"] = "BEFORE"
+        
+        # precomputes the job's price
+        self.softwareJobPrice = userpquota.computeJobPrice(self.softwareJobSize)
+        os.environ["PYKOTAPRECOMPUTEDJOBPRICE"] = str(self.softwareJobPrice)
+        self.logdebug("Precomputed job's size is %s pages, price is %s units" % (self.softwareJobSize, self.softwareJobPrice))
+        
+        # if no data to pass to real backend, probably a filter
+        # higher in the chain failed because of a misconfiguration.
+        # we deny the job in this case (nothing to print anyway)
+        if not self.jobSizeBytes :
+            self.printMoreInfo(user, printer, _("Job contains no data. Printing is denied."), "warn")
+            action = "DENY"
+        elif self.config.getDenyDuplicates(printer.Name) \
+             and printer.LastJob.Exists \
+             and (printer.LastJob.UserName == user.Name) \
+             and (printer.LastJob.JobMD5Sum == self.checksum) :
+            self.printMoreInfo(user, printer, _("Job is a duplicate. Printing is denied."), "warn")
+            action = "DENY" 
+        else :    
+            # checks the user's quota
+            action = self.warnUserPQuota(userpquota)
+        
+        # exports some new environment variables
+        os.environ["PYKOTAACTION"] = action
+        
+        # launches the pre hook
+        self.prehook(userpquota)
+        
+        self.printMoreInfo(user, printer, _("Job accounting begins."))
+        self.accounter.beginJob(printer)
+        
+        jobsize = None
+        if self.accounter.isSoftware :
+            self.accounter.endJob(printer)
+            jobsize = self.accounter.getJobSize(printer)
+            self.printMoreInfo(user, printer, _("Job accounting ends."))
+            
+        if action == "DENY" :   
+            jobsize = 0
+            self.printMoreInfo(user, printer, _("Job size forced to 0 because printing is denied."))
+            
+        if (self.accounter.isSoftware) or (action == "DENY") :    
+            # update the quota for the current user on this printer 
+            self.printMoreInfo(user, printer, _("Job size : %i") % jobsize)
+            self.printInfo(_("Updating user %s's quota on printer %s") % (user.Name, printer.Name))
+            jobprice = userpquota.increasePagesUsage(jobsize)
+            
+            printer.addJobToHistory(self.jobid, user, self.accounter.getLastPageCounter(), \
+                                    action, jobsize, jobprice, self.preserveinputfile, \
+                                    self.title, self.copies, self.options, clienthost, \
+                                    self.jobSizeBytes, self.checksum, None, None) # TODO : pages detail and billing code
+            self.printMoreInfo(user, printer, _("Job added to history."))
+            
+            # exports some new environment variables
+            os.environ["PYKOTAPHASE"] = "AFTER"
+            os.environ["PYKOTAJOBSIZE"] = str(jobsize)
+            os.environ["PYKOTAJOBPRICE"] = str(jobprice)
+            
+            # then re-export user information with new value
+            self.exportUserInfo(userpquota)
+            
+            # Launches the post hook
+            self.posthook(userpquota)
+            
+            # here accounting was completed, either software, or hardware but over quota
+        else :
+            printer.addJobToHistory(self.jobid, user, self.accounter.getLastPageCounter(), \
+                                    action, filename=self.preserveinputfile, title=self.title, \
+                                    copies=self.copies, options=self.options, clienthost=clienthost, \
+                                    jobsizebytes=self.jobSizeBytes, jobmd5sum=self.checksum, jobpages=None, jobbilling=None) # TODO : pages detail and billing code
+            self.logdebug("Job added to history during first pass : Job's size and price are still unknown.")
+            
+        self.logdebug("First pass ends : ACTION_%s => %s => %s" % (action, getattr(printer, "Name", None), getattr(user, "Name", None)))
+        if action == "DENY" :
+            return self.removeJob()
+        else :    
+            return self.acceptJob()
+        
+    def secondPass(self, policy, printer, user, userpquota) :    
+        """Second pass done here."""
+        # Last job for current printer has the same JobId than
+        # the current job, so we know we are in the second pass
+        self.logdebug("Second pass begins : POLICY_%s => %s => %s" % (policy, getattr(printer, "Name", None), getattr(user, "Name", None)))
+        if self.accounter.isSoftware :
+            # Software accounting method was used, and we are
+            # in second pass, so all work is already done, 
+            # now we just have to exit successfully
+            self.printInfo(_("Software accounting already done in first pass. Ignoring."))
+        elif printer.LastJob.JobAction == "DENY" :
+            # Hardware accounting method was used, but job
+            # was rejected during first pass, so nothing to do
+            self.printInfo(_("Hardware accounting already done in first pass. Ignoring."))
+        else :    
+            # here if user and userpquota are both None
+            # then it's a special second pass for a job
+            # which should have had one but didn't, so
+            # we need to get the last user, not the current one.
+            if (user is None) and (userpquota is None) :
+                user = printer.LastJob.User
+                userpquota = self.storage.getUserPQuota(user, printer)
+                
+            # exports user info for last user    
+            self.exportUserInfo(userpquota)
+            
+            # indicate phase change
+            os.environ["PYKOTAPHASE"] = "AFTER"
+            
+            # fakes beginning of job with old page counter
+            self.accounter.LastPageCounter = int(printer.LastJob.PrinterPageCounter or 0)
+            self.accounter.fakeBeginJob()
+            self.logdebug("Fakes beginning of job with LastPageCounter: %s" % self.accounter.getLastPageCounter())
+            
+            # stops accounting. 
+            self.accounter.endJob(printer)
+            self.logdebug("Job accounting ends.")
+                
+            # retrieve the job size    
+            jobsize = self.accounter.getJobSize(printer)
+            if self.softwareJobSize and (jobsize != self.softwareJobSize) :
+                self.printInfo(_("Beware : computed job size (%s) != precomputed job size (%s)") % (jobsize, self.softwareJobSize), "error")
+                (limit, replacement) = self.config.getTrustJobSize(printer.Name)
+                if limit is None :
+                    self.printInfo(_("The job size will be trusted anyway according to the 'trustjobsize' directive"), "warn")
+                else :
+                    if jobsize <= limit :
+                        self.printInfo(_("The job size will be trusted because it is inferior to the 'trustjobsize' directive's limit %s") % limit, "warn")
+                    else :
+                        self.printInfo(_("The job size will be modified according to the 'trustjobsize' directive : %s") % replacement, "warn")
+                        if replacement == "PRECOMPUTED" :
+                            jobsize = self.softwareJobSize
+                        else :    
+                            jobsize = replacement
+            
+            self.printMoreInfo(user, printer, _("Job size : %i") % jobsize)
+            self.printInfo(_("Updating user %s's quota on printer %s") % (user.Name, printer.Name))
+            jobprice = userpquota.increasePagesUsage(jobsize)
+            
+            self.storage.writeLastJobSize(printer.LastJob, jobsize, jobprice)
+            self.printMoreInfo(user, printer, _("Job size and price now set in history."))
+            
+            # exports some new environment variables
+            os.environ["PYKOTAPHASE"] = "AFTER"
+            os.environ["PYKOTAJOBSIZE"] = str(jobsize)
+            os.environ["PYKOTAJOBPRICE"] = str(jobprice)
+            
+            # then re-export user information with new value
+            self.exportUserInfo(userpquota)
+            
+            # Launches the post hook
+            self.posthook(userpquota)
+            
+            # here hardware accounting was completed.
+        self.logdebug("Second pass ends : POLICY_%s => %s => %s" % (policy, getattr(printer, "Name", None), getattr(user, "Name", None)))
+        return self.acceptJob()
+        
+    def doWork(self, policy, printer, user, userpquota) :    
+        """Most of the work is done here."""
+        # Two different values possible for policy here :
+        # ALLOW means : Either printer, user or user print quota doesn't exist,
+        #               but the job should be allowed anyway.
+        # OK means : Both printer, user and user print quota exist, job should
+        #            be allowed if current user is allowed to print on this printer
+        if policy == "ALLOW" :
+            # nothing to do, just accept the job
+            return self.acceptJob()
+        else :    
+            if printer.LastJob.Exists and (printer.LastJob.JobId == self.jobid) :
+                # here we know we are in second pass.
+                return self.secondPass(policy, printer, user, userpquota)
+            else :    
+                # Last job for current printer has a different JobId than
+                # the current job, so we know we are in the first pass.
+                return self.firstPass(policy, printer, user, userpquota)
+            
+if __name__ == "__main__" :    
+    retcode = JSUCC
+    try :
+        # Initializes the backend
+        kotabackend = PyKotaFilter()    
+        kotabackend.deferredInit()
+        retcode = kotabackend.mainWork()
+        kotabackend.storage.close()
+        kotabackend.closeJobDataStream()    
+    except SystemExit :    
+        retcode = JABORT
+    except :
+        try :
+            kotabackend.crashed("lprngpykota filter failed")
+        except :    
+            crashed("lprngpykota filter failed")
+        retcode = JABORT
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/pkmail
===================================================================
--- pykota/tags/1.22/bin/pkmail (revision 2216)
+++ pykota/tags/1.22/bin/pkmail (revision 2216)
@@ -0,0 +1,191 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# An email gateway for PyKota
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import popen2
+import smtplib
+import email
+
+from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
+from pykota.pdlanalyzer import PDLAnalyzer, PDLAnalyzerError
+
+__doc__ = N_("""pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+
+Email gateway for PyKota.
+
+command line usage :
+
+  pkmail  [options]
+
+options :
+
+  -v | --version       Prints pkmail's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+    
+  This command is meant to be used from your mail server's aliases file,
+  as a pipe. It will then accept commands send to it in email messages,
+  and will send the answer to the command's originator.
+  
+  To use this command, create an email alias in /etc/aliases with
+  the following format :
+  
+    pykotacmd: "|/usr/bin/pkmail"
+    
+  Then run the 'newaliases' command to regenerate the aliases database.
+  
+  You can now send commands by email to 'pykotacmd@yourdomain.com', with
+  the command in the subject.
+  
+  List of supported commands :
+  
+        report [username]
+  
+  NB : For pkmail to work correctly, you may have to put the 'mail'
+  system user in the 'pykota' system group to ensure this user can
+  read the /etc/pykota/pykotadmin.conf file, and restart your
+  mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+  that you think at least twice before doing this though.
+  
+  Use at your own risk !
+  
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+        
+class PKMail(PyKotaTool) :        
+    """A class for pkmail."""
+    def main(self, files, options) :
+        """Accepts commands passed in an email message."""
+        data = sys.stdin.read()
+        message = email.message_from_string(data)
+        useremail = message["From"]
+        whoami = message["To"]
+        cmdargs = message["Subject"].split()
+        try :
+            (command, arguments) = (cmdargs[0].capitalize(), cmdargs[1:])
+        except IndexError :    
+            raise PyKotaToolError, "No command found !"
+        
+        badchars = """/<>&"'#!%*$,;\\"""
+        cheatmeonce = 0
+        for c in "".join(arguments) :
+            if c in badchars :
+                cheatmeonce = 1
+            
+        if cheatmeonce :    
+            self.logdebug("Possible intruder at %s : %s" % (useremail, str(arguments)))
+            result = "Either you mistyped your command, or you're a bad guy !"
+        else :
+            self.logdebug("Launching internal command '%s' with arguments %s" % (command, str(arguments)))
+            cmdfunc = getattr(self, "cmd%s" % command, self.cmdDefault)
+            result = cmdfunc(arguments)
+        
+        self.logdebug("Sending answer to : %s" % useremail)
+        server = smtplib.SMTP(self.smtpserver)
+        server.sendmail(whoami, [ useremail ], "From: %s\nTo: %s\nSubject: Result of your commands\n\n%s\n" % (whoami, useremail, result))
+        server.quit()
+        self.logdebug("Answer sent to : %s" % useremail)
+        
+        return 0
+        
+    def runCommand(self, cmd) :    
+        """Executes a command."""
+        self.logdebug("Launching : '%s'" % cmd)
+        os.environ["PATH"] = "%s:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin" % os.environ.get("PATH", "")
+        child = popen2.Popen3(cmd)
+        child.tochild.close()
+        result = child.fromchild.read()
+        status = child.wait()
+        if os.WIFEXITED(status) :
+            status = os.WEXITSTATUS(status)
+        self.logdebug("'%s' exited with status %s" % (cmd, status))
+        return result
+        
+    def cmdDefault(self, arguments) :    
+        """Default command : sends an 'unknown command' message."""
+        return "Unknown command."
+        
+    def cmdReport(self, args) :    
+        """Generates a print quota report."""
+        return self.runCommand("repykota %s" % ' '.join([ '"%s"' % a for a in args ]))
+            
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        defaults = { \
+                   }
+        short_options = "vh"
+        long_options = ["help", "version"]
+        
+        # Initializes the command line tool
+        mailparser = PKMail(doc=__doc__)
+        mailparser.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = mailparser.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        
+        if options["help"] :
+            mailparser.display_usage_and_quit()
+        elif options["version"] :
+            mailparser.display_version_and_quit()
+        else :
+            retcode = mailparser.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            mailparser.crashed("pkmail failed")
+        except :    
+            crashed("pkmail failed")
+        retcode = -1
+
+    try :
+        mailparser.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/bin/dumpykota
===================================================================
--- pykota/tags/1.22/bin/dumpykota (revision 2218)
+++ pykota/tags/1.22/bin/dumpykota (revision 2218)
@@ -0,0 +1,178 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Data Dumper
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+
+from pykota import version
+from pykota.tool import PyKotaToolError, crashed, N_
+from pykota.dumper import DumPyKota
+
+__doc__ = N_("""dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres
+
+Dumps PyKota database's content.
+
+command line usage :
+
+  dumpykota [options] [filterexpr]
+
+options :
+
+  -v | --version       Prints dumpykota's version number then exits.
+  -h | --help          Prints this message then exits.
+  
+  -d | --data type     Dumps 'type' datas. Allowed types are :
+                       
+                         - history : dumps the jobs history.
+                         - users : dumps users.
+                         - groups : dumps user groups.
+                         - printers : dump printers.
+                         - upquotas : dump user quotas.
+                         - gpquotas : dump user groups quotas.
+                         - payments : dumps user payments.
+                         - pmembers : dumps printer groups members.
+                         - umembers : dumps user groups members.
+                         
+                       NB : the -d | --data command line option   
+                       is MANDATORY.
+  
+  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,
+                       the format is to dump datas in the csv format (comma
+                       separated values). All data dumped is between double
+                       quotes. Allowed formats are :
+                       
+                         - csv : separate datas with commas
+                         - ssv : separate datas with semicolons
+                         - tsv : separate datas with tabs
+                         - xml : dump data as XML
+                         - cups : dump datas in CUPS' page_log format :
+                                  ONLY AVAILABLE WITH --data history
+                         
+  -o | --output fname  All datas will be dumped to the file instead of
+                       to the standard output. The special '-' filename
+                       is the default value and means stdout.
+                       WARNING : existing files are truncated !
+                       
+  Use the filter expressions to extract only parts of the 
+  datas. Allowed filters are of the form :
+                
+         key=value
+                         
+  Allowed keys for now are :  
+                       
+         username       User's name
+         groupname      Users group's name
+         printername    Printer's name
+         pgroupname     Printers group's name
+         hostname       Client's hostname
+         billingcode    Job's billing code
+         
+  Contrary to other PyKota management tools, wildcard characters are not 
+  expanded, so you can't use them.
+  
+  NB : not all keys are allowed for each data type, so the result may be 
+  empty if you use a key not available for a particular data type.
+  
+Examples :
+
+  $ dumpykota --data history --format csv >myfile.csv
+  
+  This dumps the history in a comma separated values file, for possible
+  use in a spreadsheet.
+  
+  $ dumpykota --data users --format xml -o users.xml
+  
+  Dumps all users datas to the users.xml file.
+  
+  $ dumpykota --data history printername=HP2100 username=jerome
+  
+  Dumps the job history for user jerome on printer HP2100 only.
+  
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+Please e-mail bugs to: %s""")
+        
+if __name__ == "__main__" : 
+    retcode = 0
+    try :
+        defaults = { \
+                     "format" : "csv", \
+                     "output" : "-", \
+                   }
+        short_options = "vhd:f:o:"
+        long_options = ["help", "version", "data=", "format=", "output="]
+        
+        # Initializes the command line tool
+        dumper = DumPyKota(doc=__doc__)
+        dumper.deferredInit()
+        
+        # parse and checks the command line
+        (options, args) = dumper.parseCommandline(sys.argv[1:], short_options, long_options, allownothing=1)
+        
+        # sets long options
+        options["help"] = options["h"] or options["help"]
+        options["version"] = options["v"] or options["version"]
+        options["data"] = options["d"] or options["data"]
+        options["format"] = options["f"] or options["format"] or defaults["format"]
+        options["output"] = options["o"] or options["output"] or defaults["output"]
+        
+        if options["help"] :
+            dumper.display_usage_and_quit()
+        elif options["version"] :
+            dumper.display_version_and_quit()
+        elif options["data"] is None :    
+            raise PyKotaToolError, _("The -d | --data command line option is mandatory, see help.")
+        else :
+            retcode = dumper.main(args, options)
+    except KeyboardInterrupt :        
+        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
+    except SystemExit :        
+        pass
+    except :
+        try :
+            dumper.crashed("dumpykota failed")
+        except :    
+            crashed("dumpykota failed")
+        retcode = -1
+
+    try :
+        dumper.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(retcode)    
Index: pykota/tags/1.22/man/edpykota.1
===================================================================
--- pykota/tags/1.22/man/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+edpykota \- manual page for edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/autopykota.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/edpykota.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/pykotme.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/pykosd.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/pkhint.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/pkmail.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/repykota.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/sv_SE/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/sv_SE/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/sv_SE/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/waitprinter.sh.1
===================================================================
--- pykota/tags/1.22/man/waitprinter.sh.1 (revision 2146)
+++ pykota/tags/1.22/man/waitprinter.sh.1 (revision 2146)
@@ -0,0 +1,39 @@
+.TH WAITPRINTER.SH "1" "February 2004" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+waitprinter.sh \- PyKota script to wait for an SNMP-capable printer to become idle
+.SH SYNOPSIS
+.B waitprinter.sh
+.RI hostname
+.SH DESCRIPTION
+This manual page documents briefly the
+.B waitprinter.sh
+command.
+.PP
+\fBwaitprinter.sh\fP is a convenience script provided by pykota that attempts
+to wait until a SNMP-capable printer becomes idle. This may be of use
+in /etc/pykota/pykota.conf. The use of this command requires that the snmp
+package is installed.
+
+For further information, see the HTML documentation that came with the pykota
+package, found in /usr/share/doc/pykota/html/.
+
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+.PP
+Please e-mail bugs to: Jerome Alet - alet@librelogiciel.com
+
+.SH AUTHOR
+This manual page was written by Peter Hawkins for the Debian GNU/Linux system
+(but may be used by others).
Index: pykota/tags/1.22/man/papwaitprinter.sh.1
===================================================================
--- pykota/tags/1.22/man/papwaitprinter.sh.1 (revision 2146)
+++ pykota/tags/1.22/man/papwaitprinter.sh.1 (revision 2146)
@@ -0,0 +1,39 @@
+.TH PAPWAITPRINTER.SH "1" "February 2004" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+papwaitprinter.sh \- PyKota script to wait for an AppleTalk-capable printer to become idle
+.SH SYNOPSIS
+.B papwaitprinter.sh
+.RI printerAppleTalkName
+.SH DESCRIPTION
+This manual page documents briefly the
+.B papwaitprinter.sh
+command.
+.PP
+\fBpapwaitprinter.sh\fP is a convenience script provided by pykota that attempts
+to wait until an AppleTalk-capable printer becomes idle. This may be of use
+in /etc/pykota/pykota.conf. The use of this command requires that the netatalk
+package is installed.
+
+For further information, see the HTML documentation that came with the pykota
+package, found in /usr/share/doc/pykota/html/.
+
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+.PP
+Please e-mail bugs to: Jerome Alet - alet@librelogiciel.com
+
+.SH AUTHOR
+This manual page was written by Jerome Alet for the Debian GNU/Linux system
+(but may be used by others).
Index: pykota/tags/1.22/man/pt/autopykota.1
===================================================================
--- pykota/tags/1.22/man/pt/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/edpykota.1
===================================================================
--- pykota/tags/1.22/man/pt/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/pt/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/pt/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/pykotme.1
===================================================================
--- pykota/tags/1.22/man/pt/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/pykosd.1
===================================================================
--- pykota/tags/1.22/man/pt/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/pt/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/pkhint.1
===================================================================
--- pykota/tags/1.22/man/pt/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/pkmail.1
===================================================================
--- pykota/tags/1.22/man/pt/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/repykota.1
===================================================================
--- pykota/tags/1.22/man/pt/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/pt/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/tr/autopykota.1
===================================================================
--- pykota/tags/1.22/man/tr/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Kullanıcı hesapları oluşumunu otomatikleştirme ve başlangıç hesap ayarları için araç.
+.PP
+BU ARAÇ KULLANICILARINIZI SAYFA KOTASI İLE SINIRLAMAK İÇİN KULLANILMAMALIDIR !
+.PP
+komut satırı kullanımı :
+.TP
+BU ARAÇ KOMUT SATIRINDAN KULLANILMAMALIDIR FAKAT SADECE
+pykota.conf İÇİNDE external policy OLARAK KULLANILABİLİR
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR değer }
+.PP
+seçenekler :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+autopykota'nın sürüm numarasını yazar ve çıkar.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+bu mesajı yazar ve çıkar.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Kullanıcının başlangıç hesabını b değeri olarak atar.
+Eğer kullanıcı zaten varsa, mevcut hesap değişmeden kalır.
+Eğer yok ise öntanımlı değer 0'dır.
+.PP
+Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından
+yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi
+tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir
+ve/ya da değiştirebilirsiniz.
+.PP
+Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR
+GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL
+DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel
+Kamu Lisansını okuyun.
+.PP
+GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış
+olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place,
+Suite 330, Boston, MA 02111\-1307, USA adresinden ulaşın.
+.PP
+Lütfen hataları Jerome Alet \- alet@librelogiciel.com adresine mektupla bildirin
Index: pykota/tags/1.22/man/tr/edpykota.1
===================================================================
--- pykota/tags/1.22/man/tr/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/tr/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/tr/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/tr/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/tr/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/tr/pykotme.1
===================================================================
--- pykota/tags/1.22/man/tr/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/pykotme.1 (revision 2237)
@@ -0,0 +1,64 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Kullanıcılara kota verir.
+.PP
+komut satırı kullanımı :
+.TP
+pykotme
+[seçenekler]  [dosyalar]
+.PP
+seçenekler :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+pykotme'nin sürüm numarasını gösterir ve çıkar.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Bu mesaji gösterir ve çıkar.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Sadece bu yazıcı için kota verir. p maske
+karakterlerini birden fazla yazıcı belirtmek için
+içerebilir. Öntanımlı değer *'dır, tüm yazıcılar
+anlamına gelir.
+Virgül ile ayırarak birden fazla yazıcı ve maske
+kullanabilirsiniz.
+.PP
+örnekler :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+Mevcut kullanıcıya kota verir. Kota ücreti ve isin boyutu
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+Bu mevcut kullanıcının baskı bilgisini yazdırır. Bilgiler
+apple ve hplaser yazıcılarına gönderilirse, standart girdiden
+okunacak file1.ps için iş ücreti ve işin boyutunu gösterir.
+.IP
+\f(CW$ pykotme\fR
+.IP
+Standart girdideki işin hakkında bilgi gösterir. Bilgi işin boyutunu
+ücretini ve her yazıcı için ne kadar tutacağını içerir.
+.PP
+Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından
+yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi
+tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir
+ve/ya da değiştirebilirsiniz.
+.PP
+Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR
+GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL
+DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel
+Kamu Lisansını okuyun.
+.PP
+GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış
+olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place,
+Suite 330, Boston, MA 02111\-1307, USA adresinden ulaşın.
+.PP
+Lütfen hataları Jerome Alet \- alet@librelogiciel.com adresine mektupla bildirin
Index: pykota/tags/1.22/man/tr/pykosd.1
===================================================================
--- pykota/tags/1.22/man/tr/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+PyKota için bir OSD kota izleyicisi.
+.PP
+komut satırı kullanımı :
+.IP
+pykosd [seçenekler]
+.PP
+seçenekler :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+pykosd'nin sürüm numarasını yazar ve çıkar.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Bu mesajı yazar ve çıkar.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb onaltılı üçlü olarak arkaplan rengini ayarlar
+örneğin #FF0000 değeri 100% kırmızı yapar.
+Öntanımlı 100% yeşildir (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Saniye olarak gösterim süresini belirtir.
+Öntanımlı 3 saniyedir.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Gösterim için kullanılacak yazıtipini ayarlar.
+Öntanımlı Python OSD kütüphanesinin öntanımlısıdır.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Bilginin kaç kere gösterileceğini ayarlar.
+Öntanımlı 0'dır, sonsuza kadar döngü yapılacaıını belirtir.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Saniye cinsinden iki gösterim arasında beklenecek
+süreyi ayarlar. Öntanımlı 180 saniyedir (3 dakika).
+.PP
+örnekler :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+pykosd'yi başlatır. Gösterim her 60 saniyede tazelenir,
+ve her defasında 3 saniye sonunda (ön tanımlı) sona erer. Beş
+tekrardan sonra çıkar.
+.PP
+Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından
+yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi
+tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir
+ve/ya da değiştirebilirsiniz.
+.PP
+Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR
+GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL
+DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel
+Kamu Lisansını okuyun.
+.PP
+GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış
+olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place,
+Suite 330, Boston, MA 02111\-1307, USA adresinden ulaşın.
+.PP
+Lütfen hataları Jerome Alet \- alet@librelogiciel.com adresine mektupla bildirin
Index: pykota/tags/1.22/man/tr/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/tr/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/tr/pkhint.1
===================================================================
--- pykota/tags/1.22/man/tr/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Her yazıcı için hangi hesaplama metodunun uygun olacaıı hakkında ipucu veren bir araç.
+.PP
+komut satırı kullanımı :
+.IP
+pkhint [seçenekler] [yazıcı1 yazıcı2 yazıcı3 ... yazıcıN] <file.conf
+.PP
+seçenekler :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+pkhint'in sürüm numarasını gösterir ve çıkar.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Bu mesaji gösterir ve çıkar.
+.PP
+örnekler :
+.IP
+\f(CW$ pkhint "hp*" yazici103 </etc/cups/printers.conf\fR
+.IP
+Parametrelerde belirtilen isim ile eşleşen yazıcılar için
+hangi metodun uygun olduğunu sınamak için
+yazma sisteminizi inceler.
+.IP
+Eğer komut satırında hiçbir parametre belirtmezseniz, tüm
+yazıcılar incelenecektir.
+.PP
+Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından
+yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi
+tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir
+ve/ya da değiştirebilirsiniz.
+.PP
+Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR
+GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL
+DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel
+Kamu Lisansını okuyun.
+.PP
+GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış
+olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place,
+Suite 330, Boston, MA 02111\-1307, USA adresinden ulaşın.
+.PP
+Lütfen hataları Jerome Alet \- alet@librelogiciel.com adresine mektupla bildirin
Index: pykota/tags/1.22/man/tr/pkmail.1
===================================================================
--- pykota/tags/1.22/man/tr/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/tr/repykota.1
===================================================================
--- pykota/tags/1.22/man/tr/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Yacıcı kotası raporları oluşturur.
+.PP
+komut satırı kullanımı :
+.IP
+repykota [seçenekler]
+.PP
+seçenekler :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+repykota'nın sürüm numarasını gösterir ve çıkar.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Bu mesaji gösterir ve çıkar.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Kullanıcı kotaları üzerine bir rapor oluşturur, bu
+öntanımlıdır.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Kullanıcılar yerine grup kotaları üzerine rapor oluşturur.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Sadece bu yazıcı üzerindeki kotaları raporlar. p maske
+karakterleri kullanarak sadece bazı yazıcıları seçebilir.
+Öntanımlı değer *'dır, tüm yazıcılar
+anlamına gelir.
+Virgül ile ayırarak birden fazla isim ya da maske
+kullanabilirsiniz.
+.PP
+örnekler :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+Bu lp yazıcısını kullanan tüm kullanıcıların kota durumlarını bildirir.
+.IP
+\f(CW$ repykota\fR
+.IP
+Bu tüm yacıcıların kullanıcıların kota durumlarını bildirir.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+Bu adı "laser" ile başlayan ya da "pson" ile biten tüm yazıcılar
+üzerinde adı "jo" ile başlayan ve adı jerome olan kullanıcıların kota
+durumlarını bildirir.
+.IP
+Eğer PyKota yöneticisi olmayan bir kullanıcı tarafından başlatılırsa,
+kullanıcı ve grup adlarını belirten parametreler yok sayılır, sadece mevcut
+kullanıcı ve grup hakkında bildirim yapılır.
+.PP
+Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından
+yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi
+tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir
+ve/ya da değiştirebilirsiniz.
+.PP
+Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR
+GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL
+DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel
+Kamu Lisansını okuyun.
+.PP
+GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış
+olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place,
+Suite 330, Boston, MA 02111\-1307, USA adresinden ulaşın.
+.PP
+Lütfen hataları Jerome Alet \- alet@librelogiciel.com adresine mektupla bildirin
Index: pykota/tags/1.22/man/tr/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/tr/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/tr/warnpykota.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Yazma kotası üzerinden kullanıcılara mektup gönderir.
+.PP
+komut satırı kullanımı :
+.TP
+warnpykota
+[seçenekler]  [adlar]
+.PP
+seçenekler :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+warnpykota'nın sürüm numarasını yaza ve çıkar.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Bu mesajı yazar ve çıkar.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Yazma kotası üzerindeki kullanıcıları uyarır, bu
+öntanımlıdır .
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Grupları yazma kotasının üzerinde olan kullanıcıları uyarır.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Sadece bu yazıcıyı denetler. p birkaç yazıcı
+seçmek için maske karakterlerini kullanabilir.
+Öntanımlı deıer *'dır, tüm yazıcılar anlamına
+gelir.
+Birden fazla ismi ya da maskeyi kullanabilirsiniz,
+onları virgül ile ayırarak kullanın.
+.PP
+örnekler :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+Bu lp yazıcısı üzerinde yazma kotalarını geçmiş olan tüm kullanıcıları
+uyarır.
+.IP
+\f(CW$ warnpykota\fR
+.IP
+Bu herhangi bir yazıcı üzerinde yazma kotasını geçmiş olan kullanıcıları
+uyarır.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+Bu adı "dev" ile başlayan ve adı "laserjer" ile başlayan herhangi bir yazıcı
+üzerinde yazma kotasını geçmiş tüm kullanıcıları uyarır
+.IP
+Eğer PyKota yöneticisi olmayan birisi tarafından başlatılırsa, kullanıcı ve
+grup adlarını belirten isimler yoksayılır, ve sadece mevcut kullanıcı/grup
+belirtilir.
+.PP
+Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından
+yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi
+tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir
+ve/ya da değiştirebilirsiniz.
+.PP
+Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR
+GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL
+DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel
+Kamu Lisansını okuyun.
+.PP
+GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış
+olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place,
+Suite 330, Boston, MA 02111\-1307, USA adresinden ulaşın.
+.PP
+Lütfen hataları Jerome Alet \- alet@librelogiciel.com adresine mektupla bildirin
Index: pykota/tags/1.22/man/pykotme.1
===================================================================
--- pykota/tags/1.22/man/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pykotme \- manual page for pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/autopykota.1
===================================================================
--- pykota/tags/1.22/man/el_GR/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/autopykota.1 (revision 2237)
@@ -0,0 +1,43 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+��� � ������������� ��� �����
+.PP
+�� � ���� ����� � ����������������� ����������������!
+.PP
+���� ���
+.IP
+� ���� �� ����� � ����������� ��� ���� ��
+� ����� ��� ���xternal policy) ��pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR � }
+.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����autopykota � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b ���� �������� �b.
+� ������ ��� ����� � � ����, ����
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/edpykota.1
===================================================================
--- pykota/tags/1.22/man/el_GR/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/el_GR/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/el_GR/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/pkprinters.1 (revision 2237)
@@ -0,0 +1,90 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+���� ������yKota.
+.PP
+���� ���
+.IP
+pkprinters [��� ���1 ���2 ... ���N
+.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����pkprinters � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+������� �� �� ���������, ����������� � ����\fB\-s\fR|\-\-skipexisting.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+������� � ��������.TP
+\fB\-D\fR | \fB\-\-description\fR
+����� ����������TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+���� ��� ��� � ����� ��������.
+� ������, ����������������� ����� ��TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] ���������� ����
+� �� ����g1, pg2, �.� ���������. ��������������� ���, ���� �
+������� ���. ������ ������������������� �������� ��
+���������������������������� ��
+��� ����������
+� � ���� �������\fB\-\-remove\fR, ��������� ��������� �� ����TP
+\fB\-l\fR | \fB\-\-list\fR
+������ �� ��� ����
+� ��� ����������
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+� �������fB\-\-groups\fR ��,
+������ � ���� ��
+����.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+� �������fB\-\-add\fR ��, �
+����pkprinters �����������.
+.IP
+� ������1 � ���N ������ ����� �� ����\fB\-\-add\fR.
+.PP
+���:
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+������������p2100, hp2200 � hp8000.
+�� � � ������.05 ��� � �� �
+� ����0.1 ��� ��� ������������ �� ��� � ���� ����
+�� ����� ��������"HP Printer".
+� ���� � � ��� ��������������� � ����\fB\-s\fR|\-\-skipexisting.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+�������� � ��� � ����� �
+������ ������ �.
+������� � ����!
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+��������� ������� �"hp*"
+� �� ����aser � HP, ���� ����.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+��������hp2200 � �������exMark.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/pykotme.1
===================================================================
--- pykota/tags/1.22/man/el_GR/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/pykotme.1 (revision 2237)
@@ -0,0 +1,61 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+��� ��� � ���� ����
+.PP
+���� ���
+.TP
+pykotme
+[���  [��]
+.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����pykotme � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+��� ��� ��������
+�p ���������� ����
+�������� �����*,
+��������������������� ���
+������.
+.PP
+����
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+��� ����� � ������������� �� � ��������������
+���ile1.ps � file2.ps ����������apple.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+��� ����� � ������������� �� � ��������������
+���ile1.ps ���������, ������ ���apple �����hplaser.
+.IP
+\f(CW$ pykotme\fR
+.IP
+��� ����� � � ���������
+���� ��. ������������������� ���� �����.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/pykosd.1
===================================================================
--- pykota/tags/1.22/man/el_GR/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/pykosd.1 (revision 2237)
@@ -0,0 +1,55 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+������PyKota ��������OSD).
+.PP
+���� ���
+.IP
+pykosd [���
+.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����pykosd � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb ����� ������������� ���� ��� #FF0000 ��100% �������������00% �� (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+��������������������� ����� ����.TP
+\fB\-f\fR | \fB\-\-font\fR f
+��������� �������������� �����OSD �Python.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+������ �������� ����
+�������, ���������TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+����� ��� �� � ����
+����������80 ����3 ��
+.PP
+����
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+����ykosd. ������������0 ����� ��� � 3 ������� ���. ��������, ��������
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/el_GR/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/pkhint.1
===================================================================
--- pykota/tags/1.22/man/el_GR/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/pkhint.1 (revision 2237)
@@ -0,0 +1,45 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+���� ��� � ����� �������
+.PP
+���� ���
+.IP
+pkhint [��� [���1 ���2 ... ���N] <file.conf
+.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����pkhint � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.PP
+����
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+����� ��� �� ����� ��
+������ ��� � ���� � ���
+��� ����� ����� � ����.
+.IP
+� ������������������� ���.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/pkmail.1
===================================================================
--- pykota/tags/1.22/man/el_GR/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/repykota.1
===================================================================
--- pykota/tags/1.22/man/el_GR/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/repykota.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+�����������PP
+���� ���
+.IP
+repykota [���
+.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����repykota � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+������ ������ ��� ��������
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+������ ������ ��
+������
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+����� ����� ����p ���������� ���� �������� �����*, �� ���������������� ���
+�������.
+.PP
+����
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+��� ���� ���� � �� ������� ���lp.
+.IP
+\f(CW$ repykota\fR
+.IP
+��� ���� ���� � �� ���������IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+��� ���� ���� � ���erome �
+�� ������� ���� "jo" �������� �� ���� "laser" �����pson".
+.IP
+� ��� � ���� ������ �PyKota, ������� ������������ � ��
+�������������
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/el_GR/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/el_GR/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/el_GR/warnpykota.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+��� email ������ �� �����.
+.PP
+���� ���
+.TP
+warnpykota
+[���  [���.PP
+���:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+��� �����warnpykota � ���.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+��� ����� ���.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+������ ���� ������ �. ��������
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+������ ����� �� ����.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+�������������� ����p ����������� ���� �������� ����� ��*, �������������������� ��� ��� ��������PP
+����
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+������� ������lp ��� �� ����� �.
+.IP
+\f(CW$ warnpykota\fR
+.IP
+������� ����� �� �����
+� ���� ���
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+������� ����� �������� �
+"dev" ����� �� ����� � ����
+������������  "laserjet"
+.IP
+� ��� � ���� ������ �PyKota, ��������������� ���� �
+����������� ��������.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+��� ��� �� e\-mail � Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/autopykota.1
===================================================================
--- pykota/tags/1.22/man/de/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/de/autopykota.1 (revision 2237)
@@ -0,0 +1,47 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Ein Programm zum automatischen Anlegen von Benutzer\-Konti
+und zum Setzen von Anfangswerten
+.PP
+SIE D�FEN NICHT DIESES PROGRAMM VERWENDEN,
+WENN SIE DIE KONTINGENTE F� IHRE BENUTZER AUF DER BASIS VON SEITENZAHLEN SETZEN WOLLEN!
+.PP
+Gebrauch auf der Kommandozeile:
+.IP
+SIE D�FEN DIESES PROGRAMM NICHT AUF DER KOMMANDOZEILE BENUTZEN, SONDERN
+NUR ALS ALS external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+Optionen:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Version von autopykota aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Meldung aus und endet.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Setzt den Anfangswert der Balance des Benutzerkontos auf b.
+Wenn der Benutzer schon existiert, wird der aktuelle Balance\-Wert
+unver�ert gelassen. Wenn er nicht gesetzt wird,
+ist der Standardwert 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/edpykota.1
===================================================================
--- pykota/tags/1.22/man/de/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/de/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/de/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/de/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/de/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/de/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Ein Druckermanager f�ota.
+.PP
+Kommandozeilen\-Gebrauch:
+.IP
+pkprinters [Optionen] Drucker1 Drucker2 Drucker3 ... DruckerN
+.PP
+Optionen:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Versionsnummer von pkprinters aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Nachricht aus und endet.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+F�ucker hinzu, wenn sie in der Kontingentverwaltung
+noch nicht existieren. Wenn sie existieren, werden sie
+angepasst, ausser \fB\-s\fR | \fB\-\-skipexisting\fR ist auch gesetzt.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+L�t Drucker aus der Kontingentverwaltung.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d F�n Druckern eine Beschreibung hinzu.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Setzt den Preis pro Seite und pro Auftrag fest. Der Preis
+pro Auftrag ist fakultativ.
+Werden beide verwendet, trennen Sie sie mit einem Komma ab.
+Flie�ommazahlen und negative Werte sind erlaubt.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] F�n/die Drucker der Druckergruppen pg1,
+pg2, etc..., die schon existieren m� hinzu.
+Eine Druckergruppe ist wie ein normaler Drucker,
+bloss kennt man ihn �erweise im
+Drucksystem nicht. Richten Sie Druckergruppen genau
+gleich wie Drucker ein, dann f�ie andere
+Drucker mit dieser Option hinzu.
+Die Kontof� wird f�en Drucker und f�e
+Druckergruppen, denen er angeh� gemacht,
+die Kontingent��wird f� Drucker
+und f�e Druckergruppen, zu denen er geh�
+gemacht.
+Wenn die Option \fB\-\-remove\fR (siehe weiter unten) nicht
+gesetzt ist, so werden standardm�ig Drucker der
+angegebenen Druckergruppe hinzugef�TP
+\fB\-l\fR | \fB\-\-list\fR
+Gibt Informationen �en/die Drucker und die
+Druckergruppen, denen er angeh� aus.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In Kombination mit der obigen Option \fB\-\-groups\fR werden
+Drucker aus der angegebenen Druckergruppe entfernt.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In Kombination mit der obigen Option \fB\-\-add\fR verhindert
+dies, dass pkprinters existierende Drucker ver�ert.
+.IP
+Drucker1 bis DruckerN kann Platzhalter enthalten, wenn die Option \fB\-\-add\fR
+nicht gesetzt ist.
+.PP
+Beispiele:
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Dies richtet drei Drucker mit Namen hp2100, hp2200 und hp8000 ein.
+Die Seitenkosten f�se Drucker ist auf 0.05 Einheiten festgelegt und
+ihr Preis pro Auftrag auf 0.01 Einheiten. Einheiten k�n Ihrer W�ung
+entsprechen oder was immer Sie unter ihnen verstehen wollen.
+Die Beschreibung aller Drucker ist auf die Zeichenkette "HP Printer"
+gesetzt. Wenn irgendeiner dieser Drucker schon existiert, wird er
+modifiziert, ausser die Option \fB\-s\fR | \fB\-\-skipexisting\fR ist auch gesetzt.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+Dies l�t alle Drucker und dazugeh�en Kontingentinformationen
+vollst�ig, ebenso die Liste der Druckauftr�. VORSICHT!
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+Dies f�le Drucker, deren Namen zu "hp*" passen, den Druckergruppen
+Laser und HP, die schon VORHANDEN SEIN M�SEN, hinzu.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+Dies entfernt den Drucker hp2200 aus der Druckergruppe LexMark.<
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/pykotme.1
===================================================================
--- pykota/tags/1.22/man/de/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/de/pykotme.1 (revision 2237)
@@ -0,0 +1,61 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gibt den Benutzern ihre Druckkontingente an.
+.PP
+Kommandozeilen\-Gebrauch:
+.TP
+pykotme
+[Optionen]  [Dateien]
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Versionsnummer von pyktome aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Nachricht aus und endet.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Zeigt ein Kontingent ausschliesslich f�sen Drucker an.
+p kann Platzhalter enthalten um nur einige Drucker
+auszuw�en. Standardwert ist *, d.h. alle Drucker.
+Sie k�n verschiedene Namen oder Platzhalter,
+durch Kommas getrennt, angeben.
+.PP
+Beispiele:
+.IP
+\f(CW$ pykotme --printer apple Datei1.ps Datei2.ps\fR
+.IP
+Dies gibt ein Druckkontingent f� aktuellen Benutzer an. Das Kontingent
+wird mit dem Preis und der Gr�eines Auftrags auf Basis von Datei1.ps
+und Datei2.ps angegeben, wenn sie an den Drucker apple gesendet w�
+.IP
+\f(CW$ pykotme --printer apple,hplaser <Datei1.ps\fR
+.IP
+Dies gibt ein Druckkontingent f� aktuellen Benutzer an. Das Kontingent
+wird mit dem Preis und der Gr�eines Auftrags auf Basis von Datei1.ps,
+angegeben, so wie sie vom Standard Input her gelesen wird, wenn sie an
+den Drucker apple oder hplaser gesendet w�.IP
+\f(CW$ pykotme\fR
+.IP
+Dies gibt ein Kontingent f�en Auftrag an, der aus dem besteht, was
+via Standard Input ankommt. Das Kontingent zeigt die Gr�des Auftrags
+und den Preis, den der Auftrag auf jedem Drucker kosten w�.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/pykosd.1
===================================================================
--- pykota/tags/1.22/man/de/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/de/pykosd.1 (revision 2237)
@@ -0,0 +1,64 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Ein OSD Kontingent\-Anzeiger f�ota.
+.PP
+Kommandozeilen\-Gebrauch:
+.IP
+pykosd [Optionen]
+.PP
+Optionen:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Versionsnummer von pykosd aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Meldung aus und endet.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Stellt die Farbe f� Anzeige in Form eines
+hexadezimalen Triplets ein; zum Beipiel: #FF0000 ist 100% rot.
+Standard ist 100% gr�0FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Stellt die Dauer der Anzeige in Sekunden ein.
+Standard ist 3 Sekunden.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Stellt die Schriftart f� Anzeige ein.
+Standard ist der Standard der Python OSD Bibliothek.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Stellt ein, wie oft die Information angezeigt wird.
+Standard ist 0, das hei� immer.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Stellt die Schlafdauer zwischen zwei Anzeigen in
+Sekunden ein.
+Standard ist 180 Sekunden (3 Minuten).
+.PP
+Beispiele:
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Startet pykosd. Die Anzeige wird alle 60 Sekunden erneuert und dauert
+jedes Mal 3 Sekunden (der Standardwert). Nach f�rchl�en endet
+das Programm.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/de/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/de/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/pkhint.1
===================================================================
--- pykota/tags/1.22/man/de/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/de/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Ein Werkzeug, das Hinweise auf die beste Z�methode f�en Drucker gibt.
+.PP
+Kommandozeilen\-Gebrauch:
+.IP
+pkhint [Optionen] [Drucker1 Drucker2 Drucker3 ... DruckerN] <file.conf
+.PP
+Optionen:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Versionsnummer von pkhint aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Meldung aus und endet.
+.PP
+Beispiele:
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Analysiert Ihr Drucksystem um festzustellen, welcher Z�er
+der geeignetste ist f�en der angegebenen Drucker, dessen
+Name zu einem der Parameter passt.
+.IP
+Wenn Sie keinen Parameter auf der Kommandozeile �ben,
+werden alle Drucker analysiert.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/pkmail.1
===================================================================
--- pykota/tags/1.22/man/de/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/de/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/repykota.1
===================================================================
--- pykota/tags/1.22/man/de/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/de/repykota.1 (revision 2237)
@@ -0,0 +1,72 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Erzeugt Berichte zu den Druckkontingenten.
+.PP
+Kommandozeilen\-Gebrauch:
+.IP
+repykota [Optionen]
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Versionsnummer von repykota aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Meldung aus und endet.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Erzeugt einen Bericht �ie Kontigente der Benutzer.
+Dies ist der Standard.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Erzeugt einen Bericht �ie Kontingente der Gruppe
+anstelle der Benutzer.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Druckkontingent nur f�sen Drucker ausgeben.
+p kann Platzhalter enthalten um nur einige Drucker
+auszuw�en. Der Standardwert ist *, d.h. alle
+Drucker.
+Sie k�n verschiedene Namen oder Platzhalter angeben,
+die Sie mit Kommas abtrennen.
+.PP
+Beispiele:
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+Dies gibt den Stand der Kontingente aller Benutzer aus, die den
+Drucker lp benutzen.
+.IP
+\f(CW$ repykota\fR
+.IP
+Dies gibt den Stand der Kontingente f�e Benutzer auf allen Druckern aus.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+Dies gibt den Stand der Kontingente f� Benutzer jerome und f�e
+Benutzer aus, deren Namen mit "jo" beginnt, auf allen Druckern, deren Namen
+mit "laser" beginnt oder mit "pson" endet.
+.IP
+Wenn das Programm von einem Benutzer aufgerufen wird, der kein
+PyKota\-Administrator ist, so werden die zus�lichen Optionen f�utzer
+oder Gruppen ignoriert und nur die Daten des aktuellen Benutzers/Gruppe
+ausgegeben.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/de/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/de/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/de/warnpykota.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sendet Post an die Benutzer bez� Druckkontingente.
+.PP
+Befehlszeilen\-Gebrauch:
+.TP
+warnpykota
+[Optionen]  [Namen]
+.PP
+Optionen:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Gibt die Version von warnpykota aus und endet.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Gibt diese Meldung aus und endet.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warnt die Benutzer bez� ihres Druckkontingents.
+Das ist der Standard.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warnt die Benutzer, deren Gruppen �em Limit sind.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verfiziert die Kontingente allein f�sen Drucker.
+p kann Platzhalter enthalten um nur einige Drucker
+auszuw�en. Standardwert ist *, d.h. alle Drucker.
+Sie k�n verschiedene Namen und Platzhalter angeben,
+die Sie mit Kommas abtrennen m�
+.PP
+Beispiele:
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+Dies warnt alle Benutzer des Druckers lp, die ihr Druckkontingent
+�hritten haben.
+.IP
+\f(CW$ warnpykota\fR
+.IP
+Dies warnt alle Benutzer, die Ihr Druckkontingent auf irgendeinem
+Drucker �hritten haben.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+Dies warnt alle Benutzer der Gruppen, deren Namen mit "dev" beginnen und
+die ihr Druckkontingent auf irgendeinem Drucker, dessen Name mit
+"laserjet" beginnt.
+.IP
+Wenn das Programm von einem Benutzer aufgerufen wird, der nicht ein
+Pykota\-Administrator ist, werden die Optionen f�utzer\- und
+Gruppennamen ignoriert und nur der aktuelle Benutzer/Gruppe angezeigt.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Melden Sie bitte Fehler an: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/autopykota.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Et verkt�r �utomatisere oppretting av brukere og oppstarten av kvotesystemet.
+.PP
+DETTE VERKT�ET KAN IKKE BRUKES HVIS DU �SKER �KONTROLLERER DINE BRUKERES MULIGHETER MED PAGE QUOTA!
+.PP
+kommandolinje bruk :
+.IP
+DETTE VERKT�ET M�IKKE BRUKES FRA KOMMANDOLINJA, MEN KUN SOM EN DEL
+AV EN EKSTERN policy I pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+opsjoner :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Viser autopykota's versjon nummer.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Viser denne meldingen.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Setter brukerens startkonto til verdien b.
+Hvis brukeren allerede finnes, vil kontoen ikke endres.
+Hvis den ikke har noen verdi,vil standard verdi 0 brukes.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/edpykota.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/pkprinters.1 (revision 2237)
@@ -0,0 +1,103 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+En skriverbehandler for PyKota.
+.PP
+kommandolinje bruk :
+.IP
+pkprinters [opsjoner] skriver1 skriver2 skriver3 ... skriverN
+.PP
+opsjoner :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Viser pkprinters's versjon nummer.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Viser denne meldingen.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Legger til skrivere hvis de ikke allerede finnes p�yKota systemet.Hvis de allerede finnes, s�il de bli endret
+med mindre \fB\-s\fR|\-\-skipexisting brukes samtidig.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Sletter skrivere fra kvotesystemet.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Legger til en beskrivelse av skriverene.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Setter prisen for side og utskrift til charge.
+Pris p�tskrift er frivillig.
+Hvis begge brukes, s�eparer dem med et komma.
+Desimaltall og negative verdider er tillat.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Legger til eller fjerner skiver(e) til skrivergruppene
+pg1, pg2, etc... som allerede m�innes.
+En skrivergruppe er akkurat som en vanlig skriver,
+bortsett fra at de vanligvis er ukjente for skriversystemet.
+Opprett skrivergrupper p�amme m� som du legger til
+skrivere, s�egger du til skrivere
+til dem med denne opsjonen.
+Bokf� utf�p�kriveren og p�lle skrivergrupper
+skriveren tilh� kontroll av kvoter utf�p�kriveren og p�lle skrivergrupper den                       tilh�
+Hvis \fB\-\-remove\fR opsjonen ikke brukes, s�r standard
+handling �egge den oppgitte skriveren til oppgitt
+skrivergruppe.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+Viser informasjon om skriveren(e) og skrivergruppene
+den er medlem av.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+I kombinasjon med opsjonen \fB\-\-groups\fR ovenfor,
+s�il skriverene bli slettet fra de oppgitte skrivergruppene.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+I kombinasjon med opsjonen \fB\-\-add\fR ovenfor, s�il
+pkprinters ikke endre allerede eksisterende skrivere.
+.IP
+skriver1 tilogmed skriverN kan inneholde jokertegn hvis opsjonen \fB\-\-add\fR
+ikke brukes.
+.PP
+eksempler :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Dette vil opprette tre skrivere med navn hp2100, hp2200 og hp8000.
+Prisen per side vilo bli satt lik 0.05 enheter, og prisen per
+utskrifts vil bli satt lik 0.1 enhet. Enheter kan v� kroner og �eller noe helt annet hvis du �r det.
+Alle deres beskrivelser settes lik med strengen "HP Printer".
+Hvis noen av disse allerede finnes s�il de bli endret,
+med mindre du ogs�ar brukt \fB\-s\fR|\-\-skipexisting kommandolinje opsjonen.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+Dette vil fullsetendig slette alle skrivere og tilh�e kvote informasjon,
+dessuten ogs�eres utskriftshistorie. BRUKES MED FORSIKTIGHET!
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+Dette vil legge til alle skrivere med navn som passer med "hp*" inn i skrivergruppene
+Laser og HP, som p�orh� M�finnes.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+Dette vil fjerne skriveren med navn hp2200 printer fra skrivergruppen LexMark.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/pykotme.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/pykotme.1 (revision 2237)
@@ -0,0 +1,62 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Setter utskriftskvoter p�ine brukere.
+.PP
+kommandolinje bruk :
+.TP
+pykotme
+[opsjoner]  [filer]
+.PP
+opsjoner :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Viser pykotme's versjons nummer.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Viser denne meldingen.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Setter kvoter p�un denne skriveren. Opsjonen p kan
+bruker jokertegn for �elge kun noen skrivere.
+Standard verdi er *, som betyr
+alle skrivere.
+Du kan oppgi flere skrivernavn eller jokertegn ved �kille dem med komma.
+.PP
+eksempler :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+Dette vil sette en utskriftskvote for brukeren. Utskriftskvoten vil
+vise prisen og st�sen p�n utskrift som best�av filene file1.ps og file2.ps
+som skal skrives ut p�kriver apple.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+Dette vil sette en utskriftskvote for brukeren. Utskriftskvoten vil
+vise prisen og st�sen p�n utskrift som best�av filen file1.ps
+som skal skrives ut p�kriver apple eller hplaser.
+.IP
+\f(CW$ pykotme\fR
+.IP
+Dette vil sette en utskriftskvote for utskrift som ligger p�tandard inout. Utskriftskvoten vil vise st�sen og prisen p�tskriften p�ver skriver.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/pykosd.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/pykosd.1 (revision 2237)
@@ -0,0 +1,62 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+En OSD kvote overv�r for PyKota.
+.PP
+kommandolinje bruk :
+.IP
+pykosd [opsjoner]
+.PP
+opsjoner :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Viser pykosd versjons nummer.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Viser denne meldingen.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Setter fargen som skal brukes p�kjermen i hexadesimal
+formatet, f.eks er #FF0000 100% r�Standard er 100% gr�#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Setter visningsvarigheten til et antall sekunder.
+Standard er 3 sekunder.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Setter skrifttypen som skal brukes p�jermen.
+Bruker bibliotekete til Python OSD som standard.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Setter antall ganger informasjonen vil bli vist.
+Standard er 0, som betyr at den g�i en evig l�
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Setter dvaleperioden i sekunder mellom to visninger
+Standard er 180 sekunder (3 minutter).
+.PP
+eksempler :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Vil starte pykosd med oppdatert visning hvert 60 sekund,
+som varer i 3 sekunder (standard) hver gang. Etter 5 visninger
+s�topper det.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/pkhint.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Et verkt�r �est avgj�va slags bokf�ssystem som best egner seg for hver skriver.
+.PP
+kommandolinje bruk :
+.IP
+pkhint [opsjoner] [skriver1 skriver2 skriver3 ... skriverN] <file.conf
+.PP
+opsjoner :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Viser pkhint's versjon nummer.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Viser denne meldingen.
+.PP
+eksempler :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Ditt utskriftssysetm vil bli analysert for �vgj�va som er beste bokf�smetode
+for de oppgitte skriverene som passer med
+de skrivernavn som er oppgitt som parametere.
+.IP
+Hvis du ikke oppgir noen opsjoner p�ommandolinja, s�il alle
+skriverene bli analysert.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/pkmail.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/repykota.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/nb_NO/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/nb_NO/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/nb_NO/warnpykota.1 (revision 2237)
@@ -0,0 +1,74 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sender e\-post til brukere som har oversetget sin utskriftskvote.
+.PP
+kommandolinje bruk :
+.TP
+warnpykota
+[opsjoner]  [navn]
+.PP
+opsjoner :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Viser warnpykota versjon nummer.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Viser denne meldingen.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Advarer brukere som har oversteget sin utskriftskvote,
+dette er standard.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Advarer brukere som er medlem av en gruppe som har overseteget sin gruppeutskriftskvote.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verifiser kvoter p�un denne skriveren.Faktisk s�an p
+ogs�� jokertegn for �un velge noen bestemte
+skrivere. Standard er *, som betyr
+alle skrivere.
+Du kan bruke flere skrivernavn eller jokertegn
+ved �eparere dem med komma.
+.PP
+eksempler :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+Dette vil advare alle brukere p�kriveren lp som har oversteget sin
+utskriftskvote.
+.IP
+\f(CW$ warnpykota\fR
+.IP
+Dette vil advare alle brukere som har oversteget sin
+utskriftskvote.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+Dette vil advare alle brukere i grupper som begynner p�dev" om at
+de har oversteget sin kvote p�kriver med navn som begynner med
+"laserjet"
+.IP
+Hvis en bruker som ikke er en PyKota administrator bruker programet,
+sp vil opsjoner som representerer brukere eller grupper bli sett bort fra,
+kun vedkommendes bruker/gruppe blir rapportert.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/autopykota.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/edpykota.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/pykotme.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/pykosd.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/pkhint.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/pkmail.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/repykota.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/zh_TW/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/zh_TW/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/zh_TW/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pkhint.1
===================================================================
--- pykota/tags/1.22/man/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pkhint \- manual page for pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/README
===================================================================
--- pykota/tags/1.22/man/README (revision 2146)
+++ pykota/tags/1.22/man/README (revision 2146)
@@ -0,0 +1,25 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+For each PyKota command line tool, this directory contains a
+manual page that you can install on our system.
+
+====================================================================
Index: pykota/tags/1.22/man/repykota.1
===================================================================
--- pykota/tags/1.22/man/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+repykota \- manual page for repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+warnpykota \- manual page for warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pkbanner \- manual page for pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/autopykota.1
===================================================================
--- pykota/tags/1.22/man/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+autopykota \- manual page for autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pkpgcounter.1
===================================================================
--- pykota/tags/1.22/man/pkpgcounter.1 (revision 2146)
+++ pykota/tags/1.22/man/pkpgcounter.1 (revision 2146)
@@ -0,0 +1,49 @@
+.TH PKPGCOUNTER "1" "July 2004" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pkpgcounter \- PyKota script to count pages in PostScript, PDF, PCL5, PCL6 and ESC/P2 documents
+.SH SYNOPSIS
+.B pkpgcounter
+.RI file1
+.RI file2
+.RI ...
+.SH DESCRIPTION
+This manual page documents briefly the
+.B pkpgcounter
+command.
+.PP
+\fBpkpgcounter\fP is a convenience script provided by pykota that attempts
+to count the number of pages in a DSC compliant PostScript, PDF, PCL5, 
+PCL6 (aka PCLXL) or ESC/P2 document. Binary PostScript is also supported but through 
+GhostScript, which is launched if needed. This may be of use as an external accounter as defined in 
+/etc/pykota/pykota.conf, since currently \fBpkpgcounter\fP is the smarter 
+software accounter included with PyKota.
+
+\fBpkpgcounter\fP with no argument reads the job's data from stdin, and prints
+the number of pages on stdout. 
+
+\fBpkpgcounter\fP accepts any number of filenames as its arguments, and also the
+special argument '-' in place of stdin. With multiple arguments it prints
+the total number of pages of all the documents.
+
+For further information, see the HTML documentation that came with the pykota
+package, found in /usr/share/doc/pykota/html/.
+
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+.PP
+Please e-mail bugs to: Jerome Alet - alet@librelogiciel.com
+
+.SH AUTHOR
+This manual page was written by Jerome Alet.
Index: pykota/tags/1.22/man/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pkprinters \- manual page for pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/autopykota.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/edpykota.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/pykotme.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/pykosd.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/pkhint.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/pkmail.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/repykota.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pt_BR/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/pt_BR/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/pt_BR/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/autopykota.1
===================================================================
--- pykota/tags/1.22/man/fr/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/autopykota.1 (revision 2237)
@@ -0,0 +1,45 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un outil pour automatiser la cr�ion des comptes et l'initialisation
+du solde.
+.PP
+CET OUTIL NE DOIT PAS �RE UTILIS�SI VOUS LIMITEZ VOS UTILISATEURS PAR
+QUOTA !
+.PP
+ligne de commande :
+.IP
+CET OUTIL NE DOIT PAS �RE UTILIS�DEPUIS LA LIGNE DE COMMANDE MAIS
+SEULEMENT DANS UNE external policy DANS pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR valeur }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version d'autopykota et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Positionne le solde initial de l'utilisateur �.
+Si l'utilisateur existe d�, le solde actuel reste
+inchang�Si non indiqu�la valeur par d�ut est 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/edpykota.1
===================================================================
--- pykota/tags/1.22/man/fr/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un �teur de quotas pour PyKota.
+.PP
+ligne de commande :
+.IP
+edpykota [options] utilisateur1 utilisateur2 ... utilisateurN
+.IP
+edpykota [options] groupe1 groupe2 ... groupeN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version d'edpykota et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Ajoute des utilisateurs et/ou des imprimantes
+s'ils n'existent pas d� dans la base de donn�.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Efface des utilisateurs ou des groupes depuis
+la base de donn�.                       Les imprimantes ne sont jamais effac�.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Positionne le co�r page et par travail
+sur l'imprimante. Le prix par travail est optionel.
+Si les deux sont positionn� il faut les s�rer
+par une virgule. Les nombres r�s sont autoris�
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Positionne le facteur de surtaxe qui sera appliqu�
+l'utilisateur lors du calcul du co�un travail
+d'impression. Les valeurs r�les positives ou
+n�tives sont autoris�, ce qui permet de faire
+des choses tr�cr�ives comme donner de l'argent
+�n utilisateur chaque fois qu'il imprime.
+Le nombre de pages d'un travail d'impression n'est
+pas modifi�ar ce coefficient, seulement le co�
+travail pour un utilisateur particulier.
+Seuls les utilisateurs ont un tel coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...] Place les utilisateurs dans chacun des groupes
+list� separ�par des virgules. Les groupes
+doivent d� exister dans la base de donn�.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Modifie les quotas utilisateur, c'est la valeur
+par d�ut.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Modifie les quotas sur l'imprimante p seulement.
+En fait p peut contenir des caract�s jokers
+pour s�ctionner seulement certaines imprimantes.
+La valeur par d�ut est *, qui signifie toutes les
+imprimantes.
+Vous pouvez sp�fier plusieurs noms ou jokers,
+en les s�rant avec des virgules.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Ajoute l'imprimante aux groupes d'imprimantes
+pg1, pg2, etc... qui doivent d� exister.
+Un groupe d'imprimantes est comme une imprimante
+normale, sauf que celle\-ci est inconnue du syst�
+d'impression. On cr�des groupes d'imprimantes de la
+m� mani� que des imprimantes normale, et ensuite
+on y ajoute d'autres imprimantes avec cette option.
+Le d�mpte est fait sur une imprimante et sur tous
+les groupes d'imprimantes auxquels elle appartient,
+la v�fication de quota est faite sur une imprimante
+et sur tous les groupes d'imprimantes auxquels elle
+appartient.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Modifie les quotas de groupes plut�ue ceux des
+utilisateurs.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Prend l'utilisateur u ou le groupe g comme mod�
+pour positionner le quota d'impression.
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Ne d�nit aucun quota, mais laisse le d�mpte actif.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Remet �� le compteur de pages courant pour
+l'utilisateur ou le groupe sur les imprimantes
+sp�fi�.
+Le compteur de pages '�rnel' est inchang�.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Remet �� les compteurs de pages courant et
+\&'�rnel' pour l'utilisateur ou le groupe sur les
+imprimantes sp�fi�. Ceci est un raccourci
+pour '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+D�nit le facteur de limitation pour l'utilisateur
+ou le groupe : soit par le solde du compte (balance),
+soit par le quota par pages.
+La valeur par d�ut est 'quota'. Les valeurs
+autoris� sont 'quota' 'balance' 'quota\-then\-balance'
+\&'balance\-then\-quota'.
+ATTENTION : quota\-then\-balance et balance\-then\-quota
+ne sont pas encore impl�nt�.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Fixe le solde de l'utiliateur �a valeur b.
+Le solde peut aussi �e incr�nt�u d��nt�i b est pr�d�'un signe + ou \-.
+ATTENTION : si on d��nte le solde, le total
+r��ar l'utilisateur est d��nt�ussi.
+Les groupes n'ont pas de solde, leur solde est la
+somme des soldes des utilisateurs membres.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Fixe la limite souple �l pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Fixe la limite dure �l pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Positionne les compteurs de pages de l'utilisateur �a valeur usage; utile pour migrer des utilisateurs
+depuis un logiciel diff�nt dans lequel ils ont d�
+imprim�uelques pages. Les compteurs de pages actuels
+et globaux peuvent �e incr�nt�ou d��nt�si
+usage est pr�x�'un signe + ou \-.
+ATTENTION : LES DEUX compteurs de pages sont modifi�dans tous les cas, donc soyez prudents.
+NB : si 'usage' vaut '0', alors l'action effectu�est identique �elle effectu�avec \fB\-\-hardreset\fR.
+.IP
+les noms d'utilisateurs ou de groupes peuvent contenir des caract�s
+joker si l'option \fB\-\-add\fR n'est pas utilis�
+.PP
+exemples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+Ceci va ajouter les utilisateurs john, paul, george and ringo �a base
+de donn�, et fixer leur quota par pages �a m� valeur que
+l'utilisateur jerome. L'utilisateur jerome doit exister.
+L'adresse email de ringo sera fix��ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+Ceci va fixer une limite souple de 50 pages et une limite dure de 60 pages
+pour l'utilisteur jerome sur l'imprimante lp.
+Si l'utilisateur jerome ou l'imprimante lp n'existent pas dans la base de
+donn�alors aucune modification n'est effectu�
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Comme ci\-dessus, mais l'utilisateur jerome et l'imprimante lp sont ajout�automatiquement s'ils n'existaient pas. L'utilisateur jerome est aussi
+ajout�aux groupes "coders" et "it" quoi doivent d� exister dans
+la base de donn�.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+Ceci va fixer une limite souple de 500 pages et une limite dure de 550
+pages pour les groupes financial et support sur toutes les imprimantes.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+Ceci va remettre �� le compteur de pages courant de jerome sur toutes
+les imprimantes, ainsi que pour chaque utilisateur dont le nom commence
+par 'jo'.
+Leurs compteurs '�rnels' ne seront pas modifi�
+Vous pouvez �lement remettre �� les compteurs '�rnels' gr� �'option \fB\-\-hardreset\fR | \fB\-R\fR de la ligne de commande.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+Ceci indique �yKota de ne pas limiter jerome lorsqu'il va imprimer
+sur l'imprimante hpcolor. Tous ses travaux seront autoris�sur cette
+imprimantes, mais la comptabilit�e ses impressions sera quand m�
+tenue. Les quotas des autres utilisateurs sont inchang�
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+Ceci indique �yKota de limiter jerome par le solde de son compte
+lorsqu'il imprime.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+Ceci va incr�nter le solde de jerome de 10.0 unit�(dans votre
+propre monnaie). Vous pouvez d��nter ce solde en utilisant le signe
+n�tif, et positionner la valeur en n'utilisant aucun signe.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+Ceci va compl�ment effacer les utilisateurs jerome et rachel de la base
+de donn�. Tous leurs quotas et leurs historiques seront aussi effac�
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+Ceci va fixer le co�r page �.1 unit�ur l'imprimante lp. Le co�un travail ne sera pas modifi�.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+Ceci va ajouter les imprimantes hplj1 et hplj2 dans les groupes
+d'imprimantes Laser et HP.
+En imprimant sur hplj1 ou hplj2, les quotas seront �lement v�fi�et comptabilis�sur les imprimantes virtuelles Laser et HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 pauvreetudiant\fR
+.IP
+Ceci va surtaxer l'utilisateur pauvreetudiant par un facteur de 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+L'utilisateur jerome va gagner de l'argent �haque fois qu'il imprimera.
+.IP
+\f(CW$ edpykota --overcharge 0 patron\fR
+.IP
+L'utilisateur patron peut imprimer �olont�cela ne lui co� rien
+car le co� chaque travail d'impression sera multipli�ar z� avant
+de d�ter son compte.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/fr/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/fr/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/pkprinters.1 (revision 2237)
@@ -0,0 +1,109 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un gestionnaire d'imprimantes pour PyKota.
+.PP
+ligne de commande :
+.IP
+pkprinters [options] impr1 impr2 impr3 ... imprN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de pkprinters et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Ajoute les imprimantes si elles n'existent pas d�
+dans la base de donn�. Si elles existent, alors
+elles sont modifi� sauf si l'option de ligne de
+commande \fB\-s\fR|\-\-skipexisting est aussi utilis�
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Supprime les imprimantes de la base de donn�.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Ajoute une description textuelle aux imprimantes.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Fixes les co�ar page et par travail.
+Le co�r travail d'impression est optionnel.
+Si les deux sont utilis� s�rez les nombres par
+une virgule.
+Les nombres n�tifs ou avec d�males sont autoris�
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Ajoute ou supprime les imprimantes des groupes
+pg1, pg2, etc... qui doivent d� exister.
+Un groupe d'imprimantes est comme une imprimante
+normale mais est inconnu du syst� d'impression.
+On cr�les groupes d'imprimantes de la m� mani�
+que l'on cr�des imprimantes, et ensuite on leur
+ajoute des imprimantes avec cette option.
+Le d�mpte et la v�fication sont effectu�sur
+une imprimante et sur tous les groupes auxquels elle
+appartient.
+Si l'option \fB\-\-remove\fR ci\-dessous n'est pas utilis�
+l'action par d�ut est d'ajouter les imprimantes aux
+groupes d'imprimantes sp�fi�
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+Liste les informations sur les imprimantes et les
+groupes dont elles sont membres.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+Combin�avec l'option \fB\-\-groups\fR ci\-dessus, supprime
+les imprimantes des groupes sp�fi�
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+Combin�avec l'option \fB\-\-add\fR ci\-dessus, indique
+�kprinters de ne pas modifier les imprimantes
+existantes.
+.IP
+Les noms d'imprimantes peuvent contenir des caract�s jokers si l'option
+\fB\-\-add\fR n'est pas utilis�
+.PP
+exemples :
+.IP
+\f(CW$ pkprinters --add -D "Imprimante HP" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Ceci va cr� les trois imprimantes hp2100, hp2200 and hp8000.
+Leur co�r page sera fix� 0.05 unit�et leur co�r travail sera
+fix� 0.1 unit�Les unit�sont dans votre propre monnaie,
+ou dans ce que vous voulez qu'elles signifient.
+Leurs descriptions seront positionn� �Imprimante HP".
+Si l'une de ces imprimantes existe d�, elle sera modifi��oins que
+l'option \fB\-s\fR|\-\-skipexisting ne soit aussi utilis�
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+Ceci va compl�ment effacer toutes les imprimantes, leurs informations
+de quota ainsi que leurs historiques des travaux. SOYEZ PRUDENTS !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+Ceci ba mettre toutes les imprimantes dont le nom correspond �hp*"
+dans les groupes Laser et HP, qui DOIVENT d� exister.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+Ceci va enlever l'imprimante hp2200 du groupe LexMark.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/pykotme.1
===================================================================
--- pykota/tags/1.22/man/fr/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/pykotme.1 (revision 2237)
@@ -0,0 +1,65 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Fait des devis d'impression aux utilisateurs.
+.PP
+ligne de commande :
+.TP
+pykotme
+[options]  [fichiers]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de pykotme et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Fait un devis sur cette imprimante seulement.
+En fait p peut contenir des caract�s jokers
+pour s�ctionner seulement certaines imprimantes.
+La valeur par d�ut est *, qui signifie toutes les
+imprimantes.
+Vous pouvez sp�fier plusieurs noms ou jokers,
+en les s�rant avec des virgules.
+.PP
+exemples :
+.IP
+\f(CW$ pykotme --printer apple fichier1.ps fichier2.ps\fR
+.IP
+Ceci va �blir un devis d'impression pour l'utilisateur courant.
+Ce devis indiquera la taille et le co�r l'imprimante apple d'un
+travail d'impression consitant en fichier1.ps et fichier2.ps
+.IP
+\f(CW$ pykotme --printer apple,hplaser <fichier1.ps\fR
+.IP
+Ceci va �blir un devis d'impression pour l'utilisateur courant.
+Ce devis indiquera la taille et le co�un travail provenant de l'entr�standard dans laquelle on redirigerait le fichier fichier1.ps et qui
+serait envoy�sur les imprimantes apple ou hplaser.
+.IP
+\f(CW$ pykotme\fR
+.IP
+Ceci va �blir un devis d'impression pour l'utilisateur courant.
+Ce devis indiquera la taille et le co�un travail provenant de l'entr�standard, et ce pour chaque imprimante.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/pykosd.1
===================================================================
--- pykota/tags/1.22/man/fr/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/pykosd.1 (revision 2237)
@@ -0,0 +1,67 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un afficheur OSD de quota d'impression pour PyKota.
+.PP
+ligne de commande :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de pykosd et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Fixe la couleur �tiliser pour l'affichage �n
+triplet hexadecimal, par exemple #FF0000 est 100%
+de rouge.
+La valeur par d�ut est 100% de vert (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Fixe la dur�de l'affichage en secondes.
+La valeur par d�ut est de 3 secondes.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Fixe la police de caract�s �tiliser pour
+l'affichage.
+La valeur par d�ut est celle de la librairie
+Python OSD.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Fixe le nombre de fois o�nformation sera affich�
+La valeur par d�ut est 0, qui indique un nombre
+d'affichages infini.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Fixe la dur�en secondes de sommeil entre deux
+affichages. La valeur par d�ut est 180 (3 minutes).
+.PP
+exemples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Lance pykosd. L'affichage sera rafra�it toutes les 60 secondes,
+et persistera pendant 3 secondes (la valeur par d�ut) �haque fois.
+Apr�5 it�tions, le programme se terminera.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/fr/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/dumpykota.1 (revision 2237)
@@ -0,0 +1,127 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Exporte le contenu de la base de donn� de PyKota.
+.PP
+ligne de commande :
+.IP
+dumpykota [options] [exprfiltre]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de dumpykota et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Exporte les donn� de type 'type'.
+Les types autoris�sont :
+.IP
+\- history : exporte l'historique des travaux.
+\- users : exporte les utilisateurs.
+\- groups : exporte les groupes d'utilisateurs.
+\- printers : exporte les imprimantes.
+\- upquotas : exporte les quotas des utilisateurs.
+\- gpquotas : exporte les quotas des groupes.
+\- payments : exporte l'historique des paiements.
+\- pmembers : exporte les membres des groupes
+.IP
+d'imprimantes.
+.IP
+\- umembers : exporte les membres des groupes
+.IP
+d'utilisateurs.
+.IP
+NB : l'option de ligne de commande \fB\-d\fR | \fB\-\-data\fR est
+OBLIGATOIRE.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Exporte les donn� dans le format 'fmt' sp�fi�Si non pr�s�le format sera csv (champs s�r�par des virgules).
+Toutes les donn� sont export� entre double quotes.
+Les formats autoris�sont :
+.IP
+\- csv : donn� s�r� par des virgules
+\- ssv : donn� s�r� par des point\-virgules
+\- tsv : donn� s�r�par des tabulations
+\- xml : donn� export� au format XML
+\- cups : donn� export� au format page_log
+.IP
+de CUPS : DISPONIBLE SEULEMENT
+.IP
+AVEC \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR nomf
+Toutes les donn� seront export� vers un fichier
+plut�ue vers la sortie standard. Le nom sp�al '\-'
+est la valeur par d�ut indiquant la sortie standard.
+ATTENTION : les fichiers existants sont tronqu�!
+.IP
+Utilisez les expressions de filtrage pour extraire seulement certaines
+parties des donn�. Les filtres autoris�sont de la forme :
+.IP
+cl�aleur
+.IP
+Les cl�autoris� pour l'instant sont :
+.TP
+username
+Nom de l'utilisateur
+.TP
+groupname
+Nom du groupe d'utilisateurs
+.TP
+printername
+Nom de l'imprimante
+.TP
+pgroupname
+Nom du groupe d'imprimantes
+.TP
+hostname
+Nom d'h�de la machine cliente
+.TP
+billingcode
+Code de facturation du travail d'impression
+.IP
+Contrairement aux autres outils d'administration de PyKota, les caract�s
+jokers ne sont pas expans� aussi vous ne pouvez pas les utiliser.
+.IP
+NB : toutes les cl�ne sont pas autoris� pour chaque type de donn�,
+aussi le r�ltat peut �e vide si vous utilisez une cl�ndisponible
+pour un type de donn� particulier.
+.PP
+Exemples :
+.IP
+\f(CW$ dumpykota --data history --format csv >monfichier.csv\fR
+.IP
+Ceci va exporter l'historique dans un fichier �hamps s�r�par des
+virgules, par exemple pour r�portation dans un tableur.
+.IP
+\f(CW$ dumpykota --data users --format xml -o util.xml\fR
+.IP
+Exporte toutes les donn� des utilisateurs dans le fichier util.xml
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Exporte l'historique des travaux de l'utilisateur jerome sur l'imprimante
+HP2100 seulement.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/pkhint.1
===================================================================
--- pykota/tags/1.22/man/fr/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/pkhint.1 (revision 2237)
@@ -0,0 +1,47 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un outil pour d�cter la meilleure m�ode de d�mpte pour chaque
+imprimante.
+.PP
+ligne de commande :
+.IP
+pkhint [options] [impr1 impr2 impr3 ... imprN] <fichier.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de pkhint et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.PP
+exemples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Va analyser votre syst� d'impression pour d�cter quelle est la
+meilleure m�ode de d�mpte pour chacune des imprimantes d�nies
+dont le nom correspond aux param�es.
+.IP
+Si vous ne passer aucune argument sur la ligne de commande, toutes les
+imprimantes seront analys�.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/pkmail.1
===================================================================
--- pykota/tags/1.22/man/fr/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/pkmail.1 (revision 2237)
@@ -0,0 +1,65 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Passerelle courrier �ctronique pour PyKota.
+.PP
+ligne de commande :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de pkmail et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.IP
+Cette commande est faite pour �e utilis�depuis la base de donn�
+d'alias de votre serveur de courrier �ctronique, en tant que pipe.
+Elle va accepter les commandes qui lui sont envoy� dans des messages
+et renverra sa r�nse �'exp�teur de la demande.
+.IP
+Pour utiliser cette commande, cr� un alias email dans /etc/aliases
+avec le format suivant :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Puis lancez la commande 'newaliases' pour r�n�r la base de donn�
+d'alias.
+.IP
+Vous pouvez maintenant envoyer vos demandes par email �'adresse
+\&'pykotacmd@yourdomain.com', avec la commande dans le champ sujet.
+.IP
+Liste des commandes support� :
+.IP
+report [utilisateur]
+.IP
+NB : Pour que pkmail fonctionne correctement, il se peut que vous ayez �ettre l'utilisateur 'mail' dans le groupe syst� 'pykota' afin d'assurer
+que cet utilisateur puisse lire le fichier /etc/pykota/pykotadmin.conf,
+et de relancer votre serveur de courrier �ctronique (par exemple
+/etc/init.d/exim restart). Cependant, il est fortement conseill�ue vous
+r��issiez plut�eux fois qu'une avant de faire ceci.
+.IP
+Utilisez �os risques et p�ls !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/repykota.1
===================================================================
--- pykota/tags/1.22/man/fr/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/repykota.1 (revision 2237)
@@ -0,0 +1,74 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+G�re des rapports de quotas d'impression.
+.PP
+ligne de commande :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de repykota et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+G�re un rapport sur les quotas des utilisateurs,
+c'est la valeur par d�ut.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+G�re un rapport sur les quotas de groupes plut�ue sur ceux des utilisateurs.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Renvoie les quotas pour cette imprimante seulement.
+En fait p peut contenir des caract�s jokers pour
+s�ctionner certaines imprimantes seulement.
+La valeur par d�ut est *, qui signifie de v�fier
+les quotas sur toutes les imprimantes.
+Vous pouvez pr�ser plusieurs noms ou jokers,
+en les s�rant avec des virgules.
+.PP
+exemples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+Ceci va afficher un rapport de quotas pour tous les utilisateurs de
+l'imprimante lp.
+.IP
+\f(CW$ repykota\fR
+.IP
+Ceci va afficher un rapport pour tous les utilisateurs sur toutes les
+imprimantes.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+Ceci va afficher un rapport pour l'utilisateur jerome et tous les
+utilisateurs dont le nom commence par "jo" sur toutes les imprimantes
+dont le nom commence par "laser" ou se termine par "pson".
+.IP
+Si cette commande est lanc�par un utilisateur qui n'est pas un
+administrateur PyKota, les arguments additionnels repr�ntant des noms
+d'utilisateurs ou de groupes sont ignor� et un rapport traitant seulement
+de l'utilisateur ou du groupe courant est g�r�.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/fr/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/fr/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/fr/warnpykota.1 (revision 2237)
@@ -0,0 +1,77 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Pr�ent les utilisateurs ayant atteint leurs limites.
+.PP
+ligne de commande :
+.TP
+warnpykota
+[options]  [noms]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Affiche la version de warnpykota et quitte.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Affiche ce message et quitte.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Pr�ent les utilisateur ayant atteint leurs limites,
+c'est la valeur par d�ult.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Pr�ent les utilisateurs dont les groupes auxquels
+ils appartiennent ont atteint leurs limites.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verifie les quotas sur cette imprimante seulement.
+En fait p peut contenir des caract�s jokers pour
+s�ctionner certaines imprimantes seulement.
+La valeur par d�ut est *, qui signifie de v�fier
+les quotas sur toutes les imprimantes.
+Vous pouvez pr�ser plusieurs noms ou jokers,
+en les s�rant avec des virgules.
+.PP
+exemples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+Ceci va pr�nir tous les utilisateurs ayant atteint leur limite sur
+l'imprimante lp.
+.IP
+\f(CW$ warnpykota\fR
+.IP
+Ceci va pr�nir tous les utilisateurs ayant atteint leurs limites quelle
+que soit l'imprimanter.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+Ceci va pr�nir tous les membres des groupes dont les noms commencent
+par "dev" et qui ont atteints leurs limites sur toutes les imprimantes
+dont le nom commence par "laserjet".
+.IP
+Si cette commande est lanc�par un utilisateur qui n'est pas un
+administrateur PyKota, les arguments additionnels repr�ntant des noms
+d'utilisateurs ou de groupes sont ignor� et seulement l'utilisateur ou
+le groupe courant est pr�nu.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Merci d'envoyer les rapports de bugs �Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/autopykota.1
===================================================================
--- pykota/tags/1.22/man/es/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/es/autopykota.1 (revision 2237)
@@ -0,0 +1,49 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Herramienta que automatiza la creaci�e cuentas de usuario y el
+establecimiento inicial del saldo.
+.PP
+�NO DEBE USAR ESTA HERRAMIENTA SI QUIERE HACER USO DEL L�ITE POR CUOTA
+.IP
+DE P�INA!
+.PP
+uso desde la l�a de comandos:
+.IP
+NO HA DE UTILIZAR ESTA HERRAMIENTA DESDE LA L�EA DE COMANDOS, �ICAMENTE
+COMO PARTE DE UNA �pol�ca externa� EN EL ARCHIVO pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR valor }
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e atopykota y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Establece el saldo inicial para la cuenta del
+usuario al valor �b�. Si el usuario ya existe,
+se deja el saldo actual sin modificar. Si no se
+ha establecido, el valor por defecto es 0
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/edpykota.1
===================================================================
--- pykota/tags/1.22/man/es/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/es/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAedpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/es/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/es/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/es/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/es/pkprinters.1 (revision 2237)
@@ -0,0 +1,111 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un administrador de impresoras para PyKota.
+.PP
+uso desde la l�a de comandos:
+.IP
+pkprinters [opciones] impresora1 impresora2 impresora3 ... impresoraN
+.PP
+opciones
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e pkprinters y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+A� las impresoras si estas no existen en el
+servidor de almacenamiento de las cuotas. Si
+existen, se modifican a menos que se utilice
+\fB\-s\fR|\-\-skipexisting.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Borra las impresoras de la base de datos de
+almacenamiento de las cuotas.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d A� una descripci�extual a la impresora.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Establece el precio por p�na y por trabajo que
+se ha de cobrar. El precio por trabajo es opcional.
+Si se van a establecer ambos, sep�los con una coma.
+Se permiten valores en coma flotante y negativos.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] A� o elimina la(s) impresora(s) del grupo
+de impresoras �pg1�, �pg2�, etc. que han de existir.
+Un grupo de impresi�s similar a una impresora normal,
+con la salvedad de que, normalmente, es desconocido
+por el sistema de impresi�Cree los grupos de
+impresi�e la misma forma que crea las impresoras,
+luego a� otra impresora al grupo con esta opci�La contabilidad se realiza en la impresora y en todos
+los grupos de impresi� los que esta pertenece; la
+comprobaci�e la cuota se realiza en la impresora y
+en todos los grupos de impresi� los que pertenece.
+Si no se utiliza la opci�fB\-\-remove\fR listada abajo, la
+acci�or defecto es a�r las impresoras al grupo de
+impresoras especificado.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+Lista informaci�obre la(s) impresora(s) y sobre los
+grupos de impresi� los que pertenece.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+En combinaci�on la opci�fB\-\-groups\fR citada arriba,
+elimina las impresoras de los grupos de impresi�specificados.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+En combinaci�on la opci�fB\-\-add\fR citada arriba,
+le dice a pkprinters que no modifique las impresoras
+existentes.
+.IP
+desde impresora1 hasta impresoraN pueden contener comodines, si la opci�fB\-\-add\fR no se ha utilizado.
+.PP
+ejemplos:
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Crear�res impresoras, denominadas hp2100, hp2200 y hp8000.
+Sus precios por p�na se establecer�a 0.05 unidades, y sus
+precios por trabajo se establecer�a 0.1 unidades. Las unidades
+est�en su propia moneda, o cualquier cosa que quiera que
+signifique.
+Todas sus descripciones se establecer�a la cadena �HP Printer�.
+Si alguna de estas impresoras ya existe, ser�odificada, a menos
+que la opci�fB\-s\fR|\-\-skipexisting se haya empleado.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+Esto borrar�ompletamente todas las impresoras y sus cuotas
+asociadas, as�omo su historial de trabajos. �UTIL�ELA CON
+CUIDADO!
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+Esto a�r�odas las impresoras cuyos nombres coincidan con
+�hp*� al grupo de impresoras �Laser� y �HP�, que DEBEN existir.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+Esto eliminar�a impresora �hp2200� del grupo de impresoras �LexMark�.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/pykotme.1
===================================================================
--- pykota/tags/1.22/man/es/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/es/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Muestra las cuotas de impresi� los usuarios.
+.PP
+uso desde la l�a de comandos:
+.TP
+pykotme
+[opciones]  [archivos]
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�ykotme y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Muestra la cuota para esta impresora �mente.
+Actualmente �p� puede utilizar caracteres comod�para seleccionar s�algunas impresoras. El valor
+por defecto es *, que significa toas las impresoras.
+Puede especificar varios nombres o comodines,
+separ�olos por comas.
+.PP
+ejemplos
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+Esto mostrar�na cuota de impresi�ara el usuario actual. La cuota
+mostrar�l precio y el tama�el trabajo consistente en �file1.ps�
+y �file2.ps� que se enviar�a la impresora �apple�.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+Esto mostrar�na cuota de impresi�ara el usuario actual. La cuota
+mostrar�l precio y el tama�el trabajo consistente en �file1.ps�
+le� desde la entrada est�ar, que ser�nviado a la impresora
+�apple� o �hplaser�.
+.IP
+\f(CW$ pykotme\fR
+.IP
+Esto mostrar�na cuota para el trabajo consistente en los datos de
+la entrada est�ar. La cuota listar�l tama�el trabajo y el
+coste de impresi�el trabajo en cada impresora.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/pykosd.1
===================================================================
--- pykota/tags/1.22/man/es/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/es/pykosd.1 (revision 2237)
@@ -0,0 +1,67 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Un monitor de cuotas OSD para PyKota.
+.PP
+uso desde la l�a de comandos:
+.IP
+pykosd [opciones]
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e pykosd y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Establece el color que se utilizar�n el
+visualizador como un triplete hexadecimal, por
+ejemplo #FF0000 es un rojo 100%.
+El valor por defecto es 100% verde (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Establece la duraci�el visualizador en segundos.
+Por defecto son 3 segundos.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Establece el tipo de letra que se utilizar�n
+el visualizador.
+Por defecto se utilizar�a opci�or defecto
+de la librer�Python OSD.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Establece el n� de veces que la informaci�e mostrar�El valor por defecto es 0, que significa un
+bucle sin fin.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Establece el tiempo de espera entre dos mensajes
+en segundos. El valor por defecto son 180 segundos
+(3 minutos).
+.PP
+ejemplos:
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Ejecutar�ykosd. El visualizador se actualizar�ada 60 segundos,
+y se mostrar� segundos (valor por defecto) cada vez. Despu�de
+cinco iteraciones, el programa finalizar�.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/es/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/es/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/pkhint.1
===================================================================
--- pykota/tags/1.22/man/es/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/es/pkhint.1 (revision 2237)
@@ -0,0 +1,47 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+Herramienta que aconseja sobre qu��do de contabilidad es el mejor
+para cada impresora.
+.PP
+uso desde la l�a de comandos:
+.IP
+pkhint [opciones] [impresora1 impresora2 impresora3 ... impresoraN] <archivo.conf
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e pkhint y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.PP
+ejemplos:
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Analizar�u sistema de impresi�ara comprobar que sistema
+de contabilizaci�s el mejor para cada una de las impresoras
+definidas y cuyo nombre coincida con uno de los par�tros.
+.IP
+Si no pasa ning�r�tro en la l�a de comandos, se analizar�todas las impresoras.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/pkmail.1
===================================================================
--- pykota/tags/1.22/man/es/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/es/pkmail.1 (revision 2237)
@@ -0,0 +1,67 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Puerta de enlace de correo electr�o para PyKota.
+.PP
+uso desde la l�a de comandos:
+.TP
+pkmail
+[opciones]
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e pkmail's y sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y sale.
+.IP
+Utilice este comando en su archivo de alias de su servidor de correo,
+como una pipa. Una vez hecho esto, aceptar�os comandos que se le env�
+a trav�de mensajes en correos electr�os, y devolver�na respuesta
+al que dio origen al comando.
+.IP
+Para utilizar este comando, cree un alias de correo en /etc/aliases con
+el siguiente formato:
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Luego ejecute la orden 'newaliases' para regenerar la base de datos
+de alias
+.IP
+A partir de ese momento, puede enviar comandos por correo electr�o
+a 'pykotacmd@tudominio.com', con la orden en el asunto.
+.IP
+Lista de las �nes soportadas
+.IP
+report [nombredeusuario]
+.IP
+NB: Para que pkmail trabaje correctamente, ha de a�r al
+usuario de sistema 'mail' al grupo de sistema 'pykota', para
+asegurarse de que este usuario puede leer el archivo
+/etc/pykota/pykotadmin.conf, y reiniciar su servidor de correo
+(ej. /etc/init.d/exim restart). De todas formas se advierte
+encarecidamente que piense en esto, al menos dos veces, antes
+de llevarlo a cabo.
+.IP
+�Util�lo bajo su reponsabilidad!
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/repykota.1
===================================================================
--- pykota/tags/1.22/man/es/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/es/repykota.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Genera informes sobre las cuotas de impresi�.PP
+uso desde la l�a de comandos:
+.IP
+repykota [opciones]
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e repykota y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Genera un informe sobre las cuotas de los
+usuarios, este es el comportamiento por defecto.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Genera un informe sobre las cuotas de los grupos
+en lugar de los usuarios.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Informa de las cuotas en esta impresora �mente
+Actualmente �p� puede utilizar caracteres comod�para seleccionar s�algunas impresoras. El valor
+por defecto es *, que significa todas las impresoras.
+Puede especificar varios nombres o comodines,
+separ�olos por comas.
+.PP
+ejemplos:
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+Esto imprimir�l estado de la cuota para todos los usuarios que utilizan
+la impresora �lp�.
+.IP
+\f(CW$ repykota\fR
+.IP
+Esto imprimir�l estado de la cuota para todos los usuarios en todas
+las impresoras.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+Esto imprimir�l estado de la cuota para el usuario jerome y
+todos los usuarios cuyos nombres comiencen por �jo� en todas
+las impresoras cuyos nombres comiencen por �laser� o terminen   con �pson�.
+.IP
+Si se ejecuta por un usuario que no es un administrador de PyKota,
+los par�tros adicionales que representen nombres de usuarios o grupos
+son ignorados, inform�ose �mente del usuario/grupo actual.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/es/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/es/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/es/warnpykota.1 (revision 2237)
@@ -0,0 +1,75 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Env�correos electr�os a los usuarios que han sobrepasado su cuota
+.PP
+uso desde la l�a de comandos:
+.TP
+warnpykota
+[opciones]  [nombres]
+.PP
+opciones:
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Muestra el n� de versi�e warnpykota y
+luego sale.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Muestra este mensaje y luego sale.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Advierte a los usuarios que han sobrepasado sus
+cuotas de impresi�este es el valor por defecto.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Advierte a los usuarios cuyas cuotas de grupo se
+hayan sobrepasado.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verifica las cuotas en esta impresora �mente.
+Actualmente �p� puede utilizar caracteres comod�para seleccionar solamente algunas impresoras.
+El valor por defecto es *, que significa todas
+las impresoras.
+Puede especificar varios nombres o comodines,
+separ�olos por comas.
+.PP
+ejemplos:
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+Esto avisar� todos los usuarios de la impresora �lp� que hayan
+sobrepasado sus cuotas de impresi�.IP
+\f(CW$ warnpykota\fR
+.IP
+Esto avisar� todos los usuarios que hayan sobrepasado su cuota
+de impresi�n cualquier impresora.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+Esto avisar� todos los grupos de usuarios cuyos nombres comiencen con
+�dev� y que hayan sobrepasado sus cuotas de impresi�n cualquier
+impresora cuyo nombre comience con �laserjet�
+.IP
+Si se ejecuta por un usuario que no es un administrador de PyKota,
+los par�tros adicionales que representen nombres de usuarios o grupos
+son ignorados, inform�ose �mente al usuario/grupo actual.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Por favor, env�los errores por correo electr�o a: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pykosd.1
===================================================================
--- pykota/tags/1.22/man/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pykosd \- manual page for pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/Makefile.am
===================================================================
--- pykota/tags/1.22/man/Makefile.am (revision 2146)
+++ pykota/tags/1.22/man/Makefile.am (revision 2146)
@@ -0,0 +1,15 @@
+pykotamandir = $(mandir)/man1
+pykotaman_DATA = 		\
+	edpykota.1			\
+	papwaitprinter.sh.1	\
+	pkhint.1			\
+	pkprinters.1		\
+	pykotme.1			\
+	repykota.1			\
+	waitprinter.sh.1	\
+	pkpgcounter.1	\
+	pykosd.1	\
+	warnpykota.1
+
+EXTRA_DIST =	\
+	$(pykotaman_DATA)
Index: pykota/tags/1.22/man/th/autopykota.1
===================================================================
--- pykota/tags/1.22/man/th/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/th/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/edpykota.1
===================================================================
--- pykota/tags/1.22/man/th/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/th/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/th/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/th/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/th/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/th/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/pykotme.1
===================================================================
--- pykota/tags/1.22/man/th/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/th/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/pykosd.1
===================================================================
--- pykota/tags/1.22/man/th/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/th/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/th/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/th/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/pkhint.1
===================================================================
--- pykota/tags/1.22/man/th/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/th/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/pkmail.1
===================================================================
--- pykota/tags/1.22/man/th/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/th/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/repykota.1
===================================================================
--- pykota/tags/1.22/man/th/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/th/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/th/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/th/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/th/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/pkmail.1
===================================================================
--- pykota/tags/1.22/man/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+pkmail \- manual page for pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/autopykota.1
===================================================================
--- pykota/tags/1.22/man/it/autopykota.1 (revision 2237)
+++ pykota/tags/1.22/man/it/autopykota.1 (revision 2237)
@@ -0,0 +1,44 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH AUTOPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+autopykota \- page de manuel de autopykota 1.22_unofficial
+.SH DESCRIPTION
+autopykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to automate user account creation and initial balance setting.
+.PP
+THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !
+.PP
+command line usage :
+.IP
+THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART
+OF AN external policy IN pykota.conf
+.IP
+autopykota { \fB\-i\fR | \fB\-\-initbalance\fR value }
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints autopykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-i\fR | \fB\-\-initbalance\fR b Sets the user's account initial balance value to b.
+If the user already exists, actual balance is left
+unmodified. If unset, the default value is 0.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/edpykota.1
===================================================================
--- pykota/tags/1.22/man/it/edpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/it/edpykota.1 (revision 2237)
@@ -0,0 +1,231 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH EDPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+edpykota \- page de manuel de edpykota 1.22_unofficial
+.SH DESCRIPTION
+edpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Print Quota editor for PyKota.
+.PP
+command line usage :
+.IP
+edpykota [options] user1 user2 ... userN
+.IP
+edpykota [options] group1 group2 ... groupN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints edpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds users and/or printers if they don't
+exist on the Quota Storage Server.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes users/groups from the quota storage.
+Printers are never deleted.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge
+for a particular printer. Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point values are allowed.
+.TP
+\fB\-o\fR | \fB\-\-overcharge\fR f
+Sets the overcharging factor applied to the user
+when computing the cost of a print job. Positive or
+negative floating point values are allowed,
+this allows you to do some really creative
+things like giving money to an user whenever
+he prints. The number of pages in a print job
+is not modified by this coefficient, only the
+cost of the job for a particular user.
+Only users have a coefficient.
+.TP
+\fB\-i\fR | \fB\-\-ingroups\fR g1[,g2...]
+Puts the users into each of the groups
+listed, separated by commas. The groups
+must already exist in the Quota Storage.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Edit users print quotas, this is the default.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Edit quotas on printer p only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.TP
+\fB\-G\fR | \fB\-\-pgroups\fR pg1[,pg2...] Adds the printer(s) to the printer groups
+pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Edit users groups print quotas instead of users.
+.TP
+\fB\-p\fR | \fB\-\-prototype\fR u|g Uses user u or group g as a prototype to set
+print quotas
+.TP
+\fB\-n\fR | \fB\-\-noquota\fR
+Doesn't set a quota but only does accounting.
+.TP
+\fB\-r\fR | \fB\-\-reset\fR
+Resets the actual page counter for the user
+or group to zero on the specified printers.
+The life time page counter is kept unchanged.
+.TP
+\fB\-R\fR | \fB\-\-hardreset\fR
+Resets the actual and life time page counters
+for the user or group to zero on the specified
+printers. This is a shortcut for '\-\-used 0'.
+.TP
+\fB\-l\fR | \fB\-\-limitby\fR l
+Choose if the user/group is limited in printing
+by its account balance or by its page quota.
+The default value is 'quota'. Allowed values
+are 'quota' 'balance' 'quota\-then\-balance' and
+\&'balance\-then\-quota'.
+WARNING : quota\-then\-balance and balance\-then\-quota
+are not yet implemented.
+.TP
+\fB\-b\fR | \fB\-\-balance\fR b
+Sets the user's account balance to b.
+Account balance may be increase or decreased
+if b is prefixed with + or \-.
+WARNING : when decreasing account balance,
+the total paid so far by the user is decreased
+too.
+Groups don't have a real balance, but the
+sum of their users' account balance.
+.TP
+\fB\-S\fR | \fB\-\-softlimit\fR sl
+Sets the quota soft limit to sl pages.
+.TP
+\fB\-H\fR | \fB\-\-hardlimit\fR hl
+Sets the quota hard limit to hl pages.
+.TP
+\fB\-U\fR | \fB\-\-used\fR usage
+Sets the pagecounters for the user to usage pages;
+useful for migrating users from a different system
+where they have already used some pages. Actual
+and Life Time page counters may be increased or decreased
+if usage is prefixed with + or \-.
+WARNING : BOTH page counters are modified in all cases,
+so be careful.
+NB : if 'usage' equals '0', then the action taken is
+the same as if \fB\-\-hardreset\fR was used.
+.IP
+user1 through userN and group1 through groupN can use wildcards
+if the \fB\-\-add\fR option is not set.
+.PP
+examples :
+.IP
+\f(CW$ edpykota --add -p jerome john paul george ringo/ringo@example.com\fR
+.IP
+This will add users john, paul, george and ringo to the quota
+database, and set their print quotas to the same values than user
+jerome. User jerome must already exist.
+User ringo's email address will also be set to 'ringo@example.com'
+.IP
+\f(CW$ edpykota --printer lp -S 50 -H 60 jerome\fR
+.IP
+This will set jerome's print quota on the lp printer to a soft limit
+of 50 pages, and a hard limit of 60 pages. If either user jerome or
+printer lp doesn't exist on the Quota Storage Server then nothing is done.
+.IP
+\f(CW$ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\fR
+.IP
+Same as above, but if either user jerome or printer lp doesn't exist
+on the Quota Storage Server they are automatically added. Also
+user jerome is put into the groups "coders" and "it" which must
+already exist in the Quota Storage.
+.IP
+\f(CW$ edpykota -g -S 500 -H 550 financial support\fR
+.IP
+This will set print quota soft limit to 500 pages and hard limit
+to 550 pages for groups financial and support on all printers.
+.IP
+\f(CW$ edpykota --reset jerome "jo*"\fR
+.IP
+This will reset jerome's page counter to zero on all printers, as
+well as every user whose name begins with 'jo'.
+Their life time page counter on each printer will be kept unchanged.
+You can also reset the life time page counters by using the
+\fB\-\-hardreset\fR | \fB\-R\fR command line option.
+.IP
+\f(CW$ edpykota --printer hpcolor --noquota jerome\fR
+.IP
+This will tell PyKota to not limit jerome when printing on the
+hpcolor printer. All his jobs will be allowed on this printer, but
+accounting of the pages he prints will still be kept.
+Print Quotas for jerome on other printers are unchanged.
+.IP
+\f(CW$ edpykota --limitby balance jerome\fR
+.IP
+This will tell PyKota to limit jerome by his account's balance
+when printing.
+.IP
+\f(CW$ edpykota --balance +10.0 jerome\fR
+.IP
+This will increase jerome's account balance by 10.0 (in your
+own currency). You can decrease the account balance with a
+dash prefix, and set it to a fixed amount with no prefix.
+.IP
+\f(CW$ edpykota --delete jerome rachel\fR
+.IP
+This will completely delete jerome and rachel from the Quota Storage
+database. All their quotas and jobs will be deleted too.
+.IP
+\f(CW$ edpykota --printer lp --charge 0.1\fR
+.IP
+This will set the page price for printer lp to 0.1. Job price
+will not be changed.
+.IP
+\f(CW$ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\fR
+.IP
+This will put printers hplj1 and hplj2 in printers groups Laser and HP.
+When printing either on hplj1 or hplj2, print quota will also be
+checked and accounted for on virtual printers Laser and HP.
+.IP
+\f(CW$ edpykota --overcharge 2.5 poorstudent\fR
+.IP
+This will overcharge the poorstudent user by a factor of 2.5.
+.IP
+\f(CW$ edpykota --overcharge -1 jerome\fR
+.IP
+User jerome will actually earn money whenever he prints.
+.IP
+\f(CW$ edpykota --overcharge 0 boss\fR
+.IP
+User boss can print at will, it won't cost him anything because the
+cost of each print job will be multiplied by zero before charging
+his account.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/pkbanner.1
===================================================================
--- pykota/tags/1.22/man/it/pkbanner.1 (revision 2237)
+++ pykota/tags/1.22/man/it/pkbanner.1 (revision 2237)
@@ -0,0 +1,73 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKBANNER "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkbanner \- page de manuel de pkbanner 1.22_unofficial
+.SH DESCRIPTION
+pkbanner v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates banners.
+.PP
+command line usage :
+.TP
+pkbanner
+[options]  [more info]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkbanner's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-l\fR | \fB\-\-logo\fR img
+Use the image as the banner's logo. The logo will
+be drawn at the center top of the page. The default
+logo is /usr/share/pykota/logos/pykota.jpeg
+.TP
+\fB\-p\fR | \fB\-\-pagesize\fR sz
+Sets sz as the page size. Most well known
+page sizes are recognized, like 'A4' or 'Letter'
+to name a few. The default size is A4.
+.TP
+\fB\-s\fR | \fB\-\-savetoner\fR s
+Sets the text luminosity factor to s%. This can be
+used to save toner. The default value is 0, which
+means that no toner saving will be done.
+.TP
+\fB\-u\fR | \fB\-\-url\fR u
+Uses u as an url to be written at the bottom of
+the banner page. The default url is :
+http://www.librelogiciel.com/software/
+.PP
+examples :
+.IP
+Using pkbanner directly from the command line is not recommended,
+excepted for testing purposes. You should use pkbanner in the
+\&'startingbanner' or 'endingbanner' directives in pykota.conf
+.IP
+startingbanner: /usr/bin/pkbanner \fB\-\-logo=\fR"" \fB\-\-savetoner\fR=\fI75\fR
+.IP
+With such a setting in pykota.conf, all print jobs will be
+prefixed with an A4 banner with no logo, and text luminosity will
+be increased by 75%. The PostScript output will be directly sent
+to your printer.
+.IP
+You'll find more examples in the sample configuration file included
+in PyKota.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/pkprinters.1
===================================================================
--- pykota/tags/1.22/man/it/pkprinters.1 (revision 2237)
+++ pykota/tags/1.22/man/it/pkprinters.1 (revision 2237)
@@ -0,0 +1,107 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKPRINTERS "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkprinters \- page de manuel de pkprinters 1.22_unofficial
+.SH DESCRIPTION
+pkprinters v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A Printers Manager for PyKota.
+.PP
+command line usage :
+.IP
+pkprinters [options] printer1 printer2 printer3 ... printerN
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkprinters's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-a\fR | \fB\-\-add\fR
+Adds printers if they don't exist on the Quota
+Storage Server. If they exist, they are modified
+unless \fB\-s\fR|\-\-skipexisting is also used.
+.TP
+\fB\-d\fR | \fB\-\-delete\fR
+Deletes printers from the quota storage.
+.HP
+\fB\-D\fR | \fB\-\-description\fR d Adds a textual description to printers.
+.TP
+\fB\-c\fR | \fB\-\-charge\fR p[,j]
+Sets the price per page and per job to charge.
+Job price is optional.
+If both are to be set, separate them with a comma.
+Floating point and negative values are allowed.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR pg1[,pg2...] Adds or Remove the printer(s) to the printer
+groups pg1, pg2, etc... which must already exist.
+A printer group is just like a normal printer,
+only that it is usually unknown from the printing
+system. Create printer groups exactly the same
+way that you create printers, then add other
+printers to them with this option.
+Accounting is done on a printer and on all
+the printer groups it belongs to, quota checking
+is done on a printer and on all the printer groups
+it belongs to.
+If the \fB\-\-remove\fR option below is not used, the
+default action is to add printers to the specified
+printer groups.
+.TP
+\fB\-l\fR | \fB\-\-list\fR
+List informations about the printer(s) and the
+printers groups it is a member of.
+.TP
+\fB\-r\fR | \fB\-\-remove\fR
+In combination with the \fB\-\-groups\fR option above,
+remove printers from the specified printers groups.
+.TP
+\fB\-s\fR | \fB\-\-skipexisting\fR
+In combination with the \fB\-\-add\fR option above, tells
+pkprinters to not modify existing printers.
+.IP
+printer1 through printerN can contain wildcards if the \fB\-\-add\fR option
+is not set.
+.PP
+examples :
+.IP
+\f(CW$ pkprinters --add -D "HP Printer" --charge 0.05,0.1 hp2100 hp2200 hp8000\fR
+.IP
+Will create three printers named hp2100, hp2200 and hp8000.
+Their price per page will be set at 0.05 unit, and their price
+per job will be set at 0.1 unit. Units are in your own currency,
+or whatever you want them to mean.
+All of their descriptions will be set to the string "HP Printer".
+If any of these printers already exists, it will also be modified
+unless the \fB\-s\fR|\-\-skipexisting command line option is also used.
+.IP
+\f(CW$ pkprinters --delete "*"\fR
+.IP
+This will completely delete all printers and associated quota information,
+as well as their job history. USE WITH CARE !
+.IP
+\f(CW$ pkprinters --groups Laser,HP "hp*"\fR
+.IP
+This will put all printers which name matches "hp*" into printers groups
+Laser and HP, which MUST already exist.
+.IP
+\f(CW$ pkprinters --groups LexMark --remove hp2200\fR
+.IP
+This will remove the hp2200 printer from the LexMark printer group.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/pykotme.1
===================================================================
--- pykota/tags/1.22/man/it/pykotme.1 (revision 2237)
+++ pykota/tags/1.22/man/it/pykotme.1 (revision 2237)
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOTME "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykotme \- page de manuel de pykotme 1.22_unofficial
+.SH DESCRIPTION
+pykotme v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Gives print quotes to users.
+.PP
+command line usage :
+.TP
+pykotme
+[options]  [files]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykotme's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Gives a quote for this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ pykotme --printer apple file1.ps file2.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps and file2.ps
+which would be sent to the apple printer.
+.IP
+\f(CW$ pykotme --printer apple,hplaser <file1.ps\fR
+.IP
+This will give a print quote to the current user. The quote will show
+the price and size of a job consisting in file1.ps as read from
+standard input, which would be sent to the apple or hplaser
+printer.
+.IP
+\f(CW$ pykotme\fR
+.IP
+This will give a quote for a job consisting of what is on standard
+input. The quote will list the job size, and the price the job
+would cost on each printer.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/pykosd.1
===================================================================
--- pykota/tags/1.22/man/it/pykosd.1 (revision 2237)
+++ pykota/tags/1.22/man/it/pykosd.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PYKOSD "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pykosd \- page de manuel de pykosd 1.22_unofficial
+.SH DESCRIPTION
+pykosd v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+An OSD quota monitor for PyKota.
+.PP
+command line usage :
+.IP
+pykosd [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pykosd's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-c\fR | \fB\-\-color\fR #rrggbb Sets the color to use for display as an hexadecimal
+triplet, for example #FF0000 is 100% red.
+Defaults to 100% green (#00FF00).
+.TP
+\fB\-d\fR | \fB\-\-duration\fR d
+Sets the duration of the display in seconds.
+Defaults to 3 seconds.
+.TP
+\fB\-f\fR | \fB\-\-font\fR f
+Sets the font to use for display.
+Defaults to the Python OSD library's default.
+.TP
+\fB\-l\fR | \fB\-\-loop\fR n
+Sets the number of times the info will be displayed.
+Defaults to 0, which means loop forever.
+.TP
+\fB\-s\fR | \fB\-\-sleep\fR s
+Sets the sleeping duration between two displays
+in seconds. Defaults to 180 seconds (3 minutes).
+.PP
+examples :
+.IP
+\f(CW$ pykosd -s 60 --loop 5\fR
+.IP
+Will launch pykosd. Display will be refreshed every 60 seconds,
+and will last for 3 seconds (the default) each time. After five
+iterations, the program will exit.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/it/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/it/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+dumpykota \- page de manuel de dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/pkhint.1
===================================================================
--- pykota/tags/1.22/man/it/pkhint.1 (revision 2237)
+++ pykota/tags/1.22/man/it/pkhint.1 (revision 2237)
@@ -0,0 +1,46 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKHINT "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkhint \- page de manuel de pkhint 1.22_unofficial
+.SH DESCRIPTION
+pkhint v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+A tool to give hints on what accounting method is best for each printer.
+.PP
+command line usage :
+.IP
+pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkhint's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.PP
+examples :
+.IP
+\f(CW$ pkhint "hp*" printer103 </etc/cups/printers.conf\fR
+.IP
+Will analyze your printing system to test which accounter
+is the best for each of the defined printer which
+name matches one of the parameters.
+.IP
+If you don't pass any argument on the command line, all
+printers will be analyzed.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/pkmail.1
===================================================================
--- pykota/tags/1.22/man/it/pkmail.1 (revision 2237)
+++ pykota/tags/1.22/man/it/pkmail.1 (revision 2237)
@@ -0,0 +1,63 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH PKMAIL "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+pkmail \- page de manuel de pkmail 1.22_unofficial
+.SH DESCRIPTION
+pkmail v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Email gateway for PyKota.
+.PP
+command line usage :
+.TP
+pkmail
+[options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints pkmail's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.IP
+This command is meant to be used from your mail server's aliases file,
+as a pipe. It will then accept commands send to it in email messages,
+and will send the answer to the command's originator.
+.IP
+To use this command, create an email alias in /etc/aliases with
+the following format :
+.IP
+pykotacmd: "|/usr/bin/pkmail"
+.IP
+Then run the 'newaliases' command to regenerate the aliases database.
+.IP
+You can now send commands by email to 'pykotacmd@yourdomain.com', with
+the command in the subject.
+.IP
+List of supported commands :
+.IP
+report [username]
+.IP
+NB : For pkmail to work correctly, you may have to put the 'mail'
+system user in the 'pykota' system group to ensure this user can
+read the /etc/pykota/pykotadmin.conf file, and restart your
+mail server (e.g. /etc/init.d/exim restart). It is strongly advised
+that you think at least twice before doing this though.
+.IP
+Use at your own risk !
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/repykota.1
===================================================================
--- pykota/tags/1.22/man/it/repykota.1 (revision 2237)
+++ pykota/tags/1.22/man/it/repykota.1 (revision 2237)
@@ -0,0 +1,71 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH REPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+repykota \- page de manuel de repykota 1.22_unofficial
+.SH DESCRIPTION
+repykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Generates print quota reports.
+.PP
+command line usage :
+.IP
+repykota [options]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints repykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Generates a report on users quota, this is
+the default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Generates a report on group quota instead of users.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Report quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ repykota --printer lp\fR
+.IP
+This will print the quota status for all users who use the lp printer.
+.IP
+\f(CW$ repykota\fR
+.IP
+This will print the quota status for all users on all printers.
+.IP
+\f(CW$ repykota --printer "laser*,*pson" jerome "jo*"\fR
+.IP
+This will print the quota status for user jerome and all users
+whose name begins with "jo" on all printers which name begins
+with "laser" or ends with "pson".
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/it/warnpykota.1
===================================================================
--- pykota/tags/1.22/man/it/warnpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/it/warnpykota.1 (revision 2237)
@@ -0,0 +1,76 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH WARNPYKOTA "1" "mai 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NOM
+warnpykota \- page de manuel de warnpykota 1.22_unofficial
+.SH DESCRIPTION
+warnpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Sends mail to users over print quota.
+.PP
+command line usage :
+.TP
+warnpykota
+[options]  [names]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints warnpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-u\fR | \fB\-\-users\fR
+Warns users over their print quota, this is the
+default.
+.TP
+\fB\-g\fR | \fB\-\-groups\fR
+Warns users whose groups quota are over limit.
+.TP
+\fB\-P\fR | \fB\-\-printer\fR p
+Verify quotas on this printer only. Actually p can
+use wildcards characters to select only
+some printers. The default value is *, meaning
+all printers.
+You can specify several names or wildcards,
+by separating them with commas.
+.PP
+examples :
+.IP
+\f(CW$ warnpykota --printer lp\fR
+.IP
+This will warn all users of the lp printer who have exceeded their
+print quota.
+.IP
+\f(CW$ warnpykota\fR
+.TP
+This will warn all users
+who have exceeded their print quota on
+.IP
+any printer.
+.IP
+\f(CW$ warnpykota --groups --printer "laserjet*" "dev*"\fR
+.IP
+This will warn all users of groups which names begins with "dev" and
+who have exceeded their print quota on any printer which name begins
+with "laserjet"
+.IP
+If launched by an user who is not a PyKota administrator, additionnal
+arguments representing users or groups names are ignored, and only the
+current user/group is reported.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/dumpykota.1
===================================================================
--- pykota/tags/1.22/man/dumpykota.1 (revision 2237)
+++ pykota/tags/1.22/man/dumpykota.1 (revision 2237)
@@ -0,0 +1,118 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
+.TH DUMPYKOTA "1" "May 2005" "C@LL - Conseil Internet & Logiciels Libres" "User Commands"
+.SH NAME
+dumpykota \- manual page for dumpykota 1.22_unofficial
+.SH DESCRIPTION
+dumpykota v1.22_unofficial (c) 2003, 2004, 2005 C@LL \- Conseil Internet & Logiciels Libres
+.PP
+Dumps PyKota database's content.
+.PP
+command line usage :
+.IP
+dumpykota [options] [filterexpr]
+.PP
+options :
+.TP
+\fB\-v\fR | \fB\-\-version\fR
+Prints dumpykota's version number then exits.
+.TP
+\fB\-h\fR | \fB\-\-help\fR
+Prints this message then exits.
+.TP
+\fB\-d\fR | \fB\-\-data\fR type
+Dumps 'type' datas. Allowed types are :
+.IP
+\- history : dumps the jobs history.
+\- users : dumps users.
+\- groups : dumps user groups.
+\- printers : dump printers.
+\- upquotas : dump user quotas.
+\- gpquotas : dump user groups quotas.
+\- payments : dumps user payments.
+\- pmembers : dumps printer groups members.
+\- umembers : dumps user groups members.
+.IP
+NB : the \fB\-d\fR | \fB\-\-data\fR command line option
+is MANDATORY.
+.TP
+\fB\-f\fR | \fB\-\-format\fR fmt
+Dumps datas in the 'fmt' format. When not specified,
+the format is to dump datas in the csv format (comma
+separated values). All data dumped is between double
+quotes. Allowed formats are :
+.IP
+\- csv : separate datas with commas
+\- ssv : separate datas with semicolons
+\- tsv : separate datas with tabs
+\- xml : dump data as XML
+\- cups : dump datas in CUPS' page_log format :
+.IP
+ONLY AVAILABLE WITH \fB\-\-data\fR history
+.TP
+\fB\-o\fR | \fB\-\-output\fR fname
+All datas will be dumped to the file instead of
+to the standard output. The special '\-' filename
+is the default value and means stdout.
+WARNING : existing files are truncated !
+.IP
+Use the filter expressions to extract only parts of the
+datas. Allowed filters are of the form :
+.IP
+key=value
+.IP
+Allowed keys for now are :
+.TP
+username
+User's name
+.TP
+groupname
+Users group's name
+.TP
+printername
+Printer's name
+.TP
+pgroupname
+Printers group's name
+.TP
+hostname
+Client's hostname
+.TP
+billingcode
+Job's billing code
+.IP
+Contrary to other PyKota management tools, wildcard characters are not
+expanded, so you can't use them.
+.IP
+NB : not all keys are allowed for each data type, so the result may be
+empty if you use a key not available for a particular data type.
+.PP
+Examples :
+.IP
+\f(CW$ dumpykota --data history --format csv >myfile.csv\fR
+.IP
+This dumps the history in a comma separated values file, for possible
+use in a spreadsheet.
+.IP
+\f(CW$ dumpykota --data users --format xml -o users.xml\fR
+.IP
+Dumps all users datas to the users.xml file.
+.IP
+\f(CW$ dumpykota --data history printername=HP2100 username=jerome\fR
+.IP
+Dumps the job history for user jerome on printer HP2100 only.
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+.PP
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111\-1307, USA.
+.PP
+Please e\-mail bugs to: Jerome Alet \- alet@librelogiciel.com
Index: pykota/tags/1.22/man/genman.sh
===================================================================
--- pykota/tags/1.22/man/genman.sh (revision 2146)
+++ pykota/tags/1.22/man/genman.sh (revision 2146)
@@ -0,0 +1,32 @@
+#! /bin/sh
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# You're welcome to redistribute this software under the
+# terms of the GNU General Public Licence version 2.0
+# or, at your option, any higher version.
+#
+# You can read the complete GNU GPL in the file COPYING
+# which should come along with this software, or visit
+# the Free Software Foundation's WEB site http://www.fsf.org
+#
+# $Id$
+#
+for prog in pkmail pkbanner autopykota dumpykota edpykota pykotme repykota warnpykota pkprinters pkhint pykosd ; do 
+    echo $prog ;
+    help2man --no-info --section=1 --manual "User Commands" --source="C@LL - Conseil Internet & Logiciels Libres" --output=$prog.1 $prog ; 
+    cd ../po ;
+    for dir in * ; do 
+        if [ -d $dir ] ; then
+            if [ -e $dir/pykota.po ] ; then
+                echo "  $dir" ;
+                cd ../man/$dir ;
+                help2man --no-info --locale=$dir --section=1 --manual "User Commands" --source="C@LL - Conseil Internet & Logiciels Libres" --output=$prog.1 $prog ; 
+                cd ../../po ;
+            fi ;    
+        fi ;     
+    done
+    cd ../man ;
+    echo ;
+done
Index: pykota/tags/1.22/MANIFEST.in
===================================================================
--- pykota/tags/1.22/MANIFEST.in (revision 2146)
+++ pykota/tags/1.22/MANIFEST.in (revision 2146)
@@ -0,0 +1,14 @@
+include README FAQ COPYING LICENSE TODO NEWS CREDITS SECURITY MANIFEST.in clean.sh checkdeps.py bin/pkmail bin/pkbanner bin/autopykota bin/dumpykota bin/lprngpykota bin/cupspykota bin/edpykota bin/warnpykota bin/repykota bin/pykotme bin/pykosd bin/pkprinters bin/pkhint bin/pkpgcounter bin/snmpprinterstatus bin/waitprinter.sh bin/papwaitprinter.sh bin/mailandpopup.sh bin/README
+recursive-include po README *.sh *.po *.mo *.pot
+recursive-include man README *.sh *.1
+recursive-include docs README *.sgml *.png *.pdf *.html *.sx?
+recursive-include cgi-bin README *.cgi
+recursive-include conf README *.sample
+recursive-include initscripts README README.* *.sql *.py *.schema *.ldif
+recursive-include debian README pykota.templates Makefile.docs pykota.config pykota.cron.daily printquota.default Makefile.docs changelog control copyright dirs docs examples links rules
+recursive-include untested README *.sh *.ps *.pjl
+recursive-include logos README *.png *.xcf *.jpeg
+recursive-include contributed README *.pl *.sh *.py
+recursive-include stylesheets README *.css
+recursive-include openoffice README *.png *.sx? *.pdf
+recursive-include tests README *.ps.gz *.sh
Index: pykota/tags/1.22/autogen.sh
===================================================================
--- pykota/tags/1.22/autogen.sh (revision 2146)
+++ pykota/tags/1.22/autogen.sh (revision 2146)
@@ -0,0 +1,138 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+
+ PROJECT=pykota
+
+ CONFIGURE=configure.in
+
+ TEST_TYPE=-f
+ 
+ DIE=0
+
+
+ for autoconf in autoconf autoconf-2.57 autoconf-2.56 autoconf-2.55 autoconf-2.54 autoconf-2.53 autoconf-2.52 ; do
+ 	if "$autoconf" --version < /dev/null > /dev/null 2>&1 ; then
+ 		version=`"$autoconf" --version | head -1 | awk '{print $NF}'`
+ 		acmajor=`echo "$version" | cut -f1 -d.`
+ 		acminor=`echo "$version" | cut -f2 -d.`
+ 		if test "$acmajor" -gt 3 ; then
+ 			break
+ 		fi
+ 		if test "$acmajor" -ge 2 ; then
+ 			if test "$acminor" -ge 50 ; then
+ 				break
+ 			fi
+ 		fi
+ 	fi
+ done
+ if ! "$autoconf" --version < /dev/null > /dev/null 2>&1 ; then
+
+ 	echo
+
+ 	echo "You must have autoconf 2.52 installed to compile $PROJECT."
+
+ 	echo "Install the appropriate package for your distribution,"
+
+ 	echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
+
+ 	DIE=1
+
+ fi
+ autoheader=`echo "$autoconf" | sed s,autoconf,autoheader,g`
+
+ have_automake=false
+
+ for automakev in 1.7 1.6 ; do
+
+ 	if automake-$automakev --version < /dev/null > /dev/null 2>&1 ; then
+
+ 		have_automake=true
+
+ 		break;
+ 	fi
+ done
+
+ if $have_automake ; then : ; else
+ 	echo
+
+ 	echo "You must have automake 1.6 installed to compile $PROJECT."
+ 	echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.6.tar.gz"
+
+ 	echo "(or a newer version if it is available)"
+ 	DIE=1
+ fi
+ 
+ if test "$DIE" -eq 1; then
+ 	exit 1
+ fi
+ 
+ if test -z "$AUTOGEN_SUBDIR_MODE"; then
+         if test -z "$*"; then
+                 echo "I am going to run ./configure with no arguments - if you wish "
+                 echo "to pass any to it, please specify them on the $0 command line."
+         fi
+ fi
+ 
+ case $CC in
+ *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
+ esac
+
+ if grep "^AM_[A-Z0-9_]\{1,\}_GETTEXT" "$CONFIGURE" >/dev/null; then
+  if grep "sed.*POTFILES" "$CONFIGURE" >/dev/null; then
+    GETTEXTIZE=""
+  else
+    if grep "^AM_GLIB_GNU_GETTEXT" "$CONFIGURE" >/dev/null; then
+      GETTEXTIZE="glib-gettextize"
+      GETTEXTIZE_URL="ftp://ftp.gtk.org/pub/gtk/v2.0/glib-2.0.0.tar.gz"
+    else
+      GETTEXTIZE="gettextize"
+      GETTEXTIZE_URL="ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz"
+    fi
+                                                                                                                                                                                   
+    $GETTEXTIZE --version < /dev/null > /dev/null 2>&1
+    if test $? -ne 0; then
+      echo
+      echo "**Error**: You must have \`$GETTEXTIZE' installed to compile $PKG_NAME."
+      echo "Get $GETTEXTIZE_URL"
+      echo "(or a newer version if it is available)"
+      DIE=1
+    fi
+  fi
+fi
+
+
+ touch config.h.in
+
+ echo "running autopoint --force --copy"
+ autopoint --force 
+
+ echo "running aclocal-$automakev $ACLOCAL_FLAGS"
+ aclocal-$automakev $ACLOCAL_FLAGS
+
+ echo "running $autoheader"
+ $autoheader
+
+ echo "running automake-$automakev -a -c $am_opt --foreign"
+ automake-$automakev -a -c $am_opt --foreign
+
+ echo "$autoconf"
+ $autoconf
+
+ cd $ORIGDIR
+ 
+ if test -z "$AUTOGEN_SUBDIR_MODE"; then
+    $srcdir/configure --enable-maintainer-mode "$@"
+
+ 	chmod -Rf u+w $srcdir
+
+    echo 
+    echo "Now type 'make' to compile $PROJECT."
+
+ fi
+
Index: pykota/tags/1.22/NEWS
===================================================================
--- pykota/tags/1.22/NEWS (revision 2237)
+++ pykota/tags/1.22/NEWS (revision 2237)
@@ -0,0 +1,1880 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+PyKota NEWS :
+       
+    - 1.22 : 
+    
+        - Big improvements to the documentation.
+        
+    - 1.22beta :
+    
+        - Improved stability in pykotme and pykotme.cgi.
+        
+        - Fixed a permission problem in pykotme and pykosd.
+        
+        - Fixed an inconsitency between SQL and LDAP backends'
+          behavior in edpykota.
+          
+        - Improved stability and allowed tracebacks in CGI scripts.
+        
+        - Improved pykotme.cgi
+          
+    - 1.22alpha8 :
+    
+        - Fixed history retrieval for nonexisting printers or users.
+        
+        - Clicking on the billing code in printquota.cgi's job history
+          now shows all jobs matching this billing code.
+          
+        - Fixed the dump in CUPS' page_log format which didn't
+          dump the oldest entry.
+          
+        - The data dumper now accepts billingcode= and hostname= as
+          filters when dumping the job history.
+          
+        - The job billing code if present is now saved into the database,
+          and exported to subprocesses as the PYKOTAJOBBILLING environment
+          variable.
+          
+        - Ctrl+C now makes PyKota commands exit without a traceback.
+        
+        - Fixed an i18n problem with Python 2.1
+        
+    - 1.22alpha7 :
+    
+        - Fixed some problems with the retrieval of the history from LDAP.
+        
+    - 1.22alpha6 :
+    
+        - Early errors now produce meaningful error messages (finally !)
+        
+    - 1.22alpha5 :
+       
+        - SNMP and PJL improvements with regard to PowerSave / StandBy.
+        
+    - 1.22alpha4 :
+    
+        - Fixed charset problem under MacOSX.
+        
+        - Allows pkbanner to accept more info to display on its 
+          command line.
+          
+    - 1.22alpha3 :
+    
+        - Fixes some case related problems with some LDAP backends.
+        
+        - Fixes some problem for printers which directly go from
+          "idle" to "warmup" and never to "printing" before
+          returning to "idle".
+          
+        - Some permissions settings may have prevented cupspykota
+          from parsing cupsd.conf, this is now fixed.
+          
+    - 1.22alpha2 :
+    
+        - Introduction of the web enabled print quote generator.
+        
+        - Fixed a potential race condition when several backend
+          wrappers were present in CUPS' backend directory.
+          
+        - Fixed dumpykota's output in CUPS' page_log format to better
+          match CUPS format.
+          
+    - 1.22alpha1 :
+    
+        - Import into Subversion.
+        
+    - 1.21 :
+    
+        - Improved documentation.
+        
+        - Improved dependencies checker.
+        
+        - Updated some translation files.
+        
+    - 1.21beta2 :
+    
+        - Fixed an LPRng specific bug.
+        
+        - Several improvements on stability issues with manually modified
+          LDAP trees.
+          
+        - Documentation improvements.  
+        
+    - 1.21beta :
+    
+        - Prepared translation files for next release.
+        
+    - 1.21alpha27 :
+    
+        - Allows software() (no arguments) to the software accounting
+          directive. This saves a lot of CPU since the job is not
+          parsed again : the precomputed size is used directly in this
+          case.
+          
+        - epykota's --prototype option now works fine with accounts
+          limited by balance.
+          
+    - 1.21alpha26 :
+    
+        - Fixed the handling of the 'maxdenybanners' directive.
+        
+        - Introduced the 'denyduplicates' directive.
+        
+        - Fixed some database related glitches.
+        
+    - 1.21alpha25 :
+    
+        - The job's size is now always precomputed, even when
+          'enforcement' is not set to 'strict'.
+          
+        - Introduction of the new 'trustjobsize' configuration directive
+          to workaround some problematic printers. See the sample
+          configuration file for details.
+          
+    - 1.21alpha24 :
+    
+        - Big database structure changes. An upgrade script
+          is now included for PostgreSQL. LDAP users may just
+          want to copy the new schema in place.
+          
+        - edpykota now recognizes the -o | --overcharge command line
+          option to set an overcharging or undercharging factor
+          on each print job's cost for a particular user.
+          
+        - repykota's output format has changed an is not limited to  
+          80 characters wide anymore. People who used to parse 
+          repykota's output in their own tools are strongly advised
+          to parse dumpykota's output instead.
+          
+        - Introduction of the new 'maxdenybanners' configuration directive
+          to allow up to N (the directive's value) deny banners to be
+          printed even if the print account is forbidden to print.
+          
+        - Better detection of the number of copies in the PostScript parser.
+        
+    - 1.21alpha23 :
+    
+        - Traditional Chinese translation added.
+    
+        - Several fixes and performance improvements with the LDAP backend.
+        
+    - 1.21alpha22 :
+    
+        - edpykota's --delete command line option doesn't consider
+          '*' to be the default argument anymore :-)
+          
+    - 1.21alpha21 :
+    
+        - dumpykota.cgi can now be run as a normal user as opposed to 
+          a PyKota administrator. No read access to pykotadmin.conf is
+          necessary anymore. This CGI scripts now honors the REMOTE_USER
+          environment variable just like printquota.cgi does, see 
+          the file cgi-bin/README for details.
+          The command line tool dumpykota must still be run by a PyKota 
+          administrator.
+          
+        - Fix exception's name error due to a change in recent versions 
+          of PygreSQL.   
+          
+    - 1.21alpha20 :
+          
+        - Big bug fix wrt the datelimit field which was never reset.
+          
+    - 1.21alpha19 :
+    
+        - Introduction of the new dumpykota.cgi CGI script, which
+          allows third party tools like phpPrintAnalyzer to be
+          interfaced in real time with PyKota. To use it you
+          may have to change your web server's configuration,
+          please see pykota/cgi-bin/README
+          
+    - 1.21alpha18 :
+    
+        - Now dumpykota can dump the job history into CUPS' page_log
+          format (even when the printing system is LPRng). This allows
+          people to use tools like PrintAnalyzer or phpPrintAnalyzer 
+          (two completely different beasts) with PyKota.
+          
+    - 1.21alpha17 :
+     
+        - Fixed field type's name in XML dumps.
+        
+        - Now drops priviledges to user 'pykota' when launched as root
+          (directly or as a CUPS backend), if such an user exists.
+          
+        - Fixed PCL3/4/5 parser for some drivers' output.
+        
+    - 1.21alpha16 :
+    
+        - fixed several recently introduced bugs in LDAP backend code,
+          thanks to Matt Hyclak.
+          
+    - 1.21alpha15 :
+      
+        - Normalized field names between LDAP and PostgreSQL backends
+          in dumpykota's output.
+          
+        - dumpykota filtering capabilities are now supported within
+          the LDAP backend too.
+          
+    - 1.21alpha14 :
+    
+        - dumpykota now supports extended filtering possibilities
+          with the PostgreSQL backend (LDAP support will come soon).
+          
+    - 1.21alpha13 :
+    
+        - Added a --debug command line option to pkpgcounter, so
+          that people may see what really happens, and what will
+          be available in the future :-)
+          
+    - 1.21alpha12 :
+    
+        - Fixed a bug with non standard pkbanner command lines.
+        
+        - Now logs as errors the differences between precomputed and 
+          computed job sizes. **CUPS only for now**
+          
+    - 1.21alpha11 :
+    
+        - Now user and group print quota entries can be stored directly
+          below the user or group with the LDAP backend, using them
+          as branches. Thanks to Stefan Wold for the patch.
+          See the sample configuration file for details.
+          
+        - TLS is now supported with the LDAP backend. Thanks to Stefan
+          Wold for the patch.
+          See the sample configuration file for details.
+          
+        - edpkota now accepts the -U | --used value command line argument
+          to preset the page counters to an initial value. Thanks to
+          Wilson Roberto Afonso and Matt Hyclak for the patch.
+          
+    - 1.21alpha10 :
+    
+        - Now automatically reconnects up to three times if the LDAP server
+          returned an error, possibly due to a timeout.
+          
+    - 1.21alpha9 :
+    
+        - Now searches the configuration files in 'pykota' system user's
+          home directory. The 'pykota' system user and group have
+          to be created by the system administrator, and given 
+          sufficient permissions to PyKota's configuration files.
+          
+    - 1.21alpha8 :
+    
+        - Added the new reject_unknown directive to reject the
+          creation of user or groups which are unknown to the system.
+          
+    - 1.21alpha7 :
+    
+        - Introduction of the pkmail email gateway.
+        
+    - 1.21alpha6 :
+    
+        - Fix for LPRng filenames.
+        
+        - Added Turkish translation thanks to Baris Cicek.
+        
+    - 1.21alpha5 :
+    
+        - Improved ESC/P2 miniparser for Stylus Photo printers.
+        
+        - Implemented the --savetoner command line option to pkbanner.
+        
+        - Improved pkbanner's help and messages.
+        
+    - 1.21alpha4 :
+    
+        - Fixed job's data file detection code for LPRng.
+        
+        - Fixed a problem with PJL and PowerSave mode, 
+          thanks to Wilson Roberto Afonso.
+        
+    - 1.21alpha3 :
+    
+        - PyKota can now generate its own banners, and either account
+          for them or not, depending on newly introduced directives
+          in pykota.conf
+          Thanks to Matt Hyclak for the patch.
+          
+    - 1.21alpha2 :
+    
+        - Installation script is now non interactive again, as it should
+          have stayed from the beginning. Dependencies checking can
+          be done by launching the checkdeps.py command.
+          
+    - 1.21alpha1 :
+    
+        - added an IPP messages miniparser. Extraction of the client
+          hostname is now considered to be fiable, at least until
+          the CUPS developpers change something...
+        
+    - 1.20 :
+    
+        - Version number changed.
+        
+    - 1.20beta :
+    
+        - Norwegian (Bokm� preliminary translation added.
+        
+        - German translation was finalized.
+        
+        - Greek translation was finalized.
+        
+        - For urgent legal reasons, a "privacy" directive has been added 
+          to pykota.conf, to hide jobs' title, filename and options
+          in the history.
+          
+        - Minor changes in the debian directory.
+        
+    - 1.20alpha27 : 
+    
+        - Fixed many problems with translation files. In particular
+          the Brazilian Portuguese translation file was incorrectly
+          installed into the french "breton" locale directory.
+          
+        - Finished French translation.  
+          
+    - 1.20alpha26 :
+    
+        - LPRng support code should now better detect network
+          printers' hostnames or IP addresses.
+          
+        - Fix for recently introduced bug in LPRng support.
+        
+        - Fix for incorrect locale setting when starting.
+        
+    - 1.20alpha25 :
+    
+        - pkprinters allows --list to normal users, but require user
+          to be a PyKota administrator when another command line 
+          option is used.
+          
+        - pkhint doesn't use absolute path to search for helper commands
+          anymore.
+          
+        - Spanish translation ready for 1.20.   
+        
+    - 1.20alpha24 :
+    
+        - Now warnpykota only warns users limited by balance once.
+        
+        - Now warnpykota only warns users who have ever printed,
+          to not cause confusion to users who have just opened
+          their account.
+        
+        - Prepared help messages for translations.
+        
+    - 1.20alpha23 :
+    
+        - Add workaround for locale problem.
+        
+    - 1.20alpha22 :
+    
+        - Hopefully final fix for data encoding charset.
+        
+        - edpykota now refuse to work if the user is not a PyKota admin.
+        
+        - Fixes a recently introduced bug with users groups and PostgreSQL.
+        
+    - 1.20alpha21 :
+    
+        - Now dumpykota refuses to launch if the current user is not
+          a PyKota administrator (a PyKota administrator is an user
+          allowed to read the pykotadmin.conf file).
+          
+        - Now any PyKota administrator can use repykota and warnpykota
+          with additionnal arguments, not only the root user.
+          
+        - Improved documentation a bit.
+        
+    - 1.20alpha20 :
+    
+        - Reduced delay in internal SNMP and PJL_over_TCP handlers
+          from 2 to 1 second.
+        
+        - dumpykota can now output XML.
+        
+    - 1.20alpha19 :
+    
+        - Improved user groups and user groups quotas dumps in dumpykota.
+        
+        - Finished implementation of LDAP support in dumpykota.
+        
+        - The md5 sum of the job's datas is now available as an 
+          hexadecimal digest in the PYKOTAMD5SUM environment variable.
+          
+        - The description, filename, title, and options fields
+          are now stored as UTF-8 strings in both LDAP and PostgreSQL.
+          Proper charset is used during extraction from the database.
+          
+    - 1.20alpha18 :
+    
+        - Experimental autopykota command to initialize user
+          account and quota entries on first print while not 
+          resetting the balance value if not needed.
+          
+        - Added the new "winbind_separator" directive to strip
+          out the Samba/Winbind domain name while printing if
+          needed (Off by default).
+          
+    - 1.20alpha17 :
+    
+        - Added --hardreset command line option to edpykota.
+        
+        - Fixed problem with accented chars in title, filename
+          or options and LDAP backend.
+          
+    - 1.20alpha16 :
+    
+        - Internal handling of socket based PJL queries over
+          port tcp/9100 is now available with the magic
+          'pjl' value in the hardware accounter.
+          
+    - 1.20alpha15 :
+    
+        - LDAP pykotaAccountBalance objects were always created
+          attached to the pykotaUser objects. This is now
+          fixed and the value of balancebase in pykota.conf
+          is now correctly used.
+          
+    - 1.20alpha14 :
+    
+        - Belgian translations added (copy of the french ones).
+        
+        - External hardware accounter now loops until
+          a result can be read correctly.
+          
+        - pkhint now suggest the internal snmp handling instead
+          of the external one.
+          
+    - 1.20alpha13 :
+     
+        - Hardware accounter now accepts the special
+          'snmp' value, meaning ALL is done from main code
+          without launching any subprocess.
+          You need the http://pysnmp.sf.net Python module
+          for this to work (tested with v3.4.2)
+          
+        - Increased delay between two loops iterations  
+          to 2 seconds in waitprinter.sh to diminish
+          CPU load.
+          
+    - 1.20alpha12 :
+    
+        - waitprinter.sh rewritten from scratch to wait
+          for printer status stabilization.
+        
+    - 1.20alpha11 : 
+    
+        - Generic data dumper 'dumpykota' introduced.
+          Works only with PostgreSQL backend for now.
+          
+    - 1.20alpha10 :
+    
+        - Added fix for incorrect job's size computation when
+          hardware accounting fails.
+          
+    - 1.20alpha9 :
+    
+        - Small fixes wrt subprocesses.
+        
+    - 1.20alpha8 :
+    
+        - Added full support of PCL3 : HP Deskjet printers are now 
+          supported.
+        
+    - 1.20alpha7 :
+    
+        - First draft of PCL3GUI (Deskjet 640C for example) analyzer.
+          Needs more work, but no documentation is available.
+        
+    - 1.20alpha6 :
+      
+        - Improved mailandpopup.sh script.
+        
+        - Small fixes for LPRng.
+        
+        - Now exports PYKOTAPRINTERHOSTNAME for network printers'
+          hostname or IP address. Set to 'localhost' when not
+          meaningful.
+          
+        - Fixed issue with how mod_auth_ldap Apache modules
+          fills the REMOTE_USER environment variable.
+          
+        - Fixed a bug in LDAP user deletion code.
+        
+    - 1.20alpha5 :
+      
+        - Introduces the new configuration directive 'onaccountererror'
+          to specify what must be done whenever the software or
+          hardware accounter fails. Allowed values are 'continue' and
+          'stop' (default). 
+          
+        - Minor fix in software accounter for a recently introduced
+          problem.
+          
+    - 1.20alpha4 :
+    
+        - Added support for more ghostscript devices in ESC/P2
+          analyzer : stcolor, st800, escp, escpc are now supported.
+          
+    - 1.20alpha3 :
+       
+        - Small improvement in PostScript parser to avoid being
+          fooled by a change in number of copies : 
+          The user can't ask for 200 copies of page 1 and 1 copy 
+          of page 2 to fool PyKota anymore : 
+          this would have been accounted for as 1 copy only, but
+          now the maximum value seen is used.
+          
+        - Relax checks for PCL5 header to accomodate some strange
+          printer drivers.
+          
+        - Now hardware accounting method works like software
+          accounting method wrt the subprocess' output.
+          
+        - Hardware and Software accounting stop the print queue  
+          when the accounting subprocess didn't work. This will
+          be configurable in the near future.
+          
+    - 1.20alpha2 :
+    
+        - Now software accounting method reads accounter's
+          answer until a line with a single integer is 
+          obtained or until all of its output has been read.
+          This should fix the problem some people have
+          when strange locale related messages are sent
+          when running subprocesses (Solaris only ?).
+          
+        - First version of ESC/P2 analyzer. Seems to work
+          ok at least with 'epson', 'epsonc', 'eps9mid' 
+          and 'esp9high' ghostscript devices. Needs more
+          work to correctly analyze other devices.
+        
+    - 1.20alpha1 : 
+    
+        - Fixed problem with number of copies in PCLXL parser.
+        
+        - Fixed problem with number of copies in PCL5 parser,
+          when number of copies was set outside of and before first
+          page.
+        
+        - Added workaround for number of copies directly set in
+          PostScript code.
+          
+        - Added german translation.
+        
+        - Fixed problem on first print for user group quota when
+          "enforcement: strict" is used.
+        
+        - Fixed interpolation problem in french translation.
+        
+    - 1.19 :
+    
+        - Updated existing translations.    
+        
+        - Added final Thai and Greek translations.
+        
+        - Minor last minute bug fixes.
+        
+    - 1.19beta :
+    
+        - LPRng support for both software and hardware accounting seems
+          to be OK.
+          
+        - Translation files fixed because of fuzzy matching problem.  
+        
+        - Fixed path to Swedish translation: 'sv' instead of 'se'.
+        
+        - Added first draft of Thai translation.
+        
+        - Fixed some minor bugs with Pychecker.
+        
+    - 1.19alpha35 :
+    
+        - Generic PDL analyzer now supports Binary PostScript documents
+          in addition to DSC compliant ones.
+        
+    - 1.19alpha34 :
+    
+        - LPRng support : software accounting seems to work fine,
+          but hardware accounting doesn't work yet.
+   
+    - 1.19alpha33 :
+    
+        - pykosd now accepts command line arguments. Enjoy !
+          NB : due to a bug in xosd, you need xosd version 2.2.8
+          or higher if you don't use the default C locale.
+          
+    - 1.19alpha32 :
+    
+        - Early (not working) version of the LPRng support rewrite.
+        
+        - Saner default configuration file.
+        
+    - 1.19alpha31 :
+    
+        - Fixed a double Python2.1 incompatibility with newer versions,
+          which prevented the PCL5 and the PCLXL parsers to work with
+          this older version of Python.
+          
+    - 1.19alpha30 :
+    
+        - Introduction of preliminary version of the pykosd command
+        
+        - Usernames, Groupnames and Printernames can now contain
+          ANY character, expected '/' and '@'.
+        
+        - Integrated most of the Debian work from Sergio 
+          Gonz�z Gonz�z
+          
+    - 1.19alpha29 : 
+    
+        - PCLXL parser should now correctly handle number of
+          copies set for each page.
+          
+        - Added testsuite for generic PDL analyzer.
+        
+        - Typo fixed in PCLXL parser.
+        
+        - Correctly dispatches error messages depending on the
+          situation : tools which can be run interactively will
+          ALWAYS output their logs to stderr, excepted for
+          their DEBUG messages, for which the "logger:"
+          directive as set in pykota.conf will be honored.
+          Tools which can't be run interactively will ALWAYS
+          honor the "logger:" directive as set in pykota.conf
+          
+    - 1.19alpha28 :
+    
+        - The description field for printers can now be set,
+          and is displayed in reports.
+          
+        - Fixed a small problem in SQL backend code.
+          
+        - Improved pkhint
+        
+        - First working PCL6 (aka PCLXL) parser !
+          Doesn't handle copies yet.
+        
+    - 1.19alpha27 :
+    
+        - Additionnal 10% speed increase in PCL5 parser for GhostScript
+          generated files (untested yet with other PCL files).
+          
+        - Reintroduced the use of mmap in PCL5 parser : this speedups
+          PCL5 parsing by almost 4 times.
+          This 4x with the 3x below give us in fact a twelvefold increase
+          in performance for PCL5 parsing !
+          
+        - The Python accelerator Psyco is now used if available
+          in the generic PDL parser : it speedups PCL5 parsing by
+          almost three times automagically. 
+          
+    - 1.19alpha26 :
+    
+        - Fixed PCL5 parser according to the sources of rastertohp.
+        
+        - Fixed number of copies handling in PCL5 parser : the number
+          of copies could vary from page to page.
+          
+        - Added more debug information to PCLXL parser.  
+        
+    - 1.19alpha25 :
+    
+        - Added new "description" field to printers in both
+          PostgreSQL and LDAP. No code to handle this yet.
+          
+        - Reversed the fix for power save mode in printers :  
+          no paper or tray open would have caused people to
+          be undercharged.
+          
+        - Preliminary version of MySQL initialization script.
+          
+    - 1.19alpha24 :
+    
+        - Native PDF parsing code now works perfectly with
+          Python 2.1 and above, and is way faster than before.
+          GhostScript is not used anymore to convert PDF to PS,
+          because PDF is parsed directly.
+          
+    - 1.19alpha23 :
+    
+        - Fixed waitprinter.sh wrt PowerSave mode and some
+          printers. Thanks to Ryan Suarez.
+        
+        - Smart PDL analyzer now recognizes PDF too : two
+          PDF parsing methods are used : a native one which
+          is very fast but requires Python 2.3 or above, and
+          a slower one which uses Ghostscript. PyKota detects
+          automatically which method to use depending on your
+          version of Python.
+        
+        - All tracebacks now include PyKota's version number.
+          
+    - 1.19alpha22 :
+    
+        - Ensures that the file pointer for job's data is 
+          reset to the start of the job's datas after the
+          job's size pre-computation phase.
+          
+        - Improved PostScript detection code for bad drivers
+          which don't correctly switch languages between PJL
+          and PS.
+       
+        - Even better debugging code.
+        
+    - 1.19alpha21 :
+    
+        - Additionnal check.
+        
+    - 1.19alpha20 :
+    
+        - More complete logging messages wrt accounters.
+        
+        - Now catches early failures occuring when the configuration
+          files are parsed.
+        
+    - 1.19alpha19 :
+    
+        - Fixed over-verbose exits when displaying help
+          or version.
+          
+        - Extended some PATH in the shell scripts  
+        
+        - Deleting an user now also deletes his payments history.
+        
+        - Doesn't explicitely ignore SIGCHLD anymore. This seems to
+          cause problems.
+
+    - 1.19alpha18 :
+    
+        - History of payments is now stored in the database, and
+          updated each time an user's balance is modified with
+          edpykota --balance. This history represents each time
+          the user was given some positive or negative credit,
+          but doesn't reflect price paid for jobs, which appear
+          in the jobs history instead.
+          
+        - Jobs history web reports now include the job's size in
+          bytes. Also columns were reordered to render the report
+          more easily readable.
+          
+    - 1.19alpha17 :
+    
+        - Mysterious bug (program exited unexpectedly without leaving
+          any log message) which occured once in a while when
+          cancelling jobs should be fixed now.
+          
+        - New 'crashrecipient' directive. Disabled by  
+          default. See sample configuration file to see how
+          to activate it. It is suggested that you activate it.
+          
+        - New PYKOTAJOBSIZEBYTES environment variable exported,  
+          which contains the job's size in bytes. Empty jobs
+          are now denied. This value is now stored in the job
+          history (but not yet displayed from the web interface)
+          
+        - Preliminary work on payments storage : the PostgreSQL  
+          and LDAP schemas should be OK now, but no code is written
+          yet to support this functionnality.
+          
+    - 1.19alpha16 :
+    
+        - the newuser and newgroup LDAP specific directives now accept
+          a second parameter to attach(), "fail" or "warn". If no entry
+          is found to attach PyKota attributes to, and "fail" was used,
+          then action is aborted and program exits in error. If "warn"
+          is used, a new entry is created but a warning message is logged.
+          
+        - The job's originating hostname is now stored in the database,
+          and exported as PYKOTAJOBORIGINATINGHOSTNAME in the environment.
+        
+    - 1.19alpha15 :
+    
+        - The old pykota filter is now removed. This means that
+          currently PyKota doesn't support LPRng anymore, but 
+          LPRng support will be re-added, improved, in the near future.
+          
+    - 1.19alpha14 :
+    
+        - PYKOTAPRECOMPUTEDJOBSIZE and PYKOTAPRECOMPUTEDJOBPRICE 
+          are now exported as environment variables.
+          
+        - Heavy CPU usage is now completely fixed it seems, by 
+          introducing some 0.01 second sleeping when nothing to do.
+          
+        - Pre-computation of the job's size is now only
+          done when enforcement is "STRICT", this saves
+          CPU for people who don't want to use this new
+          feature.
+          
+        - New 'enforcement' directive which accepts either
+          STRICT or LAXIST. See sample configuration file
+          for details.
+          
+    - 1.19alpha13 :
+    
+        - Get back to an old version of the polling loop which
+          worked fine, but non-optimally. Will be optimized
+          as time permits.
+          
+    - 1.19alpha12 :
+    
+        - Job's size is now precomputed unconditionnally using 
+          the generic PDL analyzer.
+          NB : This value is not yet used to pre-allow/deny the
+          job.
+        
+    - 1.19alpha11 :
+    
+        - The pykota filter is now completely deprecated and
+          can't be used anymore. LPRng users MUST download 
+          an older version of PyKota. CUPS users MUST use
+          cupspykota. Better support for LPRng will come
+          in the near future.
+          
+    - 1.19alpha10 :
+    
+        - pykotme now uses generic PDL Analyzer directly instead
+          of spawning a new process.
+          
+        - Improvements to generic PDL Analyzer.
+        
+        - 25% Speedup in PCL parser. Getting more of the Python version
+          will probably be difficult, since the completely table driven 
+          parser I wrote is slower than the original algorithm. Then,
+          the original algorithm is still used for now.
+          Probable that more speed could be achieved using mmap, at the
+          expense of severe memory consumption.
+        
+        - configuration simplifications : the "accounter" directive's
+          'hardware' arguments now accepts what was in the "requester"
+          directive as it's content. The "requester" directive is not
+          supported anymore. See sample configuration file for details.
+        
+    - 1.19alpha9 :
+       
+        - pkpgcounter is now just a wrapper around the PDLAnalyzer class
+        
+        - pykotaOptions LDAP attribute now accepts non-ascii characters
+          too.
+          
+        - First try at cupspykota main loop rewrite
+        
+    - 1.19alpha8 :
+    
+        - 'querying' accounting method is now called 'hardware'
+        
+        - 'external' accounting method is now called 'software'
+        
+        - 'stupid' accounting method doesn't exist anymore
+        
+        - 'snmp' requester doesn't exist anymore
+        
+        - code simplifications in external requester
+        
+    - 1.19alpha7 :
+     
+        - Database schema change (both LDAP and PostgreSQL) to
+          allow storage of the job-originating-hostname attribute.
+          An SQL upgrade script is present. The code is not yet
+          capable of setting/retrieving this attribute. Support
+          for this functionnality will be added in the future.
+          
+    - 1.19alpha6 :
+    
+        - problems connecting to SMTP servers are now catched.
+        
+        - pykotme now uses pkpgcounter to compute the size of the
+          job. This modification adds PCL5 and soon PCLXL (PCL6)
+          support. You can now get quotes for PCL in addition to 
+          PostScript.
+          
+        - pkpgcounter now includes first try at PCLXL parser.  
+          It is currently disabled until it's finished.
+          
+    - 1.19alpha5 :
+    
+        - cupspykota polling loop fix for MacOSX (at least)
+        
+        - logging subsystem now logs PID too, to ease diagnosing
+          problems under heavy load.
+          
+        - pkpgcounter enhancements.
+        
+        - pkprinters --skipexisting now tells pkprinters to not
+          modify existing printers when --add is used.
+          pkprinters logs a warning message whenever --add is
+          used and a printer already exists.
+          
+        - LDAP schema now allows accented chars in pykotaFileName
+          and pykotaTitle attributes.
+        
+    - 1.19alpha4 :
+    
+        - a bad copy&paste prevented pkpgcounter to work at all, this
+          is now fixed.
+          
+        - improved PCL support in pkpgcounter, with the use of
+          HP PCL/PJL Reference Set
+          PCL5 Printer Language Technical Quick Reference Guide
+        
+        - pkpgcounter now uses mmap to speed things up : duration
+          is halved with the sample 87 pages PCL document I use for
+          testing.
+          
+    - 1.19alpha3 :
+    
+        - pkprinters now accepts the --list command line argument
+          to list informations about printers.
+          
+    - 1.19alpha2 :
+    
+        - pkpgcounter is now included as a smart external
+          accounter which can handle both PostScript and PCL.
+          
+    - 1.19alpha1 : 
+    
+        - PYKOTALIMITBY environment variable is now exported too.
+        
+        - Inclusion of Michele Baldessari's work on autotools.
+        
+    - 1.18 :
+    
+        - Improved documentation
+        
+    - 1.18beta2 :
+      
+        - Fix for raw jobs with cupspykota
+        
+    - 1.18beta :
+    
+        - Small fix for new waitprinter.sh script
+        
+        - Better tracebacks on error conditions
+        
+        - Improved translations
+        
+        - Improved documentation
+        
+    - 1.18alpha15 :
+
+        - waitprinter.sh replaced by a new and possibly faster
+          and more powerful one.
+    
+        - Names can now begin with a digit.
+        
+        - Stability improvement for quotas set on printers groups.
+        
+    - 1.18alpha14 :
+    
+        - Catches more (all ?) problems with SMTP servers instead
+          of breaking.
+          
+        - Italian translation added.
+        
+    - 1.18alpha13 :
+    
+        - Pre and Post hooks are now available in the pykota
+          filter as well.
+          
+        - The pykota filter doesn't check last user's quota
+          anymore when delayed hardware accounting is used : 
+          this will be done anyway the next time the last 
+          user will print again. This saves some database
+          queries which are unneeded.
+        
+    - 1.18alpha12 :
+    
+        - Pre and Post hooks to external commands with many 
+          many environment variables available are useable 
+          from the cupspykota backend.
+          See sample configuration file for details and help.
+          
+    - 1.18alpha11 : 
+    
+        - Hopefully final fix wrt groups (users and printers)
+        
+    - 1.18alpha10 :
+    
+        - Fixed nested printer groups accounting.
+        
+        - Fixed user groups + printer groups problem.
+        
+    - 1.18alpha9 :
+    
+        - Fix for LDAP problem when job price was 0.
+        
+        - Fix for empty user groups with LDAP.
+        
+        - Preliminary version of the snmpprinterstatus command added.
+        
+    - 1.18alpha8 :
+    
+        - Don't retrieve data when not needed.
+          This avoids many database queries.
+        
+    - 1.18alpha7 :
+    
+        - New experimental ldapcache directive to improve
+          LDAP caching.
+          
+    - 1.18alpha6 :
+        
+        - New configuration directive added : maildomain
+          to specify the domain to send mail to when user 
+          email address is not set in PyKota database.
+          
+        - More complete email message headers.  
+          
+    - 1.18alpha5 :
+    
+        - Debian packaging specific files, contributed by
+          Peter Hawkins are now included in the project's tree.
+          
+        - Preliminary work on future low-level LDAP caching to speed
+          up modifications (at least).
+          
+    - 1.18alpha4 :
+    
+        - Applied some of the modifications suggested by
+          Peter Hawkins, for better Debian integration.
+          Most notably cupspykota, pykota, and the shell
+          scripts are now installed into /usr/share/pykota
+          instead of into /usr/bin
+          BEWARE : double check that your symbolic link
+          to cupspykota is correct, and that your pykota.conf
+          file use correct path for the shell scripts like
+          waitprinter.sh and al.
+          
+        - pkhint command added, to help in configuring correct
+          accounting method for PyKota.
+          
+    - 1.18alpha3 :
+    
+        - Fixed a rare bug in cupspykota backend which gave 
+          incorrect "CUPS backend died abnormally" messages.
+        
+    - 1.18alpha2 :
+    
+        - Added the pkprinters command line tool to manage printers
+          exclusively.
+        
+    - 1.18alpha1 :
+    
+        - Preliminary work on Relationnal Database Independance.
+        
+        - Sample report made from OpenOffice.org added as PDF and SXC.
+        
+    - 1.17 :
+    
+        - Finalized release.
+        
+    - 1.17alpha2 : 
+    
+        - Fix stupid software accounting bug in the CUPS backend.
+        
+    - 1.17alpha1 :
+    
+        - User/Group deletion code in edpykota rewritten.
+        
+    - 1.16 :
+    
+        - Preliminary documentation on how to use OpenOffice.org
+          to create personnalized reports for PyKota + PostgreSQL.
+          
+        - Spanish installation guide for CUPS+PyKota+PostgreSQL
+          added to the documentation. Doesn't yet document v1.16
+          though.
+        
+        - Portuguese Portuguese translation replaces Brazilian 
+          Portuguese Translation. Brazilian portuguese 
+          translation is still available under the 'br' locale.
+        
+    - 1.16beta3 :
+    
+        - Swedish translation added.
+        
+        - Small fix in documentation.
+        
+    - 1.16beta2 :
+    
+        - Small fix for job cancelling code while job already
+          printing in CUPS backend.
+          
+        - Big fix wrt printing policies for unknown users.  
+        
+    - 1.16beta1 :
+    
+        - Manpages upgraded.
+        
+    - 1.16alpha26 :
+    
+        - Job price is now computed like this :
+        
+          SUM((NbPages * PricePerPage) + PricePerJob)
+          
+          For current printer and all the printers groups it is 
+          a member of, if any.
+          
+          This may be difficult to grasp, but offers unprecedented
+          flexibility.
+          
+    - 1.16alpha25 :
+    
+        - Email address can be set at user creation time,
+          using the following syntax : 
+          
+            $ edpykota --add username/email@yourdomain.com
+        
+    - 1.16alpha24 :
+    
+        - CGI script now can show the printing history.
+        
+        - Bug wrt number of copies should be fixed.
+        
+        - Major code refactoring => It is now possible to
+          automatically add printers on first print.
+        
+    - 1.16alpha23 :
+    
+        - Fixed potential accuracy problem if a user printed on
+          several printers at the very same time.
+        
+    - 1.16alpha22 :
+    
+        - edpykota now allows adding printers to printer groups
+        
+    - 1.16alpha21 :
+    
+        - Allows the dot in user and printer names.
+        
+        - Printer groups are now cached too.
+        
+    - 1.16alpha20 :
+    
+        - Fixed several small bugs with the help of PyChecker.
+        
+    - 1.16alpha19 :
+     
+        - Fixed a bug in PostgreSQL backend's code.
+        
+    - 1.16alpha18 :
+    
+        - Initial code for printer groups support. Printer groups have
+          to be added with external tools like psql or gq for example.
+          Printer groups seems to work fine with users. Untested with user 
+          groups for now.
+
+        - Several minor visual problems fixed in reports.
+        
+        - Fixed a bug in LDAP date handling.
+        
+        - Fix for LDAP problem with some combination of OpenLDAP + Python-LDAP
+          + some particular settings.
+          
+        - mailandpopup.sh shell script added. See sample configuration file
+          for details.
+        
+        - Several environment variables are now exported when executing 
+          external commands (accounters, requesters, mailers) :
+           
+            PYKOTAUSERNAME => user who is printing
+            PYKOTAPRINTERNAME => printer on which the job is being sent
+            PYKOTATITLE => Job's title
+            PYKOTAFILENAME => Job's filename
+            PYKOTACOPIES => number of copies asked
+            PYKOTAOPTIONS => print command options (-o with CUPS)
+          
+    - 1.16alpha17 :
+    
+        - Added portugues translation.
+        
+        - Major code refactoring in accounters.
+        
+    - 1.16alpha16 :
+    
+        - Code refactoring, and addition of a real HTML reporter, to 
+          have nice looking and useful web based reports (in the future).
+        
+        - Added utolower configuration option to convert all usernames
+          to lowercase during printing. 
+          
+    - 1.15alpha15 :
+    
+        - Now includes the papwaitprinter.sh shell script to wait for
+          AppleTalk enabled printers.
+          
+    - 1.16alpha14 :
+    
+        - Now printing on a printer not defined in the Quota Storage,
+          results in the job being cancelled or stopped, depending
+          on the printing system.
+          
+    - 1.16alpha13 :
+    
+        - Small bugfix wrt Python v2.1
+        
+        - If username is an empty string, user root is assumed.
+        
+        - 'postgresql' is not recognized anymore as a storage backend,
+          you have to use 'pgstorage' instead. 'postgresql' used to
+          be supported for compatibility with very old PyKota versions,
+          this is not the case anymore.
+          
+    - 1.16alpha12 :
+    
+        - Job price added to job history, to keep accounting correct
+          if a printer price per page or per job is modified and the
+          history is not reset : the history would have given a false
+          amount of money charged before the printer's prices were
+          modified, this addition solves the problem.
+          
+    - 1.16alpha11 :
+    
+        - Some preliminary modifications to the database structure for 
+          PostgreSQL and OpenLDAP. A script to upgrade a PostgreSQL
+          database is now provided. LDAP attributes now support
+          eq, pres and sub indexes. 
+          
+        - Job history now contains additional informations :  
+          number of copies, filename, title and print options.
+          
+    - 1.16alpha10 :
+        
+        - Some modifications done to external policy handling.
+          See sample configuration file for details.
+    
+        - Spanish translation added.
+        
+    - 1.16alpha9 :
+    
+        - mailto can be set to external(...) to warn users above
+          quota with any command of your choice (e.g. linpopup).
+          Several parameters are available, see sample configuration
+          file for details.
+          
+    - 1.16alpha8 :
+    
+        - Now cupspykota transmits SIGTERMS to the original  
+          backend when the user deletes a job being processed.
+          
+        - The documentation is now licensed under the terms of the
+          GNU GPL too.
+          
+    - 1.16alpha7 :
+    
+        - The CUPS backend is now fully functionnal (it seems).
+        
+        - From now on, the use of the pykota filter with CUPS 
+          is deprecated. The pykota filter still has to be
+          used with LPRng though.
+        
+    - 1.16alpha6 :
+    
+        - Bug fixed : when edpykota was used to add a printer
+          with no user or group name, a bad user/group name "*" was
+          added to the database.
+          
+    - 1.16alpha5 :
+    
+        - New CUPS backend supports device enumeration !
+          This means that NO manual CUPS configuration has to
+          be done. All can now be done from CUPS web interface.
+        
+    - 1.16alpha4 :
+    
+        - New CUPS backend added. 
+        
+    - 1.16alpha3 :
+       
+        - Minimal FAQ document added.
+        
+    - 1.16alpha2 :
+    
+        - CGI script now partially supports browser's language preference
+        
+    - 1.16alpha1 :
+    
+        - Ensures that the LDAP connection is really closed at end.
+        
+        - More complete error messages in case of LDAP operation failure.
+        
+    - 1.15 :
+     
+        - Documentation improved.
+        
+    - 1.15beta :
+    
+        - Command line tools now accept multiple printer
+          names or wildcards, separated with commas.
+          
+    - 1.15alpha9 :
+    
+        - External policy can be used to auto-add unknown users 
+          and any other interesting things you may want to do. 
+          WARNING : You can't auto-add printers for now. 
+          They have to be created manually before.
+          Look at sample configuration file for examples.
+          
+    - 1.15alpha8 :
+    
+        - Job history can be disabled if needed.
+          This feature may be useful for people who use the LDAP
+          backend and don't want their LDAP tree to grow out of
+          control.
+        
+    - 1.15alpha7 : 
+    
+        - More work done on caching wrt groups.
+        
+    - 1.15alpha6 :
+    
+        - Performance bottleneck with LDAP solved.
+        
+    - 1.15alpha5 :
+    
+        - Caching mechanism for all database queries.
+
+    - 1.15alpha4 :
+    
+        - Problem with Python 2.3 fixed. Needs some definitive 
+          modification.
+          
+    - 1.15alpha3 :
+    
+        - CGI script now tries to restrict view when the 
+          REMOTE_USER environment variable is set. This allows
+          people to protect its use with .htaccess files.
+          When unprotected, or if REMOTE_USER is 'root', then 
+          unrestricted access is granted.
+          NB : REMOTE_USER is automatically set by the web server
+          (e.g. Apache) when a page with restricted access is viewed.
+          
+    - 1.15alpha2 :
+    
+        - Better detection of LPRng.
+        
+        - Outputs a warning if printing system is unknown.
+        
+    - 1.15alpha1 :
+    
+        - Bug fix in SQL code.
+        
+    - 1.14 : 
+    
+        - The PostgreSQL database connection is now always closed before
+          exit. The LDAP database connection too, but it didn't suffer
+          from the problem anyway, AFAICT.
+        
+    - 1.14beta2 :
+    
+        - An LDAP-specific configuration field was introduced, usermail.
+          Use it to specify which LDAP attribute contains a valid email
+          address for the user. See sample configuration file for
+          details. 
+        
+    - 1.14beta :
+    
+        - Two new LDAP-specific configuration fields were introduced,
+          newuser and newgroup. Use them to specify if you want to add
+          quota information to existing entries or elsewhere.
+          See sample configuration file for details.
+          
+    - 1.14alpha9 :
+    
+        - Documentation improved.
+        
+        - pykotme now also prints the user's account balance value
+          if the user is registered in the Quota Storage and his
+          limiting factor is "balance".
+          
+    - 1.14alpha8 :
+    
+        - bin/waitprinter.sh is now included to wait for
+          SNMP enabled printers to be idle again before
+          asking for their internal page counter.
+          See sample configuration file for details.
+          
+    - 1.14alpha7 :
+    
+        - edpykota now doesn't check if the user/group is above
+          quota. The check is only done at print time. This 
+          prevents the sending of email messages when creating
+          user quotas if quota is already reached at creation
+          time.
+          
+    - 1.14alpha6 :
+    
+        - Configuration file split and moved to /etc/pykota/pykota.conf
+          and /etc/pykota/pykotadmin.conf to prevent simple users to
+          have Read/Write access to the Quota Database.
+          Don't forget to :
+          
+                $ chmod 640 /etc/pykota/pykotadmin.conf
+                
+        - storageuser and storageuserpw configuration fields reintroduced
+          for the same reason.
+          
+        - Code cleaning for future implementation of email addresses 
+          support in the PostgreSQL and LDAP backends.
+          
+    - 1.14alpha5 :
+        
+        - Big bug fixed when changing the prices for a printer
+        
+    - 1.14alpha4 :
+    
+        - When adding an user, the user itself and its account balance
+          are now added in the same LDAP entry. Before they were added
+          as two different LDAP entries.
+          
+    - 1.14alpha3 :
+    
+        - Email field added to PostgreSQL database. An upgrade script
+          is included in initscripts/postgresql.
+        
+    - 1.14alpha2 :
+    
+        - Typo fixed when using the --prototype option to edpykota
+        
+    - 1.14alpha1 :
+    
+        - Poor man's treshold included : users with a low account
+          balance (below 1.0 by default, configurable) are sent
+          a warning message.
+          
+        - All warning messages to users are now configurable.  
+          NB : Warning messages to the administrator are not.
+        
+    - 1.13 :
+    
+        - Some small fixes wrt group handling. 
+        
+        - The whole module code was passed through PyChecker and
+          several small code inconsistencies were fixed,
+          as well as a bug in the groups code.
+          
+    - 1.13alpha1 :
+    
+        - Bug fix wrt LDAP.
+        
+    - 1.12 :
+    
+        - More complete test added in edpykota.
+        
+    - 1.12alpha2 :
+    
+        - The previous bug fix was incomplete. This is corrected.
+        
+    - 1.12alpha1 :
+    
+        - Small bug fix.
+        
+    - 1.11 :
+    
+        - Now includes the pykotme command line tool, to produce
+          printing quotes for users.
+          
+    - 1.10 :
+    
+        - Bug fixed wrt quota reports when print limiting is by 
+          account balance.
+          
+    - 1.09 :
+    
+        - Translations finalized.
+        
+        - Manpages updated.
+        
+        - Installation documentation improved wrt LDAP support.
+        
+    - 1.09beta2 :
+    
+        - The CGI script for quota reports works again, and
+          is much more powerful.
+        
+    - 1.09beta :
+    
+        - edpykota finalized
+        
+    - 1.09alpha2 :
+    
+        - LDAP schema modified a bit. Please upgrade.
+        
+        - LDAP backend works !
+        
+        - repykota and warnpykota allow the root user to pass
+          users or groups names on the command line. Users 
+          and groups names may contain wildcards.
+          
+        - repykota and warnpykota only reports or warns the
+          current user when launched by non-root users.
+          
+        - Minor bug fixes.  
+    
+    - 1.09alpha1 :
+    
+        - More work on LDAP storage backend. Many options
+          were added to /etc/pykota.conf to give some
+          hints to the LDAP storage backend.
+          
+        - Severe database access optimizations were done by
+          rewriting most of the Quota Storage backends drivers.
+      
+    - 1.08 :
+    
+        - Major bug fix wrt LPRng support for remote jobs.
+        
+        - Major bug fix wrt increase/decrease account balances.
+        
+    - 1.08alpha8 :
+    
+        - Code refactoring.
+        
+        - A single user/password pair is used to connect
+          to the database backend. The storageuser configuration
+          field, and its associated passwords storageuserpw, are 
+          not used anymore.
+          
+        - You can now set PyKota in debug mode, see sample configuration  
+          file for details. 
+          WARNING : only Quota Storage backend queries are logged in 
+          debug mode, for now.
+        
+    - 1.08alpha7 :
+    
+        - Very latest LDAP schema.
+        
+        - Code enhancement wrt easy pluggability of PyKota attributes
+          and object classes into an existing LDAP directory.
+        
+    - 1.08alpha6 : 
+    
+        - Minor bug corrections
+        
+        - More work on LDAP : new schema
+        
+    - 1.08alpha5 :
+    
+        - More good work on LDAP storage.
+          repykota now works reasonably well with the sample LDAP directory.
+        
+    - 1.08alpha4 :
+    
+        - LDAP schema included. 
+          THIS IS JUST FOR PEOPLE TO DISCUSS ABOUT THIS.
+          LDAP SUPPORT DOESN'T WORK YET, AND THE SCHEMA
+          MAY CHANGE IN THE FUTURE. PLEASE TELL US
+          WHAT YOU THINK ABOUT THIS SCHEMA ON THE 
+          MAILING LIST.
+          
+    - 1.08alpha3 :
+    
+        - External accounting methods were partly rewritten :
+         
+          - No more "broken pipe" should happen.
+          
+          - They now take care of the number of copies
+            This may be unneeded though, if the postscript
+            file already does this, because this would
+            overcharge users (number of copies counted
+            two times). NEEDS MORE TESTING.
+            
+          - The sample configuration file now contains  
+            an external accounting method example which should
+            work with all DSC compliant Postscript files.
+            
+        - Some small bugs were fixed.    
+        
+    - 1.08alpha2 :
+    
+        - Now works with net-snmp v5.0 and above.
+          It already worked, but the sample configuration 
+          file didn't contain appropriate values...
+        
+    - 1.07 : Release of the Shame !
+    
+        - The external accounting methods driver was left out of 
+          the CVS tree. Nobody could use it since it wasn't included !
+          
+    - 1.06 :
+    
+        - Severe bug fixed : if you had a printer in 
+          power saving state which couldn't answer immediately, 
+          a bug was triggered.
+          It was caused by a bad copy/paste which
+          forgot to import a Python module at run time.
+          
+    - 1.05 :
+    
+        - External accounters are finally available !
+          This means that you can plug any page accounting
+          method you like by setting the appropriate
+          'accounter' field in /etc/pykota.conf
+          See the sample conf/pykota.conf.sample to 
+          learn how to do.
+          
+          NB : Both 'external' and 'stupid' accounting methods
+               account a job size just before *this* job is 
+               sent to the printer. 
+               The original 'querying' method accounts a job
+               size just before *the next* job is sent to
+               the printer.
+        
+    - 1.05alpha3 :
+    
+        - A 'stupid' and unreliable accounting method was
+          implemented to serve as an example on how to
+          do this sort of things. This method only counts
+          the 'showpage' statements in the input data.
+          See sample configuration file for details.
+          Pluggable accounting methods work, but I advise
+          you TO NOT USE THIS ONE WHICH IS JUST AN EXAMPLE.
+          It is not reliable enough to be used.
+          Use the 'querying' accounting method instead.
+          
+    - 1.05alpha2 :
+    
+        - Pluggable accounting methods.
+        
+        - Better error handling.
+        
+    - 1.05alpha1 :
+    
+        - SECURITY file added to help improve PyKota's security.
+        
+        - Extracting the printer's internal page counter is now
+          tried several times, waiting several seconds between
+          two tries. This lets the time to warm up for some printers 
+          which don't answer when they are sleeping (my Apple 
+          LaserWriter 16/600 PS is in this case, maybe others too)
+          
+        - Small display bug fixed in repykota
+          
+    - 1.04 :
+    
+        - Default print policy for users/groups unknown from 
+          the print quota system is now DENY instead of ALLOW,
+          since ALLOW can generate inaccurate results
+          (incorrect job sizes charged to the wrong persons)
+          
+        - LPRng support works !
+        
+        - A bug was introduced some time ago wrt printers' default
+          policy for unknown users. It is now corrected.
+        
+        - repykota now displays prices per job and per page for each
+          printer, if they are defined.
+          
+        - Minor display bug fixed in repykota.
+        
+        - Problem when running repykota with an empty database was fixed.
+        
+    - 1.03 :
+    
+        - Upgrade script included for earlier versions.
+          Please look inside the initscripts subdirectory.
+          THE DATABASE SCHEMA HAS CHANGED, PLEASE UPGRADE.
+          
+        - repykota now reports account balances too.
+        
+        - PyKota now has a nice logo, see the logos
+          subdirectory.
+        
+        - Manual pages were finally updated.
+        
+        - Group quotas seem to work now !
+        
+        - The new database schema allows to keep an history of all
+          jobs as well as charge users per page and/or per job, 
+          and track users' account balance.
+          
+        - edpykota now accepts much more command line options to  
+          use the new functionnalities. See edpykota --help for
+          details.
+          
+        - The installation script now allows to install the sample
+          configuration file during first installation.
+          
+        - More group quota code works, but still not finished.  
+        
+        - The CGI script displays a link to PyKota's website.
+        
+        - The job history is now kept, this will allow per-period
+          reports in the future.
+          
+        - After having modified the quota for an user with edpykota,
+          a quota check is done to eventually warn the user/admin about
+          a quota which is too low to print.
+          
+        - A workaround is provided for HP Printers : their internal
+          page counter is only saved to NVRAM in a 10 increment, so
+          if you switch them off and then on, the reported page counter
+          may be lower than the real number of pages printed.
+          See http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html
+          We unconditionnally set the last job's page count to 
+          abs(int((10 - abs(lastcounter(snmp) - lastcounter(storage)) / 2))
+          in this case. 
+          For a more accurate accounting, never switch your HP printers
+          off.
+          
+        - A fix is provided for printers which only have a volatile  
+          page counter (reset to 0 every time you switch the printer on)
+          This should allow PyKota to work reasonably fine with HP Laserjet
+          4L/5L/6L, not perfect, but better than nothing.
+          See http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html
+          For a more accurate accounting, never switch your HP printers
+          off. This is untested, please report any problem.
+          
+        - A bug was fixed when edpykota --add was used with users who already
+          had a quota on the specified printer.
+          
+        - A small display bug in repykota was introduced in preliminary 
+          1.03 versions, and fixed later on.
+          
+        - Some minor bugs which happened in rare situations were fixed.
+        
+        - Support for AppleTalk printers was added, see sample configuration
+          file for details.
+          
+        - Users and group printing can now be controlled (limited) either by  
+          print quota or by account balance.
+        
+    - 1.02 :
+    
+        - The installation script now checks for software availability
+          and in case a software is missing asks the user if he
+          wants to continue with the installation or abort it.
+          
+        - The configuration file pykota.conf is now expected to be 
+          found in /etc instead of in /etc/cups
+          The installation script prompts the user to see if he
+          wants to move an old configuration file to the new location
+          if needed.
+          
+        - Improved documentation.
+        
+        - You can now set the tcp/ip port on which the Quota Storage
+          Server is listening, see sample configuration file for details.
+        
+        - Better general error handling.
+        
+        - Upgrade script for pre 1.01 PostgreSQL database schema is now
+          included as well.
+        
+    - 1.01 :
+    
+        - The configuration file now accepts an option   
+          to choose the recipient(s) of the email messages :
+          
+            - DevNull means no one will receive them.
+            - User means only the user will receive them.
+            - Admin means only the admin will receive them.
+            - Both means the User and the Admin will receive them.
+            
+        - The configuration file now uses hard-coded default values
+          when an option is not set. See sample configuration file
+          for details.
+          
+        - Manual pages are included since 1.00, but I forgot to    
+          add this information to this file.
+          
+        - Redistribution terms for the official package have  
+          softened and are now fully GPL compatible : 
+          unrestricted modification is now allowed even for
+          the version number.
+          
+    - 1.00 :
+    
+        - edpykota now accepts a --noquota option. This
+          disable quota checking while still doing page
+          accounting. This is really useful for people
+          who don't want to limit their users but want
+          to know how much pages they print.
+          
+        - Some untested scripts were added to retrieve
+          the life time page counter of non-SNMP printers.
+          
+        - Every directory now has a specific README file.  
+        
+    - 0.99 :
+    
+        - Under some circumstances while the user wasn't allowed
+          to print, he didn't receive any email message. It is
+          now fixed.
+          
+        - When an user wasn't allowed to print, the quota for
+          the previous user wasn't updated. This is now fixed.
+          
+    - 0.98 :
+    
+        - Correctly handle the case where the printer is switched off.
+        
+        - Small bug wrt syslog fixed.
+        
+    - 0.97 :
+    
+        - edpykota accepts wildcards on its command line for users/groups too
+          if the --add option is not set, e.g. :
+          
+              $ edpykota --printer lp --softlimit 50 --hardlimit 100 "jer*"
+              
+        - If no user name is passed at all, then a default wildcard of "*"
+          which means apply the command on ALL users for this printer is used.
+          
+        - Small bug fixes.
+        
+    - 0.96 :
+
+        - Options requester, policy, admin, adminmail and gracedelay can now
+          be set either globally or per printer. The printer option has
+          priority if both are defined.
+
+        - More powerful configuration parser.
+        
+        - If all options are defined globally, there's no need to 
+          define a section for each printer in the configuration
+          file anymore. Just define a [global] section and it's ok.
+
+    - 0.95 :
+
+        - External requesters for printers finally added.
+
+        - Full internationalization (english and french are supported)
+ 
+        - More complete quota usage report
+
+        - CGI script to access to the quota usage report
+
+        - Several bugs fixed.
+
+
+    - 0.9 : 
+
+        - First public version
+
Index: pykota/tags/1.22/openoffice/Makefile.am
===================================================================
--- pykota/tags/1.22/openoffice/Makefile.am (revision 2146)
+++ pykota/tags/1.22/openoffice/Makefile.am (revision 2146)
@@ -0,0 +1,11 @@
+pykotadocoodir = $(datadir)/doc/pykota/openoffice
+pykotadocoo_DATA = 		\
+	gODBCConfig1.png	\
+	gODBCConfig2.png	\
+	ooo1.png			\
+	ooo2.png			\
+	README				\
+	samplereport.pdf	\
+	samplereport.sxc
+EXTRA_DIST = \
+	$(pykotadocoo_DATA)
Index: pykota/tags/1.22/openoffice/README
===================================================================
--- pykota/tags/1.22/openoffice/README (revision 2146)
+++ pykota/tags/1.22/openoffice/README (revision 2146)
@@ -0,0 +1,105 @@
+# $Id$
+
+PyKota - Print Quota for CUPS
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains some screenshots of direct access to PyKota's
+database through OpenOffice.org, as well as a sample report in both
+PDF and OpenOffice.org's sxc format.
+
+The sample report is a Jobs per User diagram, created from a
+simple SQL query to PyKota's database from within OpenOffice.org
+
+Since it works but I don't know OpenOffice enough to do something 
+really nice with it, I've added these screenshots and here's a small 
+howto below. For people interested in a more complete howto, please 
+see : http://kandalaya.org/download/oo-pgsql.html 
+
+PyKota + PostgreSQL + OpenOffice.org HowTO :
+--------------------------------------------
+
+        - Install and configure :
+        
+          godbcconfig
+          gtkodbcconfig0
+          iodbc
+          libiodbc2
+          odbc-postgresql
+          odbcinst1
+          unixodbc
+          
+        - Within gODBCConfig, add the PostgreSQL driver by 
+          filling the Configure Driver form :
+          
+                   Name : PostgreSQL
+            Description : PostgreSQL
+                 Driver : /usr/lib/postgresql/psqlodbc.so
+                  Setup : /usr/lib/odbc/libodbcpsqlS.so
+              FileUsage : 1
+        
+          See gODBCConfig1.png
+          
+          Then create a system DSN (only the more important fields
+          are listed below) :
+          
+                   DSN : PyKota
+           Description : PostgreSQL access to PyKota
+                Driver : PostgreSQL
+              Database : pykota
+            Servername : your.postgresql.server.here
+              Username : pykotauser
+              Password : pykotauser's password
+                  Port : 5432
+                  
+          See gODBCConfig2.png
+          
+        - Then in OpenOffice.org add a new data source, selecting
+          ODBC in the Database Type field. By clicking on the URL
+          field's continuation dots, the PyKota DSN should appear.
+          Just select it and you're done.
+          
+          See ooo1.png
+          
+        - You can now create your own queries to the PyKota database,
+          and create any report you want.
+          
+          See ooo2.png
+          
+        - When you've got something nice, please contribute it back  
+          so we can learn from your experience.
+        
+WARNING :        
+
+        The above procedure doesn't work if you use the OpenLDAP backend
+        to store PyKota's datas. A similar procedure is probably possible
+        but last time I checked, the LDAP attributes accessible from
+        OpenOffice.org were limited to what one usually finds in 
+        address books, unfortunately.
+
+Windows Users :
+
+        You'll find information on how to use the PostgreSQL ODBC
+        driver with OpenOffice.org for Windows at :
+
+        en: http://www.openoffice.org/nonav/issues/showattachment.cgi/3481/postgresql.sxw
+        de: http://de.openoffice.org/doc/howto/datenquelle/tech_pgsql.html
+        es: http://es.openoffice.org/files/documents/73/799/pgsql-win.sxw
+        
+        Thanks to Johannes L�ermann for this information.
+====================================================================
Index: pykota/tags/1.22/po/sv_SE/pykota.po
===================================================================
--- pykota/tags/1.22/po/sv_SE/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/sv_SE/pykota.po (revision 2228)
@@ -0,0 +1,1896 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota Swedish translation file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-01-15 12:00+0100\n"
+"Last-Translator: Jerome Alet <alet@librelogiciel.com>\n"
+"Language-Team: Swedish <alet@librelogiciel.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "Jobb inneh�er ingen data. Utskrift nekad"
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "Jobbsaldo p�rjas."
+
+msgid "Job accounting ends."
+msgstr "Jobbsaldo avslutas."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "Jobbstorlek satt till 0 f�tt utskriften nekades."
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Jobbstorlek : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Uppdaterar anv�are %s kvot p�krivare %s"
+
+msgid "Job added to history."
+msgstr "Jobb adderat till arkivet."
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+"Filnummer %s oregistrerat tv��er fr�utfr�ing av objekt, ignoreras."
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "SIGTERM s�es till bakgrundsprocess %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "CUPS bakgrundsprocess %s avbr�ov�at."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr ""
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Ogiltigt mjukgr�v�e %s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Ogiltigt h�gr�v�e %s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+"H�gr�v�et %i �mindre �mjukgr�v�et %i, v�ena kommer bytas."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Ogiltigt saldov�e %s. "
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Ogiltigt v�e %s p�ris."
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Ogiltigt v�e %s p�ariabeln limitby"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Om�gt att l�a till skrivare %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Ogiltigt skrivarnamn %s"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Det finns ingen matchande skrivare till %s"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "Du m�e skicka med anv�are- eller gruppnamn p�ommandoraden"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Prototypen f�bjektet %s hittas inte i PyKotasystemet"
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prototypen %s hittas inte i PyKotasystemet f�krivaren %s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr "Odefinerat h�gr�v�e satt till mjukgr�v�e (%s) p�rinter %s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "Odefinerat mjukgr�v�e satt till h�gr�v�e (%s) p�rinter %s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Ogiltig epostadress %s"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Ogiltigt gruppnamn %s"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Ogiltigt anv�arnamn %s"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Utskriftssaldo hittades inte f�bjekt %s p�rinter %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Gruppen %s hittades inte i PyKotasystemet."
+
+msgid "incompatible options, see help."
+msgstr "Of�liga val, se manualerna"
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "Mjukvarusaldo redan utf�under f�a passet. Ignoreras."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "H�varusaldo redan utf�under f�a passet. Ignoreras."
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "Titel"
+
+msgid "Filename"
+msgstr "Filnamn"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "Felaktig EnhetsURI : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Var god v�a medan pkhint analyserar utskriftssystemets konfiguration..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Ok� enhet %s f�krivare %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"L� till f�nde rader i filen /etc/pykota/pykota.conf :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# UPPM�KSAMMA : om mjukvarumetoden f�l� betyder det inte"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# att h�varumetoden inte skulle fungera, det betyder endast att PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr "# inte automatiskt kunde uppt�a vilken metod den skall anv�a."
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "Skrivare %s existerar redan, hoppar �."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "Skrivare %s existerar redan, kommer bli modifierad."
+
+msgid "in"
+msgstr "i"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr "Du m�e skicka med skrivargruppnamn p�ommandoraden"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Du m�e skicka med skrivarnamn p�ommandoraden"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Felaktig val f�duration' %s"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Felaktig val f�loop' %s"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Felaktig val f�sleep %s"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Felaktig val f�color' %s"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "Anv�are %s existerar inte i PyKotas databas"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "Sidor anv�a p�s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "PyKota enheter kvar : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Ditt utskriftssaldo : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Utskriftsstorlek : %i sidor"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Kostnad p�krivare %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "PyKota rapporter"
+
+msgid "Report"
+msgstr "Rapport"
+
+msgid "Printer"
+msgstr "Skrivare"
+
+msgid "User / Group names mask"
+msgstr "Anv�ar- / Gruppnamn maskering"
+
+msgid "Groups report"
+msgstr "Grupprapport"
+
+msgid "History"
+msgstr "Historia"
+
+msgid "Empty"
+msgstr "Tom"
+
+msgid "Action"
+msgstr "Aktion"
+
+msgid "User"
+msgstr "Anv�are"
+
+msgid "Hostname"
+msgstr "Datornamn"
+
+msgid "JobId"
+msgstr "JobbId"
+
+msgid "JobSize"
+msgstr "JobbStorlek"
+
+msgid "JobPrice"
+msgstr "JobbPris"
+
+msgid "Copies"
+msgstr "Kopior"
+
+msgid "JobBytes"
+msgstr "JobBytes"
+
+msgid "PageCounter"
+msgstr "SidR�are"
+
+msgid "Options"
+msgstr "Optioner"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "F��de sida"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Ej underst�redovisningsmetod %s"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Konfigurationsfil %s hittades inte."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Variabeln %s hittades inte i sektion 'global' i %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Variabeln %s hittades inte i sektion '%s' i %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "Variabeln 'logger' st�r bara v�en i %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Ogiltig redovisningsmetod %s f�rintern %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "Variabeln 'accounter' i sektion '%s' st�r bara v�en i %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "Till�ad option i sektion %s st�r bara v�en i %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Ogiltig policy %s f�krivare %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "Variabeln 'policy' i sektion '%s' st�r bara v�en i %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Ogiltig variabel 'mailto' %s f�krivare %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "Variabeln 'mailto' i sektion '%s' st�r bara v�en i %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Ogiltigt uppskovsv�e (grace delay) %s"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Ogiltigt fattigmansv�e (poor man's threshold) %s"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"Saldot p�itt utskriftskonto �l�.\n"
+"Snart kommer du inte kunna skriva ut l�re.\n"
+"V�igen kontakta din systemadministrat��tt l�problemet."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Du f�inte l�re skriva ut eftersom\n"
+"din utskriftkvot p�krivare %s �n�."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Du kommer snart inte f�kriva ut eftersom\n"
+"din utskriftskvot n�an �n� p�krivare %s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr ""
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Ej underst�loggningssystem %s"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Rapport f�s utskriftssaldo p�krivare %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Uppskov f�tskrifter: %i days"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Pris per utskrift: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Pris per sida: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "ok�/ok�"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Riktigt : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Summa : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Ej underst�rapportmetod %s"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Ej underst�metod %s f�tt lagra data"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "Kunde ej f�ontakt med SMTP server : %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Kunde inte s�a epost till %s, felmeddelande %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"V�igen kontakta din systemadministrat�\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Kunde inte matcha anv�are %s p�krivare %s, till�ar standardpolicyn (%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"Kunde inte hitta utskriftssaldo f�nv�are %s, till�ar standardpolicyn "
+"(%s) f�krivare %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "Utskriftssaldot ��trasserad f�rupp %s p�rinter %s"
+
+msgid "Print Quota"
+msgstr "Utskriftssaldo"
+
+msgid "Print Quota Exceeded"
+msgstr "Utskriftssaldo �trasserad"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Utskriftssaldot �l� f�rupp %s p�rinter %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "Utskriftssaldot ��trasserad f�nv�are %s p�krivare %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Utskriftssaldot �l� anv�are %s p�krivare %s"
+
+msgid "Print Quota Low"
+msgstr "Utskriftssaldo l�"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Utskriftssystem %s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr "Kunde ej f�r�a jobbets storlek med standard PDL analys : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "Mottog SIGTERM, utskrift %s avbr�"
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Skrivarens v�namn ej definerat, s�s till 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Utskriftsystem ok�, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Skrivare %s inte registrerad i PyKotasystemet, till�ar extern policy (%s) "
+"f�krivare %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Anv�are %s inte registrerad i Pykotasystemet, till�ar extern policy (%s) "
+"f�krivare %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"Anv�are %s har inget utskriftssaldo p�krivare %s i PyKotasystemet, "
+"till�arextern policy (%s) f�krivare %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"Extern policy %s f�krivare %s l�ade ett felmeddelande. Utskrift "
+"avbruten. V�igen kontrollera PyKotas konfigurationsfiler."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Skrivare %s �inte registrerad i PyKotasystemet, till�ar standardpolicy (%"
+"s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Anv�are %s �inte registrerad i PyKotasystemet, till�ar standardpolicy "
+"(%s) f�krivare %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"Anv�are %s har inget utskriftssaldo p�krivare %s i PyKotasystemet, "
+"till�ar standardpolicy (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"Skrivare %s fortfarande inte registrerad i PyKotasystemet, utskriften avbryts"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"Anv�are %s fortfarande inte registrerad i PyKotasystemet, utskriften p�
+"skrivare %s avbryts"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"Anv�are %s har fortfarande inget utskriftssaldo p�krivare %s i "
+"PyKotasystemet,utskriften avbryts"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr ""
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Ok� skrivaradress i HARDWARE(%s) f�krivare %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Startar H�DVARA(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "SIGTERM skickad till h�varumetod %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr ""
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Kunde inte h�a information fr�skrivare %s via HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr ""
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Startar MJUKVARA(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Kunde inte ber�a utskriftsstorlek med metod %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr "Problem vid inv�an f�jukvarumetod pid %s att avslutas : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "Mjukvarumetod %s avslutningskod �%s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"Summor kan vara felaktiga om vissa anv�are �medlemmar i flera grupper."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"S�sen %s existerar inte. M�g felkonfiguration. Var god kontrollera /"
+"etc/pykota/pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "S�ng efter %s(%s) fr�%s(scope=%s) gav inget svar."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Problem med att l�a till LDAP post (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Problem med att ta bort LDAP post (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Problem med att modifiera LDAP post (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"Kunde ej hitta en existerande 'objectClass' %s med posten %s=%s f�tt "
+"binda pykotaAccount objectClass"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"Kunde ej hitta existerande post f�tt binda pykotaGroup objectclass %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Grupp           anv�  mjuk    h�    saldo   uppskov       summa       "
+#~ "betalt"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Anv�are       anv�  mjuk    h�    saldo   uppskov       summa       "
+#~ "betalt"
Index: pykota/tags/1.22/po/pt/pykota.po
===================================================================
--- pykota/tags/1.22/po/pt/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/pt/pykota.po (revision 2228)
@@ -0,0 +1,1912 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-01-15 13:02+0100\n"
+"Last-Translator: Jerome Alet <alet@librelogiciel.com>\n"
+"Language-Team: Portugues <alet@librelogiciel.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "Tarefa n�cont�nenhum dado. Impress�negada"
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "In�o da contagem da tarefa."
+
+msgid "Job accounting ends."
+msgstr "Fim da contagem da tarefa."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "Tamanho da tarefa zerado porque a impress�foi negada"
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Tamanho da tarefa : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Atualizando cota do usu�o %s para a impressora %s"
+
+msgid "Job added to history."
+msgstr "Tarefa adicionada ao hist�o"
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+"Arquivo n� %s descadastrado duas vezes do objeto de consulta. Ignorado"
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "Foi enviado um SIGTERM para o backend %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "O backend CUPS morreu inesperadamente."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr ""
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Valor incorrecto para o limite m�mo %s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Valor incorrecto para limite m�mo %s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+"Limite m�mo %i �enor que o limite m�mo %i, os valores ser�invertidos."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Valor de saldo inv�do %s"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Valor de custo inv�do %s"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Valor inv�do para pol�ca de quota %s"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Foi imposs�l adicionar a impressora %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Nome de impressora %s inv�do"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "A impressora %s n�existe"
+
+msgid "You have to pass user or group names on the command line"
+msgstr ""
+"�Obrigat� a utiliza� de nomes de utilizador ou grupo na linha de "
+"comando"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Objecto do prot�o %s n�encontrado na base de dados."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prot�o %s n�encontrado na base de dados para a impressora %s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+"Limite m�mo indefinido, foi usado o valor do limite m�mo (%s) para a "
+"impressora %s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr ""
+"Limite m�mo indefinido, foi usado o valor do limite m�mo (%s) para a "
+"impressora %s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Endere�email inv�do"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "O nome do grupo %s �nv�do"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "O nome do utilizador %s �nv�do"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Cota n�encontrada para o objecto %s da impressora %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Grupo %s n�encontrado na base de dados."
+
+msgid "incompatible options, see help."
+msgstr "Op�s incompat�is, veja a ajuda."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "O contador l�o j�oi aplicado no primeiro passo. Ignorando."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "O contador f�co j�oi aplicado no primeiro passo. Ignorando"
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "T�lo"
+
+msgid "Filename"
+msgstr "Nome do arquivo"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "DeviceURI inv�do : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Por favor, aguarde enquanto pkhint analisa as configura�s de seu sistema "
+"de impress�.."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Dispositivo %s inv�do para a impressora %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"Pondo as seguintes linhas no arquivo /etc/pykota/pykota.conf : \n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# CUIDADO : se o contador l�o for sugerido, isto n�significa"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# que o contador l�o poder��funcionar. Isto significa somente que o "
+"Pykota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# n�foi capaz de detectar automaticamente o m�do de contagem f�ca a "
+"ser utilizado"
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "Impressora %s j�xiste. Ignorando."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "Impressora %s j�xiste. Ser�eita uma modifica�."
+
+msgid "in"
+msgstr "em"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+"voc�eve passar os nomes dos grupos de impressoras na linha de comando"
+
+msgid "You have to pass printer names on the command line"
+msgstr "�Obrigat� a utiliza� de nomes de impressora na linha de comando"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Op� %s inv�da para dura�"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Op� %s inv�da para loop (la�"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Op� %s inv�da para sleep (sono)"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Op� %s inv�da para color (cor)"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "Usu�o %s n�existe na base de dados do Pykota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "P�nas usadas em %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Unidades restantes do PyKota : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Saldo da sua conta : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Tamanho do pedido : %i p�nas"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Custo da impressora %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "Relat� do Pykota"
+
+msgid "Report"
+msgstr "Relat�"
+
+msgid "Printer"
+msgstr "Impressora"
+
+msgid "User / Group names mask"
+msgstr "M�ara de nomes para Usu�os / Grupos"
+
+msgid "Groups report"
+msgstr "Relat� de Grupos"
+
+msgid "History"
+msgstr "Hist�o"
+
+msgid "Empty"
+msgstr "Vazio"
+
+msgid "Action"
+msgstr "A�"
+
+msgid "User"
+msgstr "Usu�o"
+
+msgid "Hostname"
+msgstr "Nome do computador"
+
+msgid "JobId"
+msgstr "Id da Tarefa"
+
+msgid "JobSize"
+msgstr "Tamanho da Tarefa"
+
+msgid "JobPrice"
+msgstr "Pre�da Tarefa"
+
+msgid "Copies"
+msgstr "C�s"
+
+msgid "JobBytes"
+msgstr "Tamanho da Tarefa em Bytes"
+
+msgid "PageCounter"
+msgstr "Contador de p�nas"
+
+msgid "Options"
+msgstr "Op�s"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "P�na anterior"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Backend de cota %s n�suportado"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Ficheiro de configura� %s n�encontrado."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "A op� %s n�foi encontrada na sec� global de %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "A op� %s n�foi encontrada na sec� %s de %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "A op� logger s�porta valores em %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Contador de p�nas %s inv�do, para a impressora %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "A op� accounter na sec� %s s�porta valores em %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "Op� enforcement (refor� na se� %s s�porta valores em %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Pol�ca %s inv�da para a impressora %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "A op� policy na sec� %s s�porta valores em %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Op� mailto %s inv�da, para a impressora %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "a op� mailto na sec� %s s�porta valores em %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Per�o de toler�ia inv�do %s"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Valor 'poor man' %s inv�do"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"O seu saldo de impress��aixo.\n"
+"Em breve n�poder�mprimir.\n"
+"Por favor contacte o administrador do servi�de impress�de forma a "
+"resolver o problema."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Foi-lhe vedado o acesso ao servi�de impress�j�ue a\n"
+"sua quota de impress�foi excedida, na impressora %s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Em breve n�poder�mprimir j�ue a\n"
+"sua quota de impress�est�uase a ser atingida, na impressora %s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr ""
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Sistema de logging %s n�suportado"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Relat� de cota %s para a impressora %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Per�o de toler�ia : %i d�"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Pre�por trabalho: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Pre�por p�na: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "Desconhecido"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Real : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Total : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Backend reporter %s n�suportado"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Base de dados %s n�suportada"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "N�foi poss�l conectar-se ao servidor SMTP %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Imposs�l enviar email para  %s, erro %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Por favor contacte a seu administrador de sistemas:\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"N�foi poss�l encontrar o utilizador %s para a impressora %s, foi "
+"aplicada por omiss�a pol�ca (%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"N�foi poss�l encontrar o saldo da conta do utilizador %s, foi "
+"configurado por omiss�o valor (%s) para a impressora %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "Cota de impress�excedida para o grupo %s na impressora %s"
+
+msgid "Print Quota"
+msgstr "Cota de Impress�
+
+msgid "Print Quota Exceeded"
+msgstr "Cota de impress�excedida"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Cota de impress�baixa para o grupo %s na impresora %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "Cota de impress�excedida para o utilizador %s na impressora %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Cota de impress�baixa para o utilizador %s na impressora %s"
+
+msgid "Print Quota Low"
+msgstr "Cota de impress�baixa"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Sistema de impress�%s, argumentos=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"Imposs�l calcular tamanho da tarefa usando analisador gen�o de PDL : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "SIGTERM recebido, trabalho %s reiniciado."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr ""
+"Nome do servidor de impress�n�definido, foi configurado para 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Sistema de impress�desconhecido, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Impressora %s n�registada no sistema de impress� foi aplicada a pol�ca "
+"externa (%s) para a impressora %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Utilizador %s n�registado no sistema de impress� foi aplicada a pol�ca "
+"externa (%s) para a impressora %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"Utilizador %s n�tem cota na impressora %s, foi aplicada a pol�ca externa "
+"(%s) para a impressora %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"Pol�ca externa %s para a impressora %s devolveu um erro. Trabalho "
+"reiniciado. Por favor verifique os ficheiros de configura� do Pykota."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Impressora %s n�registada no sistema Pykota, foi aplicada por omiss�a "
+"pol�ca (%s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Utilizador %s n�registrado no sistema PyKota, foi aplicada por omiss�a "
+"pol�ca (%s)para a impressora %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"O utilizador %s n�tem cota na impressora %s, foi aplicada por omiss�a "
+"pol�ca (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"A Impressora %s n�se encontra registada no sistema, o pedido ser�ejeitado"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"O utilizador %s n�se encontra registado no sistema, o pedido para a "
+"impressora %sser�ejeitado"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"O utilizador %s ainda n�tem cota definida na impressora %s, o pedido ser�
+"rejeitado"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr ""
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Endere�inv�do em HARDWARE(%s) para a impressora %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Tentando identifica� f�ca(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "Sinal SIGTERM enviado para contador f�co %s (pid : %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr ""
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Foi imposs�l consultar a impressora %s via HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr ""
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Tentando identifica� l�a (%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Foi imposs�l calcular o tamanho do trabalho com o contador %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr "Problema ao aguardar encerramento do contador l�o de pid %s : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "C�o de erro para contador l�o %s : %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"O total pode n�ser exacto, caso os utilizadores sejam membros de v�os "
+"grupos."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"Base de busca %s parece n�existir, provavelmente por causa de m�
+"configura�.Por favor, verifique as configura�s do arquivo /etc/pykota/"
+"pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr ""
+"A pesquisa de %s(%s) usando o esc� %s(scope=%s) n�devolveu resultados."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Ocorreu um problema ao adicionar a entrada LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Ocorreu um problema ao apagar a entrada LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Ocorreu um problema ao modificar a entrada LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"Imposs�l encontrar uma entrada objectClass %s existente com %s=%s "
+"paraanexar objectClass pykotaAccount"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"Imposs�l encontrar uma entrada existente para anexar ao objectClass "
+"pykotaGroup %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Grupo           gasto   m�mo  m�mo  saldo   toler�ia    total       "
+#~ "pago"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Utilizador      gasto   m�mo  m�mo  saldo   toler�ia    total       "
+#~ "pago"
Index: pykota/tags/1.22/po/tr/pykota.po
===================================================================
--- pykota/tags/1.22/po/tr/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/tr/pykota.po (revision 2228)
@@ -0,0 +1,3004 @@
+# translation of pykota to Turkish
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+# Baris Cicek <baris@teamforce.name.tr>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pykota\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-11-17 21:34+0200\n"
+"Last-Translator: Baris Cicek <baris@teamforce.name.tr>\n"
+"Language-Team: Turkish <gnome-turk@gnome.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms:  nplurals=1; plural=0;\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Kullanıcı hesapları oluşumunu otomatikleştirme ve başlangıç hesap ayarları "
+"için araç.\n"
+"\n"
+"BU ARAÇ KULLANICILARINIZI SAYFA KOTASI İLE SINIRLAMAK İÇİN "
+"KULLANILMAMALIDIR !\n"
+"\n"
+"komut satırı kullanımı :\n"
+"\n"
+"  BU ARAÇ KOMUT SATIRINDAN KULLANILMAMALIDIR FAKAT SADECE   pykota.conf "
+"İÇİNDE external policy OLARAK KULLANILABİLİR\n"
+"  \n"
+"  autopykota { -i | --initbalance değer } \n"
+"\n"
+"seçenekler :\n"
+"\n"
+"  -v | --version       autopykota'nın sürüm numarasını yazar ve çıkar.\n"
+"  -h | --help          bu mesajı yazar ve çıkar.\n"
+"  \n"
+"  -i | --initbalance b Kullanıcının başlangıç hesabını b değeri olarak "
+"atar.\n"
+"                       Eğer kullanıcı zaten varsa, mevcut hesap değişmeden "
+"kalır.\n"
+"                       Eğer yok ise öntanımlı değer 0'dır.\n"
+"                       \n"
+"Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+"yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+"tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+"ve/ya da değiştirebilirsiniz.\n"
+"\n"
+"Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+"GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+"DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+"Kamu Lisansını okuyun.\n"
+"\n"
+"GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+"olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+"Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+"\n"
+"Lütfen hataları %s adresine mektupla bildirin"
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "İş hiçbir veri içermiyor. Yazma engellendi."
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "İş hesaplaması başlatılıyor."
+
+msgid "Job accounting ends."
+msgstr "İş hesaplaması bitiriliyor."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "İş boyutu 0 olarak ayarlandı çünkü yazma engellendi."
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "İş boyutu : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "%s kullanıcısının %s yazıcısındaki kotası güncelleniyor"
+
+msgid "Job added to history."
+msgstr "İş geçmişe eklendi."
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr "%s dosya numarası yoklama nesnesinde kayıtlı değil, yok sayılıyor."
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "SIGTERM %s ana arkaucuna gönderildi (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "CUPS arkaucu %s beklenmedik bir şekilde sonlandı."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr "-d | --data komut satırı seçeneği zorunludur, yardıma bakın."
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr "Bu komutu kullanmaya yetkili değilsiniz."
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Geçersiz esnek sınır değeri %s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Geçersiz son sınır değeri %s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+"Son sınır %i esnek sınır olan %i değerinden daha küçük, değerler yer "
+"değiştirildi."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Geçersiz blanço değeri %s"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Geçersiz ücret miktarı değeri %s"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Geçesiz limitby değeri %s"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "%s yazıcısı eklenemez"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Geçersiz yazıcı ismi %s"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "%s ile eşleşen bir yazıcı yok"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "Komut satırına kullanıcı ve grup isimlerini girmelisiniz"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Prototip nesnesi %s Kota Deposu içinde bulunamadı."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prototip %s, %s yazıcısı için Kota Deposu içinde bulunamadı."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr "Belirsiz son sınır esnek sınır (%s) olarak %s yazıcısında ayarlandı."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "Belirsiz esnek sınır son sınır (%s) olarak %s yazıcısında ayarlandı."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Geçersiz e-posta adresi %s"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Geçersiz grup adı %s"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Geçersiz kullanıcı adı %s"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "%s nesnesi için %s yazıcısında kota bulunamadı."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "%s grubu PyKota deposu içinde bulunamadı."
+
+msgid "incompatible options, see help."
+msgstr "geçersiz seçenekler, yardıma bakın."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "Yazılım hesaplaması zaten ilk geçişte yapıldı, yok sayılıyor."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "Donanım hesaplaması zaten ilk geçişte yapıldı, yok sayılıyor."
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "Tarih"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "Başlık"
+
+msgid "Filename"
+msgstr "DosyaAdı"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Her yazıcı için hangi hesaplama metodunun uygun olacaıı hakkında ipucu veren "
+"bir araç.\n"
+"\n"
+"komut satırı kullanımı :\n"
+"\n"
+"  pkhint [seçenekler] [yazıcı1 yazıcı2 yazıcı3 ... yazıcıN] <file.conf\n"
+"\n"
+"seçenekler :\n"
+"\n"
+"  -v | --version       pkhint'in sürüm numarasını gösterir ve çıkar.\n"
+"  -h | --help          Bu mesaji gösterir ve çıkar.\n"
+"  \n"
+"örnekler :                              \n"
+"\n"
+"  $ pkhint \"hp*\" yazici103 </etc/cups/printers.conf\n"
+"  \n"
+"  Parametrelerde belirtilen isim ile eşleşen yazıcılar için\n"
+"  hangi metodun uygun olduğunu sınamak için\n"
+"  yazma sisteminizi inceler.\n"
+"  \n"
+"  Eğer komut satırında hiçbir parametre belirtmezseniz, tüm\n"
+"  yazıcılar incelenecektir.\n"
+"  \n"
+"Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+"yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+"tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+"ve/ya da değiştirebilirsiniz.\n"
+"\n"
+"Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+"GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+"DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+"Kamu Lisansını okuyun.\n"
+"\n"
+"GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+"olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+"Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+"\n"
+"Lütfen hataları %s adresine mektupla bildirin"
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "Geçersiz DeviceURI : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Lütfen pkhint yazma sisteminizi yapılandırmasını incelerken bekleyiniz..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Bilinmeyen aygıt %s yazıcı %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"/etc/pykota/pykota.conf dosyanızın içine aşağıdaki satırları ekleyin :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# BILGI : eğer yazılım hesaplaması onerildiyse, bu "
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# donanım hesaplamasinin mümkün olmadigi anlamina gelmes, bu sadece pykota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# hangi donanim hesaplama metodunun kullanilacagini tespit edemedi demektir."
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "%s yazıcısı zaten mevcut, atlanıyor."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "%s yazıcısı zaten mevcut, bilgileri düzenlenecek."
+
+msgid "in"
+msgstr "içinde"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr "Komut satırına yazıcı grupları adlarını geçmelisiniz"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Komut satırına yazıcı adlarını geçmelisiniz"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"PyKota için bir OSD kota izleyicisi.\n"
+"\n"
+"komut satırı kullanımı :\n"
+"\n"
+"  pykosd [seçenekler]\n"
+"\n"
+"seçenekler :\n"
+"\n"
+"  -v | --version       pykosd'nin sürüm numarasını yazar ve çıkar.\n"
+"  -h | --help          Bu mesajı yazar ve çıkar.\n"
+"  \n"
+"  -c | --color #rrggbb onaltılı üçlü olarak arkaplan rengini ayarlar\n"
+"                       örneğin #FF0000 değeri 100%% kırmızı yapar.\n"
+"                       Öntanımlı 100%% yeşildir (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Saniye olarak gösterim süresini belirtir. \n"
+"                       Öntanımlı 3 saniyedir.\n"
+"                       \n"
+"  -f | --font f        Gösterim için kullanılacak yazıtipini "
+"ayarlar.                      \n"
+"                       Öntanımlı Python OSD kütüphanesinin öntanımlısıdır.\n"
+"  \n"
+"  -l | --loop n        Bilginin kaç kere gösterileceğini ayarlar.\n"
+"                       Öntanımlı 0'dır, sonsuza kadar döngü yapılacaıını "
+"belirtir.\n"
+"                       \n"
+"  -s | --sleep s       Saniye cinsinden iki gösterim arasında beklenecek\n"
+"                       süreyi ayarlar. Öntanımlı 180 saniyedir (3 dakika).\n"
+"                       \n"
+"  \n"
+"örnekler :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  pykosd'yi başlatır. Gösterim her 60 saniyede tazelenir,\n"
+"  ve her defasında 3 saniye sonunda (ön tanımlı) sona erer. Beş\n"
+"  tekrardan sonra çıkar.\n"
+"  \n"
+"Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+"yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+"tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+"ve/ya da değiştirebilirsiniz.\n"
+"\n"
+"Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+"GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+"DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+"Kamu Lisansını okuyun.\n"
+"\n"
+"GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+"olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+"Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+"\n"
+"Lütfen hataları %s adresine mektupla bildirin"
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Geçersiz süre seçeneği %s"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Geçersiz döngü seçeneği %s"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Geçersiz bekleme seçeneği %s"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Geçersiz renk seçeneği %s"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "%s kullanıcısı PyKota veritabanında bulunmuyor"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "%s üzerinde kullanılan sayfalar: %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Kalan PyKota birimi : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Kullanıcılara kota verir.\n"
+"\n"
+"komut satırı kullanımı :\n"
+"\n"
+"  pykotme  [seçenekler]  [dosyalar]\n"
+"seçenekler :\n"
+"\n"
+"  -v | --version       pykotme'nin sürüm numarasını gösterir ve çıkar.\n"
+"  -h | --help          Bu mesaji gösterir ve çıkar.\n"
+"  \n"
+"  -P | --printer p     Sadece bu yazıcı için kota verir. p maske\n"
+"                       karakterlerini birden fazla yazıcı belirtmek için\n"
+"                       içerebilir. Öntanımlı değer *'dır, tüm yazıcılar\n"
+"                       anlamına gelir.\n"
+"                       Virgül ile ayırarak birden fazla yazıcı ve maske \n"
+"                       kullanabilirsiniz.\n"
+"  \n"
+"örnekler :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  Mevcut kullanıcıya kota verir. Kota ücreti ve isin boyutu\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  Bu mevcut kullanıcının baskı bilgisini yazdırır. Bilgiler\n"
+"  apple ve hplaser yazıcılarına gönderilirse, standart girdiden\n"
+"  okunacak file1.ps için iş ücreti ve işin boyutunu gösterir.\n"
+"  \n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  Standart girdideki işin hakkında bilgi gösterir. Bilgi işin boyutunu\n"
+"  ücretini ve her yazıcı için ne kadar tutacağını içerir.\n"
+"  \n"
+"\n"
+"Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+"yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+"tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+"ve/ya da değiştirebilirsiniz.\n"
+"\n"
+"Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+"GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+"DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+"Kamu Lisansını okuyun.\n"
+"\n"
+"GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+"olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+"Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+"\n"
+"Lütfen hataları %s adresine mektupla bildirin"
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Hesap bilançonuz : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "İş boyutu : %i sayfa"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "%s yazıcısı için fiyat : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Yacıcı kotası raporları oluşturur.\n"
+"\n"
+"komut satırı kullanımı :\n"
+"\n"
+"  repykota [seçenekler] \n"
+"\n"
+"seçenekler :\n"
+"\n"
+"  -v | --version       repykota'nın sürüm numarasını gösterir ve çıkar.\n"
+"  -h | --help          Bu mesaji gösterir ve çıkar.\n"
+"  \n"
+"  -u | --users         Kullanıcı kotaları üzerine bir rapor oluşturur, bu \n"
+"                       öntanımlıdır.\n"
+"  \n"
+"  -g | --groups        Kullanıcılar yerine grup kotaları üzerine rapor "
+"oluşturur.\n"
+"  \n"
+"  -P | --printer p     Sadece bu yazıcı üzerindeki kotaları raporlar. p "
+"maske\n"
+"                       karakterleri kullanarak sadece bazı yazıcıları "
+"seçebilir.\n"
+"                       Öntanımlı değer *'dır, tüm yazıcılar\n"
+"                       anlamına gelir.\n"
+"                       Virgül ile ayırarak birden fazla isim ya da maske \n"
+"                       kullanabilirsiniz.\n"
+"  \n"
+"örnekler :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  Bu lp yazıcısını kullanan tüm kullanıcıların kota durumlarını bildirir.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  Bu tüm yacıcıların kullanıcıların kota durumlarını bildirir.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  Bu adı \"laser\" ile başlayan ya da \"pson\" ile biten tüm yazıcılar\n"
+"  üzerinde adı \"jo\" ile başlayan ve adı jerome olan kullanıcıların kota\n"
+"  durumlarını bildirir.\n"
+"  \n"
+"  Eğer PyKota yöneticisi olmayan bir kullanıcı tarafından başlatılırsa,\n"
+"  kullanıcı ve grup adlarını belirten parametreler yok sayılır, sadece "
+"mevcut\n"
+"  kullanıcı ve grup hakkında bildirim yapılır.\n"
+"\n"
+"Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+"yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+"tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+"ve/ya da değiştirebilirsiniz.\n"
+"\n"
+"Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+"GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+"DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+"Kamu Lisansını okuyun.\n"
+"\n"
+"GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+"olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+"Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+"\n"
+"Lütfen hataları %s adresine mektupla bildirin"
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Yazma kotası üzerinden kullanıcılara mektup gönderir.\n"
+"\n"
+"komut satırı kullanımı :\n"
+"\n"
+"  warnpykota  [seçenekler]  [adlar]\n"
+"\n"
+"seçenekler :\n"
+"\n"
+"  -v | --version       warnpykota'nın sürüm numarasını yaza ve çıkar.\n"
+"  -h | --help          Bu mesajı yazar ve çıkar.\n"
+"  \n"
+"  -u | --users         Yazma kotası üzerindeki kullanıcıları uyarır, bu \n"
+"                       öntanımlıdır .\n"
+"  \n"
+"  -g | --groups        Grupları yazma kotasının üzerinde olan kullanıcıları "
+"uyarır.\n"
+"  \n"
+"  -P | --printer p     Sadece bu yazıcıyı denetler. p birkaç yazıcı\n"
+"                       seçmek için maske karakterlerini kullanabilir.\n"
+"                       Öntanımlı deıer *'dır, tüm yazıcılar anlamına \n"
+"                       gelir.\n"
+"                       Birden fazla ismi ya da maskeyi kullanabilirsiniz, \n"
+"                       onları virgül ile ayırarak kullanın.\n"
+"  \n"
+"örnekler :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  Bu lp yazıcısı üzerinde yazma kotalarını geçmiş olan tüm kullanıcıları\n"
+"  uyarır.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  Bu herhangi bir yazıcı üzerinde yazma kotasını geçmiş olan kullanıcıları\n"
+"  uyarır.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  Bu adı \"dev\" ile başlayan ve adı \"laserjer\" ile başlayan herhangi bir "
+"yazıcı\n"
+"  üzerinde yazma kotasını geçmiş tüm kullanıcıları uyarır\n"
+"  \n"
+"  \n"
+"  Eğer PyKota yöneticisi olmayan birisi tarafından başlatılırsa, kullanıcı "
+"ve\n"
+"  grup adlarını belirten isimler yoksayılır, ve sadece mevcut kullanıcı/"
+"grup\n"
+"  belirtilir.\n"
+"\n"
+"Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+"yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+"tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+"ve/ya da değiştirebilirsiniz.\n"
+"\n"
+"Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+"GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+"DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+"Kamu Lisansını okuyun.\n"
+"\n"
+"GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+"olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+"Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+"\n"
+"Lütfen hataları %s adresine mektupla bildirin"
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr "Lütfen yukarıdaki düğmeye tıklayın"
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "PyKota Raporları"
+
+msgid "Report"
+msgstr "Rapor"
+
+msgid "Printer"
+msgstr "Yazıcı"
+
+msgid "User / Group names mask"
+msgstr "Kullanıcı / Grup isimleri maskesi"
+
+msgid "Groups report"
+msgstr "Grup raporu"
+
+msgid "History"
+msgstr "Geçmiş"
+
+msgid "Empty"
+msgstr "Boş"
+
+msgid "Action"
+msgstr "Eylem"
+
+msgid "User"
+msgstr "Kullanıcı"
+
+msgid "Hostname"
+msgstr "MakineAdı"
+
+msgid "JobId"
+msgstr "İşBelirteci"
+
+msgid "JobSize"
+msgstr "İşBoyutu"
+
+msgid "JobPrice"
+msgstr "İşÜcreti"
+
+msgid "Copies"
+msgstr "Nüshalar"
+
+msgid "JobBytes"
+msgstr "İşBaytı"
+
+msgid "PageCounter"
+msgstr "SayfaSayacı"
+
+msgid "Options"
+msgstr "Seçenekler"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "Önceki sayfa"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Desteklenmeyen muhasebeci arkaucu %s"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Yapılandırma dosyası %s bulunamadı."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "%s seçeneği %s içinde global bölümünde bulunamadı"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "%1s seçeneği %3s içinde %2s bölümünde bulunamadı"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "logger seçeneği sadece %s içindeki değerleri kabul ediyor"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "%2s yazıcısı için geçersiz muhasebeci %1s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr ""
+"%s bölümündeki accounter seçeneği sadece %s içindeki değerleri kabul ediyor"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr ""
+"%s bölümündeki enforcement seçeneği sadece %s içindeki değerleri kabul ediyor"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+"%s bölümündeki onaccountererror seçeneği sadece %s içindeki değerleri kabul "
+"ediyor"
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "%2s yazıcısı için geçersiz kural %1s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr ""
+"%s bölümündeki policy seçeneği sadece %s içindeki değerleri kabul ediyor"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "%2s yazıcısı için geçersiz seçenek mailto %1s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr ""
+"%s bölümündeki mailto seçeneği sadece %s içindeki değerleri kabul ediyor"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Geçersiz kota esneklik süresi %s"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Geçersiz hesap blançosu eşiği %s"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"Yazma Kotası hesap bilançonuz Düşük.\n"
+"Yakında yazamayacaksınız.\n"
+"Lütfen Yazma Kotası Yöneticisine sorunu çözmesi için ulaşın."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"%s yazıcısında Yazma Kotanız dolduğu için\n"
+"artık yazmanıza izin verilmiyor."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"%s yazıcısında Yazma Kotanız çok az kaldığı için\n"
+"yakında yazamayacaksınız."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+"--data komut satırı seçeneği için geçersiz düzenleyici [%s], yardıma bakın."
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+"--format komut satırı seçeneği için geçersiz düzenleyici [%s], yardıma bakın."
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr "jaxml modülü bulunmadığı için XML çıktısı kapalı."
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "PyKota veri yazıcısı başarısız : G/Ç hatası"
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Desteklenmeyen günlükleme alt sistemi %s"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "%2s yazıcısı üzerineki %1s kotası için rapor"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Sayfa kota esneklik süresi: %i gün"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "İş başına ücret: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Sayfa başına ücret : %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "bilinmeyen"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Gerçek : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Toplam : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Desteklenmeyen raporcu arkaucu %s"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Desteklenmeyen kota depo arkaucu %s"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "SMTP sunucusuna bağlantı mümkün değil : %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "%s adresine mektup gönderilmesi mümkün değil, hata %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Lütfen sistem yöneticinizle görüşün :\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"%2s yazıcısı üzerindeki %1s kullanıcısı eşlenemedi, öntanımlı kural "
+"uygulanıyor (%3s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"%s kullanıcısının hesap bilançosu bulunamadı, öntanımlı kural (%s) %s "
+"yazıcısı için uygulanıyor"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "%2s yazıcısı üzerindeki %1s grubu Yazma Kotasını aştı"
+
+msgid "Print Quota"
+msgstr "Yazma Kotası"
+
+msgid "Print Quota Exceeded"
+msgstr "Yazma Kotası Aşıldı"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "%2s yazıcısı üzerindeki %1s grubu için Yazma Kotası düşük"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "%2s yazıcısı üzerindeki %1s kullanıcısı Yazma Kotasını aştı"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "%2s yazıcısı üzerindeki %1s kullanıcısı için Yazma Kotası düşük"
+
+msgid "Print Quota Low"
+msgstr "Yazma Kotası Düşük"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Yazma sistemi %s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr "Genel PDL inceleyicisi ile işin boyutu hesaplanamadı : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "SIGTERM alındı, %s işi iptal edildi."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Yazıcı makine adı tanımsız, 'localhost' olarak atandı"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Yazma altsistemi bilinmiyor, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"%s yazıcısı PyKota sistemine kayıtlı değil, harici kurallar (%s) %s yazıcısı "
+"için uygulanıyor"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"%s kullanıcısı PyKota sistemine kayıtlı değil, harici kurallar (%s) %s "
+"yazıcısı için uygulanıyor"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"%2s yazıcısı üzerindeki %1s kullanıcısı  PyKota sisteminde kota sahibi "
+"değil, harici kurallar (%3s) %4s yazıcısı için uygulanıyor"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"%2s yazıcısı için %1s harici kuralı bir hata oluşturdu. İş reddedildi. "
+"Lütfen PyKota yapılandırma dosyalarını kontrol edin."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"%s yazıcısı PyKota sistemine kayıtlı değil, öntanımlı kurallar (%s) "
+"uygulanıyor"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"%s kullanıcısı PyKota sistemine kayıtlı değil, öntanımlı kurallar (%s) %s "
+"yazıcısı için uygulanıyor"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"%2s yazıcısı üzerindeki %1s kullanıcısı  PyKota sisteminde kota sahibi "
+"değil, öntanımlı kurallar (%3s) uygulanıyor"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr "%s yazıcısı PyKota sisteminde kayıtlı değil, iş reddedilecek"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"%s kullanıcısı PyKota sisteminde kayıtlı değil, %s yazıcısındaki iş "
+"reddedilecek"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"%s kullanıcısı %s yazıcısında PyKota sistemi içindek kotaya sahip değil, iş "
+"reddedilecek"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr "%s yazıcısının dahili sayfa sayacı okunurken hata oluştu."
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr "%s yazıcısının sayfa sayacı onun yerine veritabanından alınıyor."
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+"%s yazıcısının dahili sayfa sayacı yazmadan önce ya da sonra alınamadı."
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "%s yazıcısı için iş boyutu 1 sayfa olmak zorunda."
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr "%s yazıcısı için veritabanında daha öncesinde hiç iş yok."
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr "%s yazıcısının dahili sayfa sayacında tutarsız değerler."
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "%2s yazıcısı için HARDWARE(%1s) içinde bilinmeyen yazıcı adresi"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "HARDWARE(%s) başlatılıyor..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "%s donanım hesaplayıcısına (pid: %s) SIGTERM gönderildi"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr "Hesaplayıcının çıktısında satır [%s] geçildi. Tekrar deneniyor..."
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "Donanım hesaplayıcısı %s çıkış kodu %s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "%s yazıcısı HARDWARE(%s) ile sorgulanamıyor"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "%s:%s bağlantısı yapılırken sorun : %s"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "%s:%s PJL sorguları gönderilirken sorun : %s"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "%s yazıcısının bekleme durumu ya da sabit olması olması bekleniyor..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"PJL sorgulama aşaması kesildi. %2s yazıcısındaki dahili sayfa sayacı (%1s) "
+"için görülen en son değer kullanılıyor."
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "%s yazıcısı üzerinde SNMP sorguları yapılırken ağ hatası: %s"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+"%s yazıcısı üzerinde SNMP sorguları yapılırken sorunlarla karşılaşıldı: %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"SNMP sorgulama aşaması kesildi. %2s yazıcısındaki dahili sayfa sayacı (%1s) "
+"için görülen en son değer kullanılıyor."
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "SOFTWARE(%s) başlatılıyor..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "%s hesaplayıcısı ile iş boytu hesaplanamıyor"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr "Yazılım hesaplayıcısı pid %s çıkışı içlin beklenirken sorun : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "Yazılım hesalayıcısı %s çıkış kodu %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"Eğer kimi kullanıcılar birden fazla grup üyesiyseler toplamlar doğru "
+"olmayabilir."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"%s arama tabanı bulunmuyor. Olası bir hatalı yapılandırma. Lütfen /etc/"
+"pykota/pykota.conf dosyasını kontrol edin : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "%s (%s) için yapılan arama %s (kapsam=%s) konumundan cevap alamadı."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "LDAP girişi (%s, %s) ekleme sorunu"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "LDAP girişi (%s) silme sorunu"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "LDAP girişi (%s, %s) düzenleme sorunu"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+"%s kullanıcısı için pykotaAccountBalance nesnesi bulunamadı. LDAP "
+"girişlerini kendiniz mi yaptınız?"
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"pykotaAccount objectClass'ına eklemek için %2s=%3s ile mevcut olan "
+"objectClass %s girişi bulunamadı"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"pykotaGroup %s objectclass'ına eklenekcek mevcut olan bir giriş bulunamadı"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Internal SNMP accounting asked, but Python-SNMP is not available. Please "
+#~ "download it from http://pysnmp.sourceforge.net"
+#~ msgstr ""
+#~ "Dahili SNMP hesaplaması soruldu, ancak Python-SNMP mevcut değil. Lütfen "
+#~ "onu http://pysnmp.sourceforge.net adresinden indirin"
+
+#~ msgid ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Dumps PyKota database's content.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  dumpykota [options] \n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints dumpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+#~ "                       \n"
+#~ "                         - history : dumps the jobs history.\n"
+#~ "                         - users : dumps users.\n"
+#~ "                         - groups : dumps user groups.\n"
+#~ "                         - printers : dump printers.\n"
+#~ "                         - upquotas : dump user quotas.\n"
+#~ "                         - gpquotas : dump user groups quotas.\n"
+#~ "                         - payments : dumps user payments.\n"
+#~ "                         - pmembers : dumps printer groups members.\n"
+#~ "                         - umembers : dumps user groups members.\n"
+#~ "                         \n"
+#~ "                       NB : the -d | --data command line option   \n"
+#~ "                       is MANDATORY.\n"
+#~ "  \n"
+#~ "  -f | --format fmt    Dumps datas in the 'fmt' format. When not "
+#~ "specified,\n"
+#~ "                       the format is to dump datas in the csv format "
+#~ "(comma\n"
+#~ "                       separated values). All data dumped is between "
+#~ "double\n"
+#~ "                       quotes. Allowed formats are :\n"
+#~ "                       \n"
+#~ "                         - csv : separate datas with commas\n"
+#~ "                         - ssv : separate datas with semicolons\n"
+#~ "                         - tsv : separate datas with tabs\n"
+#~ "                         - xml : dump data as XML\n"
+#~ "                         \n"
+#~ "  -o | --output fname  All datas will be dumped to the file instead of\n"
+#~ "                       to the standard output. The special '-' filename\n"
+#~ "                       is the default value and means stdout.\n"
+#~ "                       WARNING : existing files are truncated !\n"
+#~ "  \n"
+#~ "Examples :\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "  \n"
+#~ "  This dumps the history in a comma separated values file, for possible\n"
+#~ "  use in a spreadsheet.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "  \n"
+#~ "  Dumps all users datas to the users.xml file.\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "PyKota veritabanının içeriğini gösterir.\n"
+#~ "\n"
+#~ "komut satırı kullanımı :\n"
+#~ "\n"
+#~ "  dumpykota [seçenekler] \n"
+#~ "\n"
+#~ "seçenekler :\n"
+#~ "\n"
+#~ "  -v | --version       dumpykota'nın sürüm numarasını gösterir ve çıkar.\n"
+#~ "  -h | --help          Bu mesaji gösterir ve çıkar.\n"
+#~ "  \n"
+#~ "  -d | --data type     'type' verilerini gösterir. Geçerli türler :\n"
+#~ "                       \n"
+#~ "                         - history : iş geçmişlerini gösterir.\n"
+#~ "                         - users : kullanıcıları gösterir.\n"
+#~ "                         - groups : kullanıcı gruplarını gösterir.\n"
+#~ "                         - printers : yazıcıları gösterir.\n"
+#~ "                         - upquotas : kullanıcı kotalarını gösterir.\n"
+#~ "                         - gpquotas : kullanıcı grup kotalarını "
+#~ "gösterir.\n"
+#~ "                         - payments : kullanıcı ödemelerini gösterir.\n"
+#~ "                         - pmembers : yazıcı grup üyelerini gösterir.\n"
+#~ "                         - umembers : kullanıcı grup üyelerini gösterir.\n"
+#~ "                         \n"
+#~ "                       NB :-d | --data komut satırı seçeneği  \n"
+#~ "                       ZORUNLU'dur.\n"
+#~ "  \n"
+#~ "  \n"
+#~ "  -f | --format fmt    Verileri 'fmt' biçinde gösterir. "
+#~ "Belirtilmediğinde,\n"
+#~ "                       veri csv biçiminde (virgül ile ayırılmış değerler) "
+#~ "gösterilir.\n"
+#~ "                       Tüm veriler çift tırnak içinde gösterirlir. \n"
+#~ "                       Geçerli biçimler :\n"
+#~ "                       \n"
+#~ "                         - csv : verileri virgül ile ayırır\n"
+#~ "                         - ssv : verileri iki nokta ile ayırır\n"
+#~ "                         - tsv : verileri sekme ile ayırır\n"
+#~ "                         - xml : verileri XML olarak aktarır\n"
+#~ "                         \n"
+#~ "  -o | --output dismi  Tüm veriler standart çıktı yerine bir dosya\n"
+#~ "                       içine yazdırılır. Özel '-' dosyas ismi "
+#~ "öntanımlıdır\n"
+#~ "                       ve stdout anlamına gelir.\n"
+#~ "                       UYARI : mevcut dosyaların içeriği silinecektir !\n"
+#~ "  \n"
+#~ "Örnekler :\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "  \n"
+#~ "  Bu hücre programları için kullanılmak üzere verileri virgül ile "
+#~ "ayırılmış değerler\n"
+#~ "  olarak bir dosyaya yazdırır.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "  \n"
+#~ "  Tüm kullanıcıları users.xml dosyasına yazdırır.\n"
+#~ "  \n"
+#~ "Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+#~ "yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+#~ "tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+#~ "ve/ya da değiştirebilirsiniz.\n"
+#~ "\n"
+#~ "Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+#~ "GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+#~ "DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+#~ "Kamu Lisansını okuyun.\n"
+#~ "\n"
+#~ "GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+#~ "olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+#~ "Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+#~ "\n"
+#~ "Lütfen hataları %s adresine mektupla bildirin"
+
+#~ msgid "Too many arguments, see help."
+#~ msgstr "Çok fazla parametre, yardıma bakın."
+
+#~ msgid ""
+#~ "edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "A Print Quota editor for PyKota.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  edpykota [options] user1 user2 ... userN\n"
+#~ "  \n"
+#~ "  edpykota [options] group1 group2 ... groupN\n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints edpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -a | --add           Adds users and/or printers if they don't \n"
+#~ "                       exist on the Quota Storage Server.\n"
+#~ "                       \n"
+#~ "  -d | --delete        Deletes users/groups from the quota storage.\n"
+#~ "                       Printers are never deleted.\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+#~ "                       for a particular printer. Job price is optional.\n"
+#~ "                       If both are to be set, separate them with a "
+#~ "comma.\n"
+#~ "                       Floating point values are allowed.\n"
+#~ "  \n"
+#~ "  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+#~ "                              listed, separated by commas. The groups\n"
+#~ "                              must already exist in the Quota Storage.\n"
+#~ "  \n"
+#~ "  -u | --users         Edit users print quotas, this is the default.\n"
+#~ "  \n"
+#~ "  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+#~ "                       use wildcards characters to select only\n"
+#~ "                       some printers. The default value is *, meaning\n"
+#~ "                       all printers. \n"
+#~ "                       You can specify several names or wildcards, \n"
+#~ "                       by separating them with commas.\n"
+#~ "  \n"
+#~ "  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+#~ "                       pg1, pg2, etc... which must already exist.\n"
+#~ "                       A printer group is just like a normal printer,\n"
+#~ "                       only that it is usually unknown from the printing\n"
+#~ "                       system. Create printer groups exactly the same\n"
+#~ "                       way that you create printers, then add other \n"
+#~ "                       printers to them with this option.\n"
+#~ "                       Accounting is done on a printer and on all\n"
+#~ "                       the printer groups it belongs to, quota checking\n"
+#~ "                       is done on a printer and on all the printer "
+#~ "groups\n"
+#~ "                       it belongs to.\n"
+#~ "  \n"
+#~ "  -g | --groups        Edit users groups print quotas instead of users.\n"
+#~ "                          \n"
+#~ "  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+#~ "                       print quotas\n"
+#~ "                       \n"
+#~ "  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+#~ "  \n"
+#~ "  -r | --reset         Resets the actual page counter for the user\n"
+#~ "                       or group to zero on the specified printers. \n"
+#~ "                       The life time page counter is kept unchanged.\n"
+#~ "                       \n"
+#~ "  -R | --hardreset     Resets the actual and life time page counters\n"
+#~ "                       for the user or group to zero on the specified \n"
+#~ "                       printers. \n"
+#~ "                       \n"
+#~ "  -l | --limitby l     Choose if the user/group is limited in "
+#~ "printing                     \n"
+#~ "                       by its account balance or by its page quota.\n"
+#~ "                       The default value is 'quota'. Allowed values\n"
+#~ "                       are 'quota' 'balance' 'quota-then-balance' and\n"
+#~ "                       'balance-then-quota'.\n"
+#~ "                       WARNING : quota-then-balance and balance-then-"
+#~ "quota\n"
+#~ "                       are not yet implemented.\n"
+#~ "                       \n"
+#~ "  -b | --balance b     Sets the user's account balance to "
+#~ "b.                     \n"
+#~ "                       Account balance may be increase or decreased\n"
+#~ "                       if b is prefixed with + or -.\n"
+#~ "                       WARNING : when decreasing account balance,\n"
+#~ "                       the total paid so far by the user is decreased\n"
+#~ "                       too.\n"
+#~ "                       Groups don't have a real balance, but the\n"
+#~ "                       sum of their users' account balance.\n"
+#~ "                       \n"
+#~ "  -S | --softlimit sl  Sets the quota soft limit to sl "
+#~ "pages.                       \n"
+#~ "  \n"
+#~ "  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+#~ "  \n"
+#~ "  user1 through userN and group1 through groupN can use wildcards\n"
+#~ "  if the --add option is not set.\n"
+#~ "  \n"
+#~ "examples :                              \n"
+#~ "\n"
+#~ "  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+#~ "  \n"
+#~ "  This will add users john, paul, george and ringo to the quota\n"
+#~ "  database, and set their print quotas to the same values than user \n"
+#~ "  jerome. User jerome must already exist.\n"
+#~ "  User ringo's email address will also be set to 'ringo@example.com'\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  This will set jerome's print quota on the lp printer to a soft limit\n"
+#~ "  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+#~ "  printer lp doesn't exist on the Quota Storage Server then nothing is "
+#~ "done.\n"
+#~ "\n"
+#~ "  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  Same as above, but if either user jerome or printer lp doesn't exist \n"
+#~ "  on the Quota Storage Server they are automatically added. Also\n"
+#~ "  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+#~ "  already exist in the Quota Storage.\n"
+#~ "            \n"
+#~ "  $ edpykota -g -S 500 -H 550 financial support            \n"
+#~ "  \n"
+#~ "  This will set print quota soft limit to 500 pages and hard limit\n"
+#~ "  to 550 pages for groups financial and support on all printers.\n"
+#~ "  \n"
+#~ "  $ edpykota --reset jerome \"jo*\"\n"
+#~ "  \n"
+#~ "  This will reset jerome's page counter to zero on all printers, as\n"
+#~ "  well as every user whose name begins with 'jo'.\n"
+#~ "  Their life time page counter on each printer will be kept unchanged.\n"
+#~ "  You can also reset the life time page counters by using the\n"
+#~ "  --hardreset | -R command line option.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hpcolor --noquota jerome\n"
+#~ "  \n"
+#~ "  This will tell PyKota to not limit jerome when printing on the \n"
+#~ "  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+#~ "  accounting of the pages he prints will still be kept.\n"
+#~ "  Print Quotas for jerome on other printers are unchanged.\n"
+#~ "  \n"
+#~ "  $ edpykota --limitby balance jerome\n"
+#~ "  \n"
+#~ "  This will tell PyKota to limit jerome by his account's balance\n"
+#~ "  when printing.\n"
+#~ "  \n"
+#~ "  $ edpykota --balance +10.0 jerome\n"
+#~ "  \n"
+#~ "  This will increase jerome's account balance by 10.0 (in your\n"
+#~ "  own currency). You can decrease the account balance with a\n"
+#~ "  dash prefix, and set it to a fixed amount with no prefix.\n"
+#~ "  \n"
+#~ "  $ edpykota --delete jerome rachel\n"
+#~ "  \n"
+#~ "  This will completely delete jerome and rachel from the Quota Storage\n"
+#~ "  database. All their quotas and jobs will be deleted too.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp --charge 0.1\n"
+#~ "  \n"
+#~ "  This will set the page price for printer lp to 0.1. Job price\n"
+#~ "  will not be changed.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+#~ "  \n"
+#~ "  This will put printers hplj1 and hplj2 in printers groups Laser and "
+#~ "HP.\n"
+#~ "  When printing either on hplj1 or hplj2, print quota will also be \n"
+#~ "  checked and accounted for on virtual printers Laser and HP.\n"
+#~ "\n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "PyKota için Yazıcı Kotası düzenleyicisi.\n"
+#~ "\n"
+#~ "komut satırı kullanmı :\n"
+#~ "\n"
+#~ "  edpykota [seçenekler] kullanıcı1 kullanıcı2 ... kullanıcıN\n"
+#~ "  \n"
+#~ "  edpykota [seçenekler] grup1 grup2 ... grupN\n"
+#~ "seçenkeler :\n"
+#~ "\n"
+#~ "  -v | --version       edpykota'nın sürüm numarasını yazar ve çıkar.\n"
+#~ "  -h | --help          Bu mesajı yazar ve çıkar.\n"
+#~ "  \n"
+#~ "  -a | --add           Kota Depo Sunucusu'nda bulunmuyorsa \n"
+#~ "                       kullanıcılar ve/veya yazıcılar ekler.\n"
+#~ "                       \n"
+#~ "  -d | --delete        Kota deposundan kullanıcılar/grupları siler.\n"
+#~ "                       Yazıcılar asla silinmez.\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  Belirli bir yazıcı için sayfa başına fiyat ya da "
+#~ "iş\n"
+#~ "                       başına fiyat atar. İş başına fiyat tercihe "
+#~ "baılıdır.\n"
+#~ "                       Eıer ikisi de belirtilecekse, onları virgül ile "
+#~ "ayırın.\n"
+#~ "                       Ondalık sayı değerleri geçerlidir.\n"
+#~ "  \n"
+#~ "  -i | --ingroups g1[,g2...]  Kullanıcıları virgül ile ayırılmış "
+#~ "listelenen\n"
+#~ "                              tüm gruplara koyar. Gruplar Kota "
+#~ "Deposu'nda\n"
+#~ "                              önceden bulunmak zorundadır.\n"
+#~ "  \n"
+#~ "  -u | --users         Kullanıcıların yazma kotalarını düzenler, bu "
+#~ "öntanımlıdır.\n"
+#~ "  \n"
+#~ "  -P | --printer y     Sadece y yazıcısı üzerindeki kotaları düzenler.\n"
+#~ "                       Y sadece bazı yazıcıları seçmek için maske "
+#~ "karakteri\n"
+#~ "                       kullanabilir. Öntanımlı değer *'dır, tüm\n"
+#~ "                       yazıcılar anlamına gelir. \n"
+#~ "                       Virgül ile ayırarak farklı isimler ve maskeler, \n"
+#~ "                       kullanabilirsiniz.\n"
+#~ "  \n"
+#~ "  -G | --pgroups pg1[,pg2...] Yazıcıları pg1, pg2, vb gibi zaten mevcut\n"
+#~ "                       olan yazıcı gruplarına ekler. Yazıcı grubu normal "
+#~ "yazıcı\n"
+#~ "                       gibidir sadece yazma sistemi tarafından bilinmez.\n"
+#~ "                       Yazıcı gruplarını aynen yazıcı oluşturur gibi "
+#~ "oluşturun\n"
+#~ "                       ve onlara diğer yazıcıları bu komutu kullanarak "
+#~ "ekleyin.\n"
+#~ "                       Hesaplamalar ve kota kontrolü bir yazıcı ve onun "
+#~ "ait\n"
+#~ "                       olduğu tüm yazıcı grupları üzerinde yapılır.\n"
+#~ "                       \n"
+#~ "                       \n"
+#~ "                       \n"
+#~ "  \n"
+#~ "  -g | --groups        Kullanıcılar yerine grupların yazma kotasını "
+#~ "düzenler.\n"
+#~ "                          \n"
+#~ "  -p | --prototype k|g Yazma kotası ayarlamak için k kullanıcısı ya da\n"
+#~ "                       g grubunu prototip olarak kullanır\n"
+#~ "                       \n"
+#~ "  -n | --noquota       Kota ayarlamaz sadece hesap yapar.\n"
+#~ "  \n"
+#~ "  -r | --reset         Belirtilen yazıcılar için güncel sayfa sayacını\n"
+#~ "                       kullanıcı ya da grup için sıfır yapar. \n"
+#~ "                       Tüm zaman sayfa sayacı değişmeden kalır.\n"
+#~ "                       \n"
+#~ "  -R | --hardreset     Belirtilen yazıcılar için güncel ve tüm zaman\n"
+#~ "                        sayfa sayacını kullanıcı ya da grup için sıfır "
+#~ "yapar. \n"
+#~ "                       Tüm zaman sayfa sayacı değişmeden kalır.\n"
+#~ "                       \n"
+#~ "  -l | --limitby l     grubun/kullanıcının hesap blançosu ya da sayfa "
+#~ "kotası \n"
+#~ "                       ile yazma sınırlamasını seçer.\n"
+#~ "                       \n"
+#~ "                       Öntanımlı değer 'kotadır'. Geçerli değerler\n"
+#~ "                       'quota' 'balance' 'quota-then-balance' ve\n"
+#~ "                       'balance-then-quota'dır.\n"
+#~ "                       UYARI : quota-then-balance ve balance-then-quota\n"
+#~ "                       henüz tamamlanmamıştır.\n"
+#~ "                       \n"
+#~ "  -b | --balance b     Kullanıcııın hesap blançosu b olarak "
+#~ "ayarlar.                     \n"
+#~ "                       Hesap blançosu arttırıabilir ya da azaltılabilir.\n"
+#~ "                       Eğer b + ya da - seklinde önekliyse.\n"
+#~ "                       UYARI : hesap blançosu azaltıldığında,\n"
+#~ "                       kullanıcı tarafında şimdiye kadar ödenmiş şeyler "
+#~ "de\n"
+#~ "                       azaltılır.\n"
+#~ "                       Gruplar ayrı bir hesaba sahip değillerdir, fakat\n"
+#~ "                       kullanıcılarının hesap blançolarının toplamı "
+#~ "kullanılır.\n"
+#~ "                       \n"
+#~ "  -S | --softlimit sl  Kota esnek sınırını sl sayfa "
+#~ "olarakayarlar.                       \n"
+#~ "  \n"
+#~ "  -H | --hardlimit hl  Kota son limitini hl sayfa olarak ayarlar.\n"
+#~ "  \n"
+#~ "  user1'den userN'e ve group1'den groupN'e maske kullanabilir\n"
+#~ "  Eğer --add seçeneği ayarlı değilse.\n"
+#~ "  \n"
+#~ "örnekler :                              \n"
+#~ "\n"
+#~ "  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+#~ "  \n"
+#~ "  Bu jerome john paul george ringo kullanıcılarını kota veritabanına\n"
+#~ "  ekler, ve onların yazma kotalarını jorome kullanıcısının değeri ile "
+#~ "aynı\n"
+#~ "  yapar. jerome kullanıcısı önceden bulunmalıdır.\n"
+#~ "  ringo kullanıcısının eposta adresi 'ringo@example.com' olarak "
+#~ "ayarlanır\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  Bu jerome kullanıcısının lp yazıcısı üzerindeki yazma kotasını esnek "
+#~ "limit\n"
+#~ "  olarak 50 sayfa yapar, ve son limit olarak 60 sayfa yapar. Eğer jerome\n"
+#~ "  ya da lp yazıcısı Kota Depo Sunucusu'nda bulunmuyorsa hiçbir şey "
+#~ "yapılmaz.\n"
+#~ "\n"
+#~ "  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  Yukarıdaki ile aynıdır ancak eğer kullanıcı ve yazıcı Kota Depo\n"
+#~ "  Sunucusu'nda yoksa kendiliğinden eklenir. Ayrıca jerome\n"
+#~ "  kullanıcısı Kota Deposu'nda zaten bulunan \"coders\" ve \"it\"\n"
+#~ "  gruplarına eklenir.\n"
+#~ "            \n"
+#~ "  $ edpykota -g -S 500 -H 550 financial support            \n"
+#~ "  \n"
+#~ "  Bu yazma esnek sınırını 500 sayfa ve son sınırını 550 sayfa olarak,\n"
+#~ "  financial ve support grupları için tüm yazıcılarda ayarlar.\n"
+#~ "  \n"
+#~ "  $ edpykota --reset jerome \"jo*\"\n"
+#~ "  \n"
+#~ "  Bu jerome'un be adı 'jo' ile başlayan tüm kullanıcıların\n"
+#~ "  sayfa sayacını tüm yazıcılarda sıfırlar.\n"
+#~ "  Bu kullanıcıların tüm zaman yazma sayaçları değişmeden kalır.\n"
+#~ "  --hardreset | -R komut satırı seçeneğini kullanarak bu kullanıcıların\n"
+#~ "  tüm zaman sayaçlarını da sıfırlayabilirsiniz.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hpcolor --noquota jerome\n"
+#~ "  \n"
+#~ "  Bu PyKota'ya jerome için hpcolor yazıcısında sınır koymamasını\n"
+#~ "  söyler. Onun bu yazıcıdaki bütün işlerine izin verilecektir, ancak \n"
+#~ "  yazdığı sayfaların hesabı gene de tutulacaktır.\n"
+#~ "  Jerome'un diğer yazıcılar üzerindeki Yazma Kotaları değişmeden kalır.\n"
+#~ "  \n"
+#~ " $ edpykota --limitby balance jerome\n"
+#~ "  \n"
+#~ "  Bu PyKota'a jerome'u yazarken hesap blançosu ile sınırlamasını\n"
+#~ "  soyler.\n"
+#~ "  \n"
+#~ "  $ edpykota --balance +10.0 jerome\n"
+#~ "  \n"
+#~ "  Bu jerome'un hesap blançosunu 10.0 değer arttırır. (kendi\n"
+#~ "  para biriminizde). Hesap blançosunu başına eksi koyarak\n"
+#~ "  azaltabilirsiniz, ve onu başına bir şey koymayarak sabit hale "
+#~ "getirebilirsiniz.\n"
+#~ "  \n"
+#~ "  $ edpykota --delete jerome rachel\n"
+#~ "  \n"
+#~ "  Bu Kota Depo veritabanından jerome'u ve rachel'i tamamen siler.\n"
+#~ "  Onların tüm kotaları ve işleri de silinir.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp --charge 0.1\n"
+#~ "  \n"
+#~ "  Bu lp yazıcısı için sayfa başı ücreti 0.1 olarak ayarlar. İş ücreti\n"
+#~ "  değişmeden kalır.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+#~ "  \n"
+#~ "  Bu hplj1 ve hplj2 yazıcılarını Laser ve HP grubuna koyar.\n"
+#~ "  hplj1 ve hplj2 yazıcılarının birinde yazarken, yazma kotası da  \n"
+#~ "  Laser ve HP sanal yazıcıları üzerinde kontrol edilip hesaplanır.\n"
+#~ "\n"
+#~ "Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+#~ "yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+#~ "tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+#~ "ve/ya da değiştirebilirsiniz.\n"
+#~ "\n"
+#~ "Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+#~ "GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+#~ "DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+#~ "Kamu Lisansını okuyun.\n"
+#~ "\n"
+#~ "GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+#~ "olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+#~ "Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+#~ "\n"
+#~ "Lütfen hataları %s adresine mektupla bildirin"
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Grup           kullanılan    esnek    son    bilanço esneklik         "
+#~ "toplam       ödenen"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Kullanıcı           kullanılan    esnek    son    bilanço "
+#~ "esneklik         toplam       ödenen"
+
+#~ msgid "Waiting for printer %s to be idle or printing..."
+#~ msgstr ""
+#~ "%s yazıcısının beklemede olması ya da yazma durumunda olması bekleniyor..."
+
+#~ msgid ""
+#~ "pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "A Printers Manager for PyKota.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints pkprinters's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -a | --add           Adds printers if they don't exist on the Quota \n"
+#~ "                       Storage Server. If they exist, they are modified\n"
+#~ "                       unless -s|--skipexisting is also used.\n"
+#~ "                       \n"
+#~ "  -d | --delete        Deletes printers from the quota storage.\n"
+#~ "  \n"
+#~ "  -D | --description   Adds a textual description to printers.\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+#~ "                       Job price is optional.\n"
+#~ "                       If both are to be set, separate them with a "
+#~ "comma.\n"
+#~ "                       Floating point and negative values are allowed.\n"
+#~ "  \n"
+#~ "  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the "
+#~ "printer \n"
+#~ "                       groups pg1, pg2, etc... which must already exist.\n"
+#~ "                       A printer group is just like a normal printer,\n"
+#~ "                       only that it is usually unknown from the printing\n"
+#~ "                       system. Create printer groups exactly the same\n"
+#~ "                       way that you create printers, then add other \n"
+#~ "                       printers to them with this option.\n"
+#~ "                       Accounting is done on a printer and on all\n"
+#~ "                       the printer groups it belongs to, quota checking\n"
+#~ "                       is done on a printer and on all the printer "
+#~ "groups\n"
+#~ "                       it belongs to.\n"
+#~ "                       If the --remove option below is not used, the \n"
+#~ "                       default action is to add printers to the "
+#~ "specified\n"
+#~ "                       printer groups.\n"
+#~ "                       \n"
+#~ "  -l | --list          List informations about the printer(s) and the\n"
+#~ "                       printers groups it is a member of.\n"
+#~ "                       \n"
+#~ "  -r | --remove        In combination with the --groups option "
+#~ "above,                       \n"
+#~ "                       remove printers from the specified printers "
+#~ "groups.\n"
+#~ "                       \n"
+#~ "  -s | --skipexisting  In combination with the --add option above, tells\n"
+#~ "                       pkprinters to not modify existing printers.\n"
+#~ "  \n"
+#~ "  printer1 through printerN can contain wildcards if the --add option \n"
+#~ "  is not set.\n"
+#~ "  \n"
+#~ "examples :                              \n"
+#~ "\n"
+#~ "  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+#~ "hp8000\n"
+#~ "  \n"
+#~ "  Will create three printers named hp2100, hp2200 and hp8000.\n"
+#~ "  Their price per page will be set at 0.05 unit, and their price\n"
+#~ "  per job will be set at 0.1 unit. Units are in your own currency,\n"
+#~ "  or whatever you want them to mean.\n"
+#~ "  All of their descriptions will be set to the string \"HP Printer\".\n"
+#~ "  If any of these printers already exists, it will also be modified \n"
+#~ "  unless the -s|--skipexisting command line option is also used.\n"
+#~ "            \n"
+#~ "  $ pkprinters --delete \"*\"\n"
+#~ "  \n"
+#~ "  This will completely delete all printers and associated quota "
+#~ "information,\n"
+#~ "  as well as their job history. USE WITH CARE !\n"
+#~ "  \n"
+#~ "  $ pkprinters --groups Laser,HP \"hp*\"\n"
+#~ "  \n"
+#~ "  This will put all printers which name matches \"hp*\" into printers "
+#~ "groups \n"
+#~ "  Laser and HP, which MUST already exist.\n"
+#~ "  \n"
+#~ "  $ pkprinters --groups LexMark --remove hp2200\n"
+#~ "  \n"
+#~ "  This will remove the hp2200 printer from the LexMark printer group.\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "PyKota için yazıcı yöneticisi.\n"
+#~ "\n"
+#~ "komut satırı kullanımı :\n"
+#~ "\n"
+#~ "  pkprinters [seçenekler] yazıcı1 yazıcı2 yazıcı3 ... yazıcıN\n"
+#~ "\n"
+#~ "seçenekler :\n"
+#~ "\n"
+#~ "  -v | --version       pkprinters'ın sürüm numarasını gösterir ve çıkar.\n"
+#~ "  -h | --help          Bu mesajı gösterir ve çıkar.\n"
+#~ "  \n"
+#~ "  -a | --add           Kota Depo Sunucusu'nda bulunmuyorlarsa\n"
+#~ "                       yazıcıları ekler. Eıer bulunuyorlarsa -s|--"
+#~ "skipexisting kullanılmazsa\n"
+#~ "                       düzenlenirler.\n"
+#~ "                       \n"
+#~ "  -d | --delete        Kota deposundan yazıcıları siler.\n"
+#~ "  \n"
+#~ "  -D | --description   Yazıcılara metinsel tanım ekler.\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  Sayfa başına ücret ve iş başına ücret ayarlar.\n"
+#~ "                       İş ücreti tercihseldir.\n"
+#~ "                       Eğer ikisi de ayarlanacaksa, onları virgül ile "
+#~ "ayırın.\n"
+#~ "                       Ondalıklı sayılara ve negatif değerlere izin "
+#~ "verilir.\n"
+#~ "  \n"
+#~ "  -g | --groups pg1[,pg2...] Yazıcı grupları pg1, pg2, vb.'ye yazıcı \n"
+#~ "                       ekler ya da siler... bu grupların bulunması "
+#~ "gerekmektedir.\n"
+#~ "                       Yazıcı grubu normal bir yazıcı gibidir,\n"
+#~ "                       tek farkı onun sadece yazma sistemi tarafından "
+#~ "biliniyor\n"
+#~ "                       olmasıdır. Yazıcı grubu aynen normal yazıcı "
+#~ "oluğturu gibi\n"
+#~ "                       oluşturun, ve daha sonra bu seçenek ile gruba "
+#~ "başka\n"
+#~ "                       yazıcılar ekleyin.\n"
+#~ "                       Hesaplama yazıcı üzerinde ve onun bulunduıu tüm\n"
+#~ "                       yazıcı grupları üzerinde yapılır. Kota kontrolü "
+#~ "de\n"
+#~ "                       yazıcı üzerinde ve onun bulunduğu tüm yazıcı\n"
+#~ "                       grupları üzerinde yapılır.\n"
+#~ "                       Eğer aşağıdaki --remove komutu kullanılmaz ise \n"
+#~ "                       öntanımlı eylem yazıcının belirtilen gruplara "
+#~ "eklenmesi\n"
+#~ "                       olacaktır.\n"
+#~ "                       \n"
+#~ "  -l | --list          Üyesi bulunduğu yazıcı ve yazıcı grupları "
+#~ "hakkında\n"
+#~ "                       bilgileri gösterir.\n"
+#~ "                       \n"
+#~ "  -r | --remove        Yukarıdaki --groups seçeneıi ile birlikte "
+#~ "kullanıldığında,                        \n"
+#~ "                       yazıcıları belirtilen gruplardan siler.\n"
+#~ "                       \n"
+#~ "  -s | --skipexisting  Yukarıdaki --add seçeneğiyle birlikte "
+#~ "kullanıldığında,\n"
+#~ "                       pkprinters'a yazıcıları değiştirmemesini söyler.\n"
+#~ "  \n"
+#~ "  yazıcı1'den yazıcıN'e kadar maske kullanılabilir, eğer --add seçeneği \n"
+#~ "  kullanılmadıysa.\n"
+#~ "  \n"
+#~ "examples :                              \n"
+#~ "\n"
+#~ "  $ pkprinters --add -D \"HP Yazıcı\" --charge 0.05,0.1 hp2100 hp2200 "
+#~ "hp8000\n"
+#~ "  \n"
+#~ "  hp2100, hp2200 ve hp8000 adında üç yazıcı oluşturur.\n"
+#~ "  Sayfa başına ücretleri 0.05 birim olarak ayarlanır ve iş başına\n"
+#~ "  ücretleri ise 0.1 birim olarak ayarlanır. Birimler kendi para "
+#~ "birimleriniz,\n"
+#~ "  ya da onları ne anlamda kullanmak istiyorsanız o türdendir.\n"
+#~ "  Hepsini tanımı \"HP Yazıcı\" olarak ayarlanır.\n"
+#~ "  Eğer bu yazıcılardan biri zaten mevcutsa, o da düzenlenecektir \n"
+#~ "  eğer -s|--skipexisting komutu kullanılmazsa.\n"
+#~ "            \n"
+#~ "  $ pkprinters --delete \"*\"\n"
+#~ "  \n"
+#~ "  Bu tüm yazıcıları ve onların kota bilgilerini silecektir.Aynı zamanda\n"
+#~ "  iş geçmişleri de silinir. DİKKATLİ KULLANIN !\n"
+#~ "  \n"
+#~ "  $ pkprinters --groups Laser,HP \"hp*\"\n"
+#~ "  \n"
+#~ "  Bu ismi \"hp*\" ile eşleşen tüm yazıcıları önceden bulunmasıgereken \n"
+#~ "  Laser ve HP yazıcı gruplarına ekler.\n"
+#~ "  \n"
+#~ "  $ pkprinters --groups LexMark --remove hp2200\n"
+#~ "  \n"
+#~ "  Bu hp2200 yazıcısını LexMark yazıcı grubundan siler.\n"
+#~ "  \n"
+#~ "Bu program özgür yazılımdır; bu yazılımı Özgür Yazılım Vakfı tarafından\n"
+#~ "yayınlanan GNU Genel Kamu Lisansı'nın 2. sürümü ya da (kendi\n"
+#~ "tercihinize bağlı) sonraki sürümü şartları altında yeniden dağıtabilir \n"
+#~ "ve/ya da değiştirebilirsiniz.\n"
+#~ "\n"
+#~ "Bu program faydalı olacağı düşünülerek dağıtılmaktadır, fakat HİÇBİR\n"
+#~ "GARANTİSİ YOKTUR; BELLİ BİR AMACA UYGUNLUK ya da MAL\n"
+#~ "DEĞERİ gibi garantileri de yoktur.  Daha fazla ayrıntı için GNU Genel\n"
+#~ "Kamu Lisansını okuyun.\n"
+#~ "\n"
+#~ "GNU Genel Kamu Lisansının bir nüshasını programla birlikte almış\n"
+#~ "olmalısınız, eğer almadıysanız Özgür Yazılım Vakfı'na 59 Temple Place, \n"
+#~ "Suite 330, Boston, MA 02111-1307, USA adresinden ulaşın.\n"
+#~ "\n"
+#~ "Lütfen hataları %s adresine mektupla bildirin"
Index: pykota/tags/1.22/po/pt_BR/pykota.po
===================================================================
--- pykota/tags/1.22/po/pt_BR/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/pt_BR/pykota.po (revision 2228)
@@ -0,0 +1,1904 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-07-21 15:35:00+0100\n"
+"Last-Translator: Jurandy Martins <jurandy@ic.unicamp.br>\n"
+"Language-Team: Brazilian <jurandy@ic.unicamp.br>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "Tarefa n�cont�nenhum dado. Impress�negada"
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "In�o da contagem da tarefa."
+
+msgid "Job accounting ends."
+msgstr "Fim da contagem da tarefa."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "Tamanho da tarefa zerado porque a impress�foi negada"
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Tamanho da tarefa : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Atualizando cota do usu�o %s para a impressora %s"
+
+msgid "Job added to history."
+msgstr "Tarefa adicionada ao hist�o"
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+"Arquivo n� %s descadastrado duas vezes do objeto de consulta. Ignorado"
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "SIGTERM foi emitida a real backend %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "Backend CUPS morreu anormalmente."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr ""
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Valor incorreto para o limite %s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Valor incorreto para o limite Maximo %s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr "Limite maximo %i �enor que o limite %i, os valores ser�invertidos."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Valor da media %s inv�do"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Valor de carga: %s inv�do"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Valor do limitby %s inv�do"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Imposivel adicionar impressora %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Nome de impressora %s inv�do"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Impressora %s n�encontrada"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "Voce deve informar usuario ou grupo na linha de comando"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Objeto Prototipo %s n�encontrado no banco de dados."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prototipo %s n�encontrado no banco dedados para a impressora %s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+"O limite maximo invalido, configurando o limite minimo (%s) na impressora %s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "Limite indefinido, configurando a l�te maximo (%s) na impressora %s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Endere�email inv�do"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "O nome do grupo %s �nv�do"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "O nome de usuario %s �nv�do"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Quota n�encontrada para o objeto %s para a impressora %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Grupo %s n�encontrado no banco de dados."
+
+msgid "incompatible options, see help."
+msgstr "O�s incompativeis, veja a ajuda."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "O contador l�o j�oi aplicado no primeiro passo. Ignorando."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "O contador f�co j�oi aplicado no primeiro passo. Ignorando"
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "T�lo"
+
+msgid "Filename"
+msgstr "Nome do arquivo"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "DeviceURI inv�do : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Por favor, aguarde enquanto pkhint analisa as configura�s de seu sistema "
+"de impress�.."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Dispositivo %s inv�do para a impressora %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"Pondo as seguintes linhas no arquivo /etc/pykota/pykota.conf : \n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# CUIDADO : se o contador l�o for sugerido, isto n�significa"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# que o contador l�o poder��funcionar. Isto significa somente que o "
+"Pykota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# n�foi capaz de detectar automaticamente o m�do de contagem f�ca a "
+"ser utilizado"
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "Impressora %s j�xiste. Ignorando."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "Impressora %s j�xiste. Ser�eita uma modifica�."
+
+msgid "in"
+msgstr "em"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+"voc�eve passar os nomes dos grupos de impressoras na linha de comando"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Voce deve informar impressora na linha de comando"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Op� %s inv�da para dura�"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Op� %s inv�da para loop (la�"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Op� %s inv�da para sleep (sono)"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Op� %s inv�da para color (cor)"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "Usu�o %s n�existe na base de dados do Pykota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "P�nas usadas em %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Unidades restantes do PyKota : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Balan�de sua conta : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Tamanho do JOB : %i p�nas"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Custo da impresora %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "Relat� do Pykota"
+
+msgid "Report"
+msgstr "Relat�"
+
+msgid "Printer"
+msgstr "Impressora"
+
+msgid "User / Group names mask"
+msgstr "M�ara de nomes para Usu�os / Grupos"
+
+msgid "Groups report"
+msgstr "Relat� de Grupos"
+
+msgid "History"
+msgstr "Hist�o"
+
+msgid "Empty"
+msgstr "Vazio"
+
+msgid "Action"
+msgstr "A�"
+
+msgid "User"
+msgstr "Usu�o"
+
+msgid "Hostname"
+msgstr "Nome do computador"
+
+msgid "JobId"
+msgstr "Id da Tarefa"
+
+msgid "JobSize"
+msgstr "Tamanho da Tarefa"
+
+msgid "JobPrice"
+msgstr "Pre�da Tarefa"
+
+msgid "Copies"
+msgstr "C�s"
+
+msgid "JobBytes"
+msgstr "Tamanho da Tarefa em Bytes"
+
+msgid "PageCounter"
+msgstr "Contador de p�nas"
+
+msgid "Options"
+msgstr "Op�s"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "P�na anterior"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Accounter Backend %s n�suportado"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Arquivo de configura� %s n�encontrado."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Op� %s n�encontrada na se� global de %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Op� %s n�encontrada na se� %s de %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "a op� logger s�porta valores em %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Contador de p�nas %s inv�do, para a impressora %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "A op� accounter na se� %s s�porta valores em %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "Op� enforcement (refor� na se� %s s�porta valores em %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Pol�ca inv�da %s para a impressora %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "A op� policy na se� %s s�porta valores em %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Op� mailto %s inv�da,  para a impressora %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "a op� mailto na se� %s s�porta valores em %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Tiempo gartis %s inv�do"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Valor 'poor man' %s inv�do"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"A media de sua quota de impress�est�aixa.\n"
+"voce n�pode imprimir .\n"
+"Por favor entre em contato com o administrador das Impressoras para resolver "
+"o problema."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Voce n�pode imprimir porque\n"
+"sua quota de impress�foi excedida, na impressora %s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Sua impress�est�loqueada porque\n"
+"sua quota de impress�foi atingida, na impressora %s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr ""
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Sistema de log %s n�suportado"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Relatorio de quota %s para a impressora %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Tempo de cortesia : %i d�"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Pre�por impress� %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Pre�por p�na: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "Desconhecido"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Real : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Total : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Reporter backend %s n�suportado"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "o banco de dados: %s  n�suportado"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "N�foi poss�l conectar-se ao servidor SMTP %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Imposivel enviar email para  %s, erro %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Por favor contacte a seu administrador de sistemas:\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Imposivel encontrar o usu�o %s para impressorao %s, aplicando politica "
+"padr�(%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"Imposivel encontrar a media da conta do usuario %s, configurando o valor "
+"padr�(%s) para a impressora %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "Quota de impress�excedida para o grupo %s na impressora %s"
+
+msgid "Print Quota"
+msgstr "Quota de impre�"
+
+msgid "Print Quota Exceeded"
+msgstr "Quota de Impress�Excedida"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Quota de impressora baixa para o grupo %s na impresora %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "Quota de impress�excedida para o usuario %s na impressora %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Quota de impress�baixa para o usuario %s na impressora %s"
+
+msgid "Print Quota Low"
+msgstr "Quota de impress�baixa"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Sistema de impress�%s, argumentos=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"Imposs�l calcular tamanho da tarefa usando analisador gen�o de PDL : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "SIGTERM recebida, trabalho %s reiniciado."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr ""
+"Nome do servidor de impress�n�definido, configurando para 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Sistema de impress�desconhecido, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Impressora %s n�registada no sistema de impress� foi aplicada a pol�ca "
+"externa (%s) para a impressora %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Usuario %s n�registrado no sistema PyKota, aplicando pol�ca externa (%s) "
+"para a impressora %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"Utilizador %s n�tem cota na impressora %s, foi aplicada a pol�ca externa "
+"(%s) para a impressora %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"Pol�ca externa %s para a impressora %s retornou un error. Trabalho "
+"reiniciado. Por favor verifique os arquivos de configura� do PyKota."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Impressora %s n�registada no sistema Pykota, foi aplicada por omiss�a "
+"pol�ca (%s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Usuario %s n�registrado no sistema PyKota, aplicando configura�s padr�"
+"(%s) para a impressora %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"O utilizador %s n�tem cota na impressora %s, foi aplicada por omiss�a "
+"pol�ca (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"A Impressora %s n�se encontra registada no sistema, o pedido ser�ejeitado"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"O utilizador %s n�se encontra registado no sistema, o pedido para a "
+"impressora %sser�ejeitado"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"O utilizador %s ainda n�tem cota definida na impressora %s, o pedido ser�
+"rejeitado"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr ""
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Endere�invalido em  HARDWARE(%s) para a impressora %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Tentando identifica� f�ca(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "Sinal SIGTERM enviado para contador f�co %s (pid : %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr ""
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Imposive consultar a impressora %s via HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr ""
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Tentando identifica� l�a (%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Impossivel calcular o tamanho do trabalho com o contador %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr "Problema ao aguardar encerramento do contador l�o de pid %s : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "C�o de erro para contador l�o %s : %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"O Total pode n�ser exato se os usuarios forem mebros de varios grupos."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"Base de busca %s parece n�existir, provavelmente por causa de m�
+"configura�.Por favor, verifique as configura�s do arquivo /etc/pykota/"
+"pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "Buscar por %s(%s) apartir de %s(scope=%s) nenhum registro encontrado."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Problema adicionando entrada LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Problema apagando entrada LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Problema modificando entrada LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"Imposs�l encontrar uma entrada objectClass %s existente com %s=%s "
+"paraanexar objectClass pykotaAccount"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"Imposs�l encontrar uma entrada existente para anexar ao objectClass "
+"pykotaGroup %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Grupo           usado   Minimo  Maximo  media   gratis        total       "
+#~ "pago"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Usuario         usado   Minimo  Maximo  media   gratis        total       "
+#~ "pago"
Index: pykota/tags/1.22/po/es/pykota.po
===================================================================
--- pykota/tags/1.22/po/es/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/es/pykota.po (revision 2228)
@@ -0,0 +1,3023 @@
+# translation of pykota.po to Spanish
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+# Sergio Gonz�z Gonz�z <sergio.gonzalez@hispalinux.es>, 2005.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pykota\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2005-02-23 20:05+0100\n"
+"Last-Translator: Sergio Gonz�z Gonz�z <sergio.gonzalez@hispalinux.es>\n"
+"Language-Team: Spanish <sergio.gonzalez@hispalinux.es>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Herramienta que automatiza la creaci�e cuentas de usuario y el \n"
+"establecimiento inicial del saldo.\n"
+"\n"
+"�NO DEBE USAR ESTA HERRAMIENTA SI QUIERE HACER USO DEL L�ITE POR CUOTA\n"
+" DE P�INA!\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  NO HA DE UTILIZAR ESTA HERRAMIENTA DESDE LA L�EA DE COMANDOS, �ICAMENTE\n"
+"  COMO PARTE DE UNA �pol�ca externa� EN EL ARCHIVO pykota.conf\n"
+"\n"
+"  autopykota { -i | --initbalance valor } \n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e atopykota y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"  \n"
+"  -i | --initbalance b Establece el saldo inicial para la cuenta del\n"
+"                       usuario al valor �b�. Si el usuario ya existe,\n"
+"                       se deja el saldo actual sin modificar. Si no se\n"
+"                       ha establecido, el valor por defecto es 0\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr "El c�o de salida del generador de banners %s es %s"
+
+msgid "Job contains no data. Printing is denied."
+msgstr "El trabajo no contiene una fecha. Se deniega la impresi�
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr "El trabajo es un duplicado. La impresi�e ha denegado."
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+"El banner no se imprimir� se ha alcanzado el m�mo n� de banners "
+"rechazados."
+
+msgid "Job accounting begins."
+msgstr "Ha comenzado la contabilizaci�ara el trabajo."
+
+msgid "Job accounting ends."
+msgstr "Ha terminado la contabilizaci�ara el trabajo."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr ""
+"Se ha forzado el tama�el trabajo a 0 debido a que la impresi�st�
+"denegada."
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+"Cuidado : tama�el trabajo calculado (%s) != tama�el trabajo "
+"precalculado (%s)"
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+"El tama�el trabajo se validar�e todas formas, de acuerdo con la "
+"directiva 'trustjobsize'"
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+"El tama�el trabajo se validar�orque es inferior al l�te de la "
+"directiva 'trustjobsize' %s"
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+"El tama�el trabajo se modificar�e acuerdo con la directiva "
+"'trustjobsize' : %s"
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Tama�el trabajo : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Actualizada la cuota del usuario %s en la impresora %s"
+
+msgid "Job added to history."
+msgstr "Se ha a�do el trabajo al historial."
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+"No se ha registrado dos veces el archivo n� %s desde el objeto "
+"'polling', ignorado."
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "Se ha enviado la se�SIGTERM al backend real %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "El backend de CUPS %s muri�ormalmente."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr "La opci�d | --data es obligatoria, vea la ayuda."
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAedpykota v%s (c) 2003, 2004, 2005 C@LL - "
+"Conseil Internet & Logiciels Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+msgid "You're not allowed to use this command."
+msgstr "No tiene permiso para utilizar esta orden."
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr "Valor utilizado, %s, inv�do."
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Valor %s incorrecto para el l�te blando."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Valor %s incorrecto para el l�te duro."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+"El l�te duro %i es menor que el l�te blando %i, los valores ser�"
+"intercambiados."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr "Valor de recarga, %s, inv�do"
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Valor de saldo %s inv�do"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Valor %s inv�do para el importe de carga"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Valor %s inv�do para la opci�limitby�"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Imposible a�r la impresora %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Nombre de impresora %s inv�do"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Impresora %s no encontrada"
+
+msgid "You have to pass user or group names on the command line"
+msgstr ""
+"Ha de proporcionar nombres de usuarios o grupos en la l�a de comandos"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "El objeto Prototipo %s no se ha encontrado en el Almac�de Cuotas."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr ""
+"El prototipo %s no se ha encontrado en el Almac�de Cuotas para la "
+"impresora %s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+"L�te duro indefinido, ajustado al l�te blando (%s) en la impresora %s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr ""
+"L�te blando indefinido, ajustado al l�te duro (%s) en la impresora %s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Direcci�e correo electr�o %s inv�da"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr "Grupo %s desconocido"
+
+#, python-format
+msgid "Unknown user %s"
+msgstr "Usuario %s desconocido"
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Nombre de grupo %s inv�do"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Nombre de usuario %s inv�do"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Cuota no encontrada para el objeto %s en la impresora %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Grupo %s no encontrado en el Almac�de PyKota."
+
+msgid "incompatible options, see help."
+msgstr "opciones incompatibles, vea la ayuda."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr ""
+"Ya se ha realizado la contabilidad por software en el primer paso. "
+"Ignor�olo."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr ""
+"Ya se ha realizado la contabilidad por hardware en el primer paso. "
+"Ignor�olo."
+
+msgid "Job size and price now set in history."
+msgstr ""
+"El tama� precio del trabajo se ha establecido ahora en el historial."
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgid "Username"
+msgstr "Nombre de usuario"
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr "Trabajo"
+
+msgid "Date"
+msgstr "Fecha"
+
+msgid "Allowed"
+msgstr "Permitido"
+
+msgid "Denied"
+msgstr "Denegado"
+
+msgid "Allowed with Warning"
+msgstr "Permitido con aviso"
+
+msgid "Result"
+msgstr "Resultado"
+
+msgid "Title"
+msgstr "T�lo"
+
+msgid "Filename"
+msgstr "Nombre del archivo"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr "Las p�nas impresas a partir de ahora en %s"
+
+msgid "Account balance"
+msgstr "Balance de la cuenta"
+
+msgid "Soft Limit"
+msgstr "L�te blando"
+
+msgid "Hard Limit"
+msgstr "L�te duro"
+
+msgid "Date Limit"
+msgstr "Fecha l�te"
+
+msgid "Allowed range is (0..99)"
+msgstr "El rango permitido es (0..99)"
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr "Opci�savetoner' %s inv�da : %s"
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr "Opci�pagesize' %s inv�da, empleando el valor por defecto A4."
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Herramienta que aconseja sobre qu��do de contabilidad es el mejor\n"
+"para cada impresora.\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  pkhint [opciones] [impresora1 impresora2 impresora3 ... impresoraN] "
+"<archivo.conf\n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e pkhint y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"\n"
+"ejemplos:\n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"\n"
+"  Analizar�u sistema de impresi�ara comprobar que sistema\n"
+"  de contabilizaci�s el mejor para cada una de las impresoras\n"
+"  definidas y cuyo nombre coincida con uno de los par�tros.\n"
+"\n"
+"  Si no pasa ning�r�tro en la l�a de comandos, se analizar�n"
+"  todas las impresoras.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "DeviceURI inv�da : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Por favor, espere mientras 'pkhint' analiza sus archivos de configuraci�
+"del sistema de impresi�."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Dispositivo %s desconocido para la impresora %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"Coloque las siguientes l�as en su archivo /etc/pykota/pykota.conf : \n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr ""
+"# CUIDADO : si se ha sugerido la contabilidad por software, esto no significa"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# que la contabilidad por hardware vaya a funcionar, esto s�significa que "
+"PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# no podr�utodetectar el m�do de contabilidad por hardware a utilizar."
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Puerta de enlace de correo electr�o para PyKota.\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  pkmail  [opciones]\n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e pkmail's y sale.\n"
+"  -h | --help          Muestra este mensaje y sale.\n"
+"  \n"
+"    \n"
+"  Utilice este comando en su archivo de alias de su servidor de correo,\n"
+"  como una pipa. Una vez hecho esto, aceptar�os comandos que se le env�\n"
+"  a trav�de mensajes en correos electr�os, y devolver�na respuesta\n"
+"  al que dio origen al comando.\n"
+"  \n"
+"  Para utilizar este comando, cree un alias de correo en /etc/aliases con\n"
+"  el siguiente formato:\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Luego ejecute la orden 'newaliases' para regenerar la base de datos\n"
+"  de alias\n"
+"  \n"
+"  A partir de ese momento, puede enviar comandos por correo electr�o\n"
+"  a 'pykotacmd@tudominio.com', con la orden en el asunto.\n"
+"  \n"
+"  Lista de las �nes soportadas\n"
+"  \n"
+"        report [nombredeusuario]\n"
+"  \n"
+"  NB: Para que pkmail trabaje correctamente, ha de a�r al\n"
+"  usuario de sistema 'mail' al grupo de sistema 'pykota', para\n"
+"  asegurarse de que este usuario puede leer el archivo\n"
+"  /etc/pykota/pykotadmin.conf, y reiniciar su servidor de correo\n"
+"  (ej. /etc/init.d/exim restart). De todas formas se advierte\n"
+"  encarecidamente que piense en esto, al menos dos veces, antes\n"
+"  de llevarlo a cabo.\n"
+"  \n"
+"  �Util�lo bajo su reponsabilidad!\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Un administrador de impresoras para PyKota.\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  pkprinters [opciones] impresora1 impresora2 impresora3 ... impresoraN\n"
+"\n"
+"opciones\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e pkprinters y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"  \n"
+"  -a | --add           A� las impresoras si estas no existen en el\n"
+"                       servidor de almacenamiento de las cuotas. Si\n"
+"                       existen, se modifican a menos que se utilice\n"
+"                       -s|--skipexisting.\n"
+"\n"
+"  -d | --delete        Borra las impresoras de la base de datos de\n"
+"                       almacenamiento de las cuotas.\n"
+"\n"
+"  -D | --description d A� una descripci�extual a la impresora.\n"
+"\n"
+"  -c | --charge p[,j]  Establece el precio por p�na y por trabajo que\n"
+"                       se ha de cobrar. El precio por trabajo es opcional.\n"
+"                       Si se van a establecer ambos, sep�los con una "
+"coma.\n"
+"                       Se permiten valores en coma flotante y negativos.\n"
+"\n"
+"  -g | --groups pg1[,pg2...] A� o elimina la(s) impresora(s) del grupo\n"
+"                       de impresoras �pg1�, �pg2�, etc. que han de existir.\n"
+"                       Un grupo de impresi�s similar a una impresora "
+"normal,\n"
+"                       con la salvedad de que, normalmente, es desconocido\n"
+"                       por el sistema de impresi�Cree los grupos de\n"
+"                       impresi�e la misma forma que crea las impresoras,\n"
+"                       luego a� otra impresora al grupo con esta opci�n"
+"                       La contabilidad se realiza en la impresora y en "
+"todos\n"
+"                       los grupos de impresi� los que esta pertenece; la\n"
+"                       comprobaci�e la cuota se realiza en la impresora "
+"y\n"
+"                       en todos los grupos de impresi� los que "
+"pertenece.\n"
+"                       Si no se utiliza la opci�-remove listada abajo, "
+"la\n"
+"                       acci�or defecto es a�r las impresoras al grupo "
+"de \n"
+"                       impresoras especificado.\n"
+"\n"
+"  -l | --list          Lista informaci�obre la(s) impresora(s) y sobre "
+"los\n"
+"                       grupos de impresi� los que pertenece.\n"
+"\n"
+"  -r | --remove        En combinaci�on la opci�-groups citada arriba,\n"
+"                       elimina las impresoras de los grupos de impresi�"
+"                       especificados.\n"
+"\n"
+"  -s | --skipexisting  En combinaci�on la opci�-add citada arriba,\n"
+"                       le dice a pkprinters que no modifique las impresoras\n"
+"                       existentes.\n"
+"\n"
+"  desde impresora1 hasta impresoraN pueden contener comodines, si la opci�"
+"  --add no se ha utilizado.\n"
+"\n"
+"ejemplos:\n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"\n"
+"  Crear�res impresoras, denominadas hp2100, hp2200 y hp8000.\n"
+"  Sus precios por p�na se establecer�a 0.05 unidades, y sus\n"
+"  precios por trabajo se establecer�a 0.1 unidades. Las unidades\n"
+"  est�en su propia moneda, o cualquier cosa que quiera que\n"
+"  signifique.\n"
+"  Todas sus descripciones se establecer�a la cadena �HP Printer�.\n"
+"  Si alguna de estas impresoras ya existe, ser�odificada, a menos\n"
+"  que la opci�s|--skipexisting se haya empleado.\n"
+"\n"
+"  $ pkprinters --delete \"*\"\n"
+"\n"
+"  Esto borrar�ompletamente todas las impresoras y sus cuotas\n"
+"  asociadas, as�omo su historial de trabajos. �UTIL�ELA CON\n"
+"  CUIDADO!\n"
+"\n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"\n"
+"  Esto a�r�odas las impresoras cuyos nombres coincidan con\n"
+"  �hp*� al grupo de impresoras �Laser� y �HP�, que DEBEN existir.\n"
+"\n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"\n"
+"  Esto eliminar�a impresora �hp2200� del grupo de impresoras �LexMark�.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "La impresora %s ya existe, se salta."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "La impresora %s ya existe, va a ser modificada."
+
+msgid "in"
+msgstr "en"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+"Ha de proporcionar nombres de grupos de impresoras en la l�a de comandos"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Ha de proporcionar nombres de impresoras en la l�a de comandos"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Un monitor de cuotas OSD para PyKota.\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  pykosd [opciones]\n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e pykosd y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"\n"
+"  -c | --color #rrggbb Establece el color que se utilizar�n el\n"
+"                       visualizador como un triplete hexadecimal, por\n"
+"                       ejemplo #FF0000 es un rojo 100%%.\n"
+"                       El valor por defecto es 100%% verde (#00FF00).\n"
+"\n"
+"  -d | --duration d    Establece la duraci�el visualizador en segundos.\n"
+"                       Por defecto son 3 segundos.\n"
+"\n"
+"  -f | --font f        Establece el tipo de letra que se utilizar�n\n"
+"                       el visualizador.\n"
+"                       Por defecto se utilizar�a opci�or defecto\n"
+"                       de la librer�Python OSD.\n"
+"\n"
+"  -l | --loop n        Establece el n� de veces que la informaci�"
+"                       se mostrar�n"
+"                       El valor por defecto es 0, que significa un\n"
+"                       bucle sin fin.\n"
+"\n"
+"  -s | --sleep s       Establece el tiempo de espera entre dos mensajes\n"
+"                       en segundos. El valor por defecto son 180 segundos\n"
+"                       (3 minutos).\n"
+"\n"
+"\n"
+"ejemplos:\n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"\n"
+"  Ejecutar�ykosd. El visualizador se actualizar�ada 60 segundos,\n"
+"  y se mostrar� segundos (valor por defecto) cada vez. Despu�de\n"
+"  cinco iteraciones, el programa finalizar�n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Opci�e duraci�s inv�da"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Opci�e bucle %s inv�da"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Opci�sleep� %s inv�da"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Opci�e color %s inv�da"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "El usuario %s no existe en la base de datos de PyKota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "P�nas utilizadas en %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Unidades restantes de PyKota : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Muestra las cuotas de impresi� los usuarios.\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  pykotme  [opciones]  [archivos]\n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�ykotme y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"\n"
+"  -P | --printer p     Muestra la cuota para esta impresora �mente.\n"
+"                       Actualmente �p� puede utilizar caracteres comod�n"
+"                       para seleccionar s�algunas impresoras. El valor\n"
+"                       por defecto es *, que significa toas las impresoras.\n"
+"                       Puede especificar varios nombres o comodines,\n"
+"                       separ�olos por comas.\n"
+"\n"
+"ejemplos\n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"\n"
+"  Esto mostrar�na cuota de impresi�ara el usuario actual. La cuota\n"
+"  mostrar�l precio y el tama�el trabajo consistente en �file1.ps�\n"
+"  y �file2.ps� que se enviar�a la impresora �apple�.\n"
+"\n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"\n"
+"  Esto mostrar�na cuota de impresi�ara el usuario actual. La cuota\n"
+"  mostrar�l precio y el tama�el trabajo consistente en �file1.ps�\n"
+"  le� desde la entrada est�ar, que ser�nviado a la impresora\n"
+"  �apple� o �hplaser�.\n"
+"\n"
+"  $ pykotme \n"
+"\n"
+"  Esto mostrar�na cuota para el trabajo consistente en los datos de\n"
+"  la entrada est�ar. La cuota listar�l tama�el trabajo y el\n"
+"  coste de impresi�el trabajo en cada impresora.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Su saldo : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Tama�el trabajo : %i p�na(s)"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Coste en la impresora %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Genera informes sobre las cuotas de impresi�n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  repykota [opciones] \n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e repykota y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"\n"
+"  -u | --users         Genera un informe sobre las cuotas de los \n"
+"                       usuarios, este es el comportamiento por defecto.\n"
+"\n"
+"  -g | --groups        Genera un informe sobre las cuotas de los grupos\n"
+"                       en lugar de los usuarios.\n"
+"\n"
+"  -P | --printer p     Informa de las cuotas en esta impresora �mente\n"
+"                       Actualmente �p� puede utilizar caracteres comod�n"
+"                       para seleccionar s�algunas impresoras. El valor\n"
+"                       por defecto es *, que significa todas las "
+"impresoras.\n"
+"                       Puede especificar varios nombres o comodines,\n"
+"                       separ�olos por comas.\n"
+"\n"
+"ejemplos:\n"
+"\n"
+"  $ repykota --printer lp\n"
+"\n"
+"  Esto imprimir�l estado de la cuota para todos los usuarios que utilizan\n"
+"  la impresora �lp�.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  Esto imprimir�l estado de la cuota para todos los usuarios en todas\n"
+"  las impresoras.\n"
+"\n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  Esto imprimir�l estado de la cuota para el usuario jerome y\n"
+"  todos los usuarios cuyos nombres comiencen por �jo� en todas\n"
+"  las impresoras cuyos nombres comiencen por �laser� o terminen   con "
+"�pson�.\n"
+"\n"
+"  Si se ejecuta por un usuario que no es un administrador de PyKota,\n"
+"  los par�tros adicionales que representen nombres de usuarios o grupos\n"
+"  son ignorados, inform�ose �mente del usuario/grupo actual.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Env�correos electr�os a los usuarios que han sobrepasado su cuota\n"
+"\n"
+"uso desde la l�a de comandos:\n"
+"\n"
+"  warnpykota  [opciones]  [nombres]\n"
+"\n"
+"opciones:\n"
+"\n"
+"  -v | --version       Muestra el n� de versi�e warnpykota y\n"
+"                       luego sale.\n"
+"  -h | --help          Muestra este mensaje y luego sale.\n"
+"\n"
+"  -u | --users         Advierte a los usuarios que han sobrepasado sus\n"
+"                       cuotas de impresi�este es el valor por defecto.\n"
+"\n"
+"  -g | --groups        Advierte a los usuarios cuyas cuotas de grupo se\n"
+"                       hayan sobrepasado.\n"
+"\n"
+"  -P | --printer p     Verifica las cuotas en esta impresora �mente.\n"
+"                       Actualmente �p� puede utilizar caracteres comod�n"
+"                       para seleccionar solamente algunas impresoras.\n"
+"                       El valor por defecto es *, que significa todas\n"
+"                       las impresoras.\n"
+"                       Puede especificar varios nombres o comodines,\n"
+"                       separ�olos por comas.\n"
+"\n"
+"ejemplos:\n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"\n"
+"  Esto avisar� todos los usuarios de la impresora �lp� que hayan\n"
+"  sobrepasado sus cuotas de impresi�n"
+"\n"
+"  $ warnpykota \n"
+"\n"
+"  Esto avisar� todos los usuarios que hayan sobrepasado su cuota\n"
+"  de impresi�n cualquier impresora.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"\n"
+"  Esto avisar� todos los grupos de usuarios cuyos nombres comiencen con\n"
+"  �dev� y que hayan sobrepasado sus cuotas de impresi�n cualquier\n"
+"  impresora cuyo nombre comience con �laserjet�\n"
+"\n"
+"  Si se ejecuta por un usuario que no es un administrador de PyKota,\n"
+"  los par�tros adicionales que representen nombres de usuarios o grupos\n"
+"  son ignorados, inform�ose �mente al usuario/grupo actual.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Por favor, env�los errores por correo electr�o a: %s"
+
+msgid "PyKota Data Dumper"
+msgstr "Volcado de datos de PyKota"
+
+msgid "Dump"
+msgstr "Volcado"
+
+msgid "Please click on the above button"
+msgstr "Pulse sobre el bot�e arriba, por favor"
+
+msgid "Data Type"
+msgstr "Tipo de datos"
+
+msgid "Output Format"
+msgstr "Formato de salida"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "PyKota Reports"
+msgstr "Informes de PyKota"
+
+msgid "Report"
+msgstr "Informe"
+
+msgid "Printer"
+msgstr "Impresora"
+
+msgid "User / Group names mask"
+msgstr "M�ara para el nombre de Usuario / Grupo"
+
+msgid "Groups report"
+msgstr "Informes de los grupos"
+
+msgid "History"
+msgstr "Historial"
+
+msgid "Empty"
+msgstr "Vac�
+
+msgid "Action"
+msgstr "Acci�
+msgid "User"
+msgstr "Usuario"
+
+msgid "Hostname"
+msgstr "Hostname"
+
+msgid "JobId"
+msgstr "IdTrabajo"
+
+msgid "JobSize"
+msgstr "Tama�abajo"
+
+msgid "JobPrice"
+msgstr "PrecioTrabajo"
+
+msgid "Copies"
+msgstr "Copias"
+
+msgid "JobBytes"
+msgstr "BytesTrabajo"
+
+msgid "PageCounter"
+msgstr "ContadorP�nas"
+
+msgid "Options"
+msgstr "Opciones"
+
+msgid "MD5Sum"
+msgstr "SumaMD5"
+
+msgid "BillingCode"
+msgstr "C�oDeFacturaci�
+msgid "Pages"
+msgstr "P�nas"
+
+msgid "Previous page"
+msgstr "P�na anterior"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Backend de contabilidad %s no soportado"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Archivo de configuraci�s no encontrado."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Opci�s no encontrada en la secci�lobal de %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Opci�s no encontrada en la secci�s de %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+"La opci�daptls est�stablecida, pero el certificado %s no se puede leer."
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "La opci�logger� s�soporta los valores %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Contador de p�nas %s inv�do para la impresora %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "La opci�accounter�, en la secci�s, s�soporta los valores %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "La opci�enforcement�, en la secci�s, s�soporta los valores %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+"La opci�onaccountererror�, en la secci�s, s�soporta los valores %s"
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Pol�ca %s inv�da para la impresora %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "La opci�policy�, en la secci�%s, s�soporta los valores %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Opci�mailto %s� inv�da para la impresora %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "La opci�mailto�, en la secci�s, s�soporta los valores %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr "Contador de m�mas denegaciones de banners %s inv�do"
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Tiempo de gracia %s inv�do"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Umbral %s para la opci�poor man� inv�do"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"El saldo de la cuota de impresi�e su cuenta es bajo.\n"
+"En breve no podr�olver a imprimir.\n"
+"Por favor, contacte con el Administrador de Cuotas de Impresi�ara "
+"resolver el problema."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"No puede imprimir porque su cuota de impresi�"
+"se ha excedido en la impresora %s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Pronto le ser�rohibida la impresi�debido a que\n"
+"su cuota de acerca al l�te en la impresora %s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr "La opci�ccountbanner, en la secci�s, s�soporta los valores %s"
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr "La opci�rustjobsize para la impresora %s  es incorrecta"
+
+msgid "Users"
+msgstr "Usuarios"
+
+msgid "Groups"
+msgstr "Grupos"
+
+msgid "Printers"
+msgstr "Impresoras"
+
+msgid "Users Print Quotas"
+msgstr "Cuotas de impresi�e los usuarios"
+
+msgid "Users Groups Print Quotas"
+msgstr "Cuotas de impresi�e los grupos de usuarios"
+
+msgid "History of Payments"
+msgstr "Historial de pagos"
+
+msgid "Printers Groups Membership"
+msgstr "Miembros del grupo de impresi�
+msgid "Users Groups Membership"
+msgstr "Miembros del grupo de usuarios"
+
+msgid "Comma Separated Values"
+msgstr "Valores separados por comas"
+
+msgid "Semicolon Separated Values"
+msgstr "Valores separados por puntos y coma"
+
+msgid "Tabulation Separated Values"
+msgstr "Valores separados por tabulaci�
+msgid "eXtensible Markup Language"
+msgstr "Lenguaje de Marcado eXtensible"
+
+msgid "CUPS' page_log"
+msgstr "page_log de CUPS"
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr "Modificador [%s] inv�do para la opci�-data, vea la ayuda."
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr "Modificador [%s] inv�do para la opci�-format, vea la ayuda."
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+"La salida XML est�eshabilitada debido a que el m�o jaxml no est�
+"disponible."
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "El volcado de datos de PyKota ha fallado : I/O error"
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Subsistema de registro de logs %s no soportado"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Informe para la cuota %s en la impresora %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Tiempo de gracia para p�nas: %i d�s) "
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Precio por trabajo: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Precio por p�na: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+"Grupo          recarga      utilizado blando  duro  balance de gracia     "
+"total       pago warn"
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+"Usuario        recarga      utilizado blando  duro  balance de gracia     "
+"total       pago warn"
+
+msgid "unknown"
+msgstr "Desconocido"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Real : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Total : %9i"
+
+msgid "N/A"
+msgstr "N/A"
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "�Reporter backend� %s no soportado"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Backend %s de almacenamiento de cuota no soportado"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr "Extra�roblema con uid(%s) : %s"
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr "Ejecut�ose como usuario '%s'."
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+"No hay ning�uario denominado 'pykota'. No se disminuyen los privilegios."
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr "Imposible disminuir los privilegios : %s"
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr "Privilegios disminuidos. Ejecut�ose ahora como usuario 'pykota'."
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr "Imposible recuperar los privilegios : %s"
+
+msgid "Regained priviledges. Now running as root."
+msgstr "Privilegios recuperados. Ejecut�ose ahora como root."
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "Imposible conectar con el servidor SMTP: %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Imposible enviar un correo electr�o a %s, error %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Entre en contacto con su administrador de sistema, por favor :\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Imposible encontrar al usuario %s en la impresora %s, se aplica la pol�ca "
+"por defecto (%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"No se ha encontrado el saldo del usuario %s, aplicando la pol�ca por "
+"defecto (%s) para la impresora %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr "No se cambiar�l usuario %s para imprimir."
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "Cuota de impresi�xcedida para el grupo %s en la impresora %s"
+
+msgid "Print Quota"
+msgstr "Cuota de impresi�
+msgid "Print Quota Exceeded"
+msgstr "Cuota de Impresi�xcedida"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Cuota de impresi�aja para el grupo %s en la impresora %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "Cuota de impresi�xcedida para el usuario %s en la impresora %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Cuota de impresi�aja para el usuario %s en la impresora %s"
+
+msgid "Print Quota Low"
+msgstr "Cuota de Impresi�aja"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Sistema de impresi�s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"No se ha podido calcular el tama�el trabajo con el analizador PDL "
+"gen�co : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "Se�SIGTERM recibida, trabajo %s cancelado."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Hostname de la impresora no definido, ajust�olo a �localhost�"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Sistema de impresi�esconocido, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Impresora %s no registrada en el sistema PyKota, aplicando la pol�ca "
+"externa (%s) para la impresora %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Usuario %s no registrado en el sistema PyKota, aplicando la pol�ca externa "
+"(%s) para la impresora %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"El usuario %s no posee cuota en la impresora %s bajo el sistema PyKota, "
+"aplicando la pol�ca externa (%s) para la impresora %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"La pol�ca externa %s para la impresora %s ha producido un error. Trabajo "
+"rechazado. Por favor, revise los archivos de configuraci�e PyKota."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Impresora %s no registrada en el sistema PyKota, aplicando la pol�ca por "
+"defecto (%s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Usuario %s no registrado en el sistema PyKota, aplicando la pol�ca por "
+"defecto (%s) para la impresora %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"el usuario %s no posee cuota en la impresora %s bajo el sistema PyKota, "
+"aplicando la pol�ca por defecto (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"La impresora %s no se ha registrado todav�en el sistema PyKota, se va a "
+"rechazar el trabajo"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"El usuario %s no se ha registrado todav�en el sistema PyKota, el trabajo "
+"se va a rechazar en la impresora %s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"El usuario %s no tiene todav�cuota en la impresora %s bajo el sistema "
+"PyKota, se va a rechazar el trabajo"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+"Ha ocurrido un problema mientras se estaba leyendo el contador de p�nas "
+"interno de la impresora %s."
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+"Recuperando el contador de p�nas de la impresora %s desde la base de datos "
+"en su lugar."
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+"No se ha podido recuperar el contador de p�nas interno de la impresora %s "
+"bien antes bien despu�de imprimir."
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "Tama�el trabajo forzado a 1 p�na para la impresora %s."
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr "No hay trabajos previos en la base de datos para la impresora %s."
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+"Valor inconsistente para el contador de p�nas interno de la impresora %s."
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Direcci�esconocida en HARDWARE(%s) para la impresora %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Arrancando HARDWARE(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr ""
+"Se ha enviado la se�SIGTERM al contador de p�nas hardware %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr "L�a [%s] saltada en la salida del contador. Intent�olo de nuevo..."
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "Contador por hardware %s cuyo c�o de salida es %s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Imposible consultar la impresora %s v�HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "Problema durante la conexi� %s:%s : %s"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "Problema mientras se enviaba la petici�JL a %s:%s : %s"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr "Esperando a que la impresora %s imprima..."
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "Esperando al estado inactivo de la impresora %s para estabilizar..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"Etapa de petici�JL interrumpida. Utilizando el �o valor visto en el "
+"contador interno de p�nas (%s) en la impresora %s."
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "Errores de red mientras se hac� peticiones en la impresora %s : %s"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr "Error de descodificaci�el mensaje SNMP para la impresora %s : %s"
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+"Se han encontrado problemas mientras se hac� peticiones SNMP en la "
+"impresora %s : %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"Etapa de petici�NMP interrumpida. Utilizando el �o valor visto en el "
+"contador interno de p�nas (%s) en la impresora %s."
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Arrancando SOFTWARE(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Imposible calcular el tama�el trabajo con el contador %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+"Ha ocurrido un problema mientras se estaba esperado a que terminase el "
+"contador software con pid %s: %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "C�o de salida %s para el contador por software %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"Los totales pueden ser err�s si algunos usuarios son miembros de varios "
+"grupos."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"La base de b�da %s parece no existir. Probablemente se deba a una mala "
+"configuraci�Por favor, verifique el archivo /etc/pykota/pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr ""
+"La b�da por %s(%s) desde %s(scope=%s) no ha devuelto ninguna respuesta."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Problema al a�r la entrada LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Problema al borrar la entrada LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Problema al modificar la entrada LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+"No se ha encontrado el objeto pykotaAccountBalance para el usuario %s. �Ha "
+"creado las entradas LDAP manualmente?"
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"No se ha podido encontrar una entrada objectClass %s existente con %s=%s "
+"para anexionar el objectClass pykotaAccount"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"No se ha podido encontrar una entrada existente para anexionar el "
+"objectClass pykotaGroup %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid "Invalid value [%s] for --filter command line option, see help."
+#~ msgstr ""
+#~ "Valor [%s] inv�do para la opci�e la l�a de comandos --filter, ver "
+#~ "ayuda."
+
+#~ msgid ""
+#~ "Internal SNMP accounting asked, but Python-SNMP is not available. Please "
+#~ "download it from http://pysnmp.sourceforge.net"
+#~ msgstr ""
+#~ "Se ha preguntado al contador SNMP interno, pero Python-SNMP no est�
+#~ "disponible. Desc�uelo desde http://pysnmp.sourceforge.net"
+
+#~ msgid ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Dumps PyKota database's content.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  dumpykota [options] [filterexpr]\n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints dumpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+#~ "                       \n"
+#~ "                         - history : dumps the jobs history.\n"
+#~ "                         - users : dumps users.\n"
+#~ "                         - groups : dumps user groups.\n"
+#~ "                         - printers : dump printers.\n"
+#~ "                         - upquotas : dump user quotas.\n"
+#~ "                         - gpquotas : dump user groups quotas.\n"
+#~ "                         - payments : dumps user payments.\n"
+#~ "                         - pmembers : dumps printer groups members.\n"
+#~ "                         - umembers : dumps user groups members.\n"
+#~ "                         \n"
+#~ "                       NB : the -d | --data command line option   \n"
+#~ "                       is MANDATORY.\n"
+#~ "  \n"
+#~ "  -f | --format fmt    Dumps datas in the 'fmt' format. When not "
+#~ "specified,\n"
+#~ "                       the format is to dump datas in the csv format "
+#~ "(comma\n"
+#~ "                       separated values). All data dumped is between "
+#~ "double\n"
+#~ "                       quotes. Allowed formats are :\n"
+#~ "                       \n"
+#~ "                         - csv : separate datas with commas\n"
+#~ "                         - ssv : separate datas with semicolons\n"
+#~ "                         - tsv : separate datas with tabs\n"
+#~ "                         - xml : dump data as XML\n"
+#~ "                         - cups : dump datas in CUPS' page_log format :\n"
+#~ "                                  ONLY AVAILABLE WITH --data history\n"
+#~ "                         \n"
+#~ "  -o | --output fname  All datas will be dumped to the file instead of\n"
+#~ "                       to the standard output. The special '-' filename\n"
+#~ "                       is the default value and means stdout.\n"
+#~ "                       WARNING : existing files are truncated !\n"
+#~ "                       \n"
+#~ "  Use the filter expressions to extract only parts of the \n"
+#~ "  datas. Allowed filters are of the form :\n"
+#~ "                \n"
+#~ "         key=value\n"
+#~ "                         \n"
+#~ "  Allowed keys for now are :  \n"
+#~ "                       \n"
+#~ "         username       User's name\n"
+#~ "         groupname      Users group's name\n"
+#~ "         printername    Printer's name\n"
+#~ "         pgroupname     Printers group's name\n"
+#~ "         \n"
+#~ "  Contrary to other PyKota management tools, wildcard characters are "
+#~ "not \n"
+#~ "  expanded, so you can't use them.\n"
+#~ "  \n"
+#~ "  NB : not all keys are allowed for each data type, so the result may "
+#~ "be \n"
+#~ "  empty if you use a key not available for a particular data type.\n"
+#~ "  \n"
+#~ "Examples :\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "  \n"
+#~ "  This dumps the history in a comma separated values file, for possible\n"
+#~ "  use in a spreadsheet.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "  \n"
+#~ "  Dumps all users datas to the users.xml file.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data history printername=HP2100 username=jerome\n"
+#~ "  \n"
+#~ "  Dumps the job history for user jerome on printer HP2100 only.\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Vuelca el contenido de la base de datos de PyKota.\n"
+#~ "\n"
+#~ "Uso desde la l�a de comandos:\n"
+#~ "\n"
+#~ "  dumpykota [opciones] [expresi�filtrado]\n"
+#~ "\n"
+#~ "opciones:\n"
+#~ "\n"
+#~ "  -v | --version       Muestra el n� de versi�e dumpykota y\n"
+#~ "                       luego sale.\n"
+#~ "  -h | --help          Muestra este mensaje y luego sale.\n"
+#~ "  \n"
+#~ "  -d | --data type     Vuelca los datos 'type'. Los tipos permitidos "
+#~ "son:\n"
+#~ "                       \n"
+#~ "                         - history  : vuelca el historial de trabajos.\n"
+#~ "                         - users    : vuelca los usuarios.\n"
+#~ "                         - groups   : vuelca los grupos de usuarios.\n"
+#~ "                         - printers : vuelca las impresoras.\n"
+#~ "                         - upquotas : vuelca las cuotas de usuario.\n"
+#~ "                         - gpquotas : vuelca las cuotas de los grupos\n"
+#~ "                                      de usuarios.\n"
+#~ "                         - payments : vuelca los pagos de los usuarios.\n"
+#~ "                         - pmembers : vuelca los miembros de los grupos\n"
+#~ "                                      de impresi�n"
+#~ "                         - umembers : vuelca los miembros de los grupos\n"
+#~ "                                      de usuarios.\n"
+#~ "                         \n"
+#~ "                       NB : la opci�d | --data de la l�a de "
+#~ "comandos\n"
+#~ "                       es OBLIGATORIA.\n"
+#~ "  \n"
+#~ "  -f | --format fmt    Vuelca los datos en el formato 'fmt'. Cuando no "
+#~ "se\n"
+#~ "                       especifique, el formato utilizado para el vuelco\n"
+#~ "                       de los datos ser�sv (valores separados por "
+#~ "comas).\n"
+#~ "                       Todos los datos volcados est�entre dobles "
+#~ "comillas.\n"
+#~ "                       Los formatos permitidos son:\n"
+#~ "                       \n"
+#~ "                         - csv : separa los datos con comas\n"
+#~ "                         - ssv : separa los datos con puntos y coma\n"
+#~ "                         - tsv : separa los datos con tabulaciones\n"
+#~ "                         - xml : vuelca los datos como XML\n"
+#~ "                         - cups : vuelca los datos en el formato page_log "
+#~ "de CUPS:\n"
+#~ "                                  DISPONIBLE �ICAMENTE CON --data "
+#~ "history\n"
+#~ "                         \n"
+#~ "  -o | --output fname  Se volcar�todos los datos a un fichero, en lugar "
+#~ "de a la\n"
+#~ "                       salida est�ar. El nombre de fichero especial '-' "
+#~ "es el\n"
+#~ "                       valor por defecto y significa stdout.\n"
+#~ "                       AVISO: �los ficheros existentes se truncar�\n"
+#~ "                       \n"
+#~ "  Utilice las expresiones de filtrado para extraer partes aisladas\n"
+#~ "  de los datos. Los filtros permitidos son de la forma:\n"
+#~ "                \n"
+#~ "         llave=valor\n"
+#~ "                         \n"
+#~ "  Las llaves permitidas, por ahora, son:\n"
+#~ "                       \n"
+#~ "         username       Nombre del usuario\n"
+#~ "         groupname      Nombre del grupo de usuarios\n"
+#~ "         printername    Nombre de la impresora\n"
+#~ "         pgroupname     Nombre del grupo de impresoras\n"
+#~ "         \n"
+#~ "  Al contrario que otras herramientas de administraci�e PyKota, los "
+#~ "caracteres\n"
+#~ "  comod�no se expandir� por lo que no puede utilizarlos.\n"
+#~ "  \n"
+#~ "  NB : no se permiten todas las llaves para todos los tipos de datos,\n"
+#~ "  por lo tanto, el resultado puede estar vac�si utiliza una llave\n"
+#~ "  que no est�isponible para un tipo particular de datos.\n"
+#~ "  \n"
+#~ "Ejemplos:\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv > mifichero.csv\n"
+#~ "  \n"
+#~ "  Esto vuelca el historial en un fichero con los valores separados\n"
+#~ "  por comas, para un posible uso en una hoja de c�ulo.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o usuarios.xml\n"
+#~ "  \n"
+#~ "  Vuelca todos los datos de los usuarios al archivo usuarios.xml.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data history printername=HP2100 username=jerome\n"
+#~ "  \n"
+#~ "  Vuelca �mente el historial de trabajos para el usuario\n"
+#~ "  jerome en la impresora HP2100 �mente.\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Por favor, env�los errores por correo electr�o a: %s"
+
+#~ msgid ""
+#~ "pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Generates banners.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  pkbanner  [options] \n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints pkbanner's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+#~ "                       be drawn at the center top of the page. The "
+#~ "default\n"
+#~ "                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+#~ "                       \n"
+#~ "  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+#~ "                       page sizes are recognized, like 'A4' or 'Letter'\n"
+#~ "                       to name a few. The default size is A4.\n"
+#~ "  \n"
+#~ "  -s | --savetoner s   Sets the text luminosity factor to s%%. This can "
+#~ "be \n"
+#~ "                       used to save toner. The default value is 0, which\n"
+#~ "                       means that no toner saving will be done.\n"
+#~ "  \n"
+#~ "  -u | --url u         Uses u as an url to be written at the bottom of \n"
+#~ "                       the banner page. The default url is :\n"
+#~ "                       http://www.librelogiciel.com/software/\n"
+#~ "  \n"
+#~ "examples :                              \n"
+#~ "\n"
+#~ "  Using pkbanner directly from the command line is not recommended,\n"
+#~ "  excepted for testing purposes. You should use pkbanner in the\n"
+#~ "  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+#~ "  \n"
+#~ "    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+#~ "  \n"
+#~ "      With such a setting in pykota.conf, all print jobs will be \n"
+#~ "      prefixed with an A4 banner with no logo, and text luminosity will\n"
+#~ "      be increased by 75%%. The PostScript output will be directly sent\n"
+#~ "      to your printer.\n"
+#~ "      \n"
+#~ "  You'll find more examples in the sample configuration file "
+#~ "included    \n"
+#~ "  in PyKota.\n"
+#~ "      \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Genera banners.\n"
+#~ "\n"
+#~ "Uso desde la l�a de comandos:\n"
+#~ "\n"
+#~ "  pkbanner  [opciones] \n"
+#~ "\n"
+#~ "opciones:\n"
+#~ "\n"
+#~ "  -v | --version       Muestra el n� de versi�e pkbanner y sale.\n"
+#~ "  -h | --help          Muestra este mensaje y sale.\n"
+#~ "  \n"
+#~ "  -l | --logo img      Utiliza la imagen como el logotipo del banner. El\n"
+#~ "                       logotipo se dibujar�n la parte superior central "
+#~ "de\n"
+#~ "                       la p�na. El logotipo por defecto es\n"
+#~ "                       /usr/share/pykota/logos/pykota.jpeg\n"
+#~ "                       \n"
+#~ "  -p | --pagesize sz   Establece el tama�e la p�na a sz. Reconoce "
+#~ "los\n"
+#~ "                       tama�de p�na m�conicidos, como 'A4' o "
+#~ "'Letter',\n"
+#~ "                       por nombrar unos pocos. El tama�or defecto es "
+#~ "A4.\n"
+#~ "  \n"
+#~ "  -s | --savetoner s   Establece el factor de luminosidad del texto a s%"
+#~ "%.\n"
+#~ "                       Se puede utilizar para ahorar toner. El valor por\n"
+#~ "                       defecto es 0, lo que significa que no se va a\n"
+#~ "                       ahorrar toner.\n"
+#~ "  \n"
+#~ "  -u | --url u         Se utilizar� como la url que se escribir�n la\n"
+#~ "                       parte inferior de la p�na del banner. La url "
+#~ "por\n"
+#~ "                       defecto es: http://www.librelogiciel.com/"
+#~ "software/\n"
+#~ "  \n"
+#~ "ejemplos:\n"
+#~ "\n"
+#~ "  No se recomienda el uso de pkbanner desde la l�a de comandos\n"
+#~ "  directamente, excepto para pruebas. Deber�utilizar pkbanner\n"
+#~ "  en las directivas 'startingbanner' o 'endingbanner' del\n"
+#~ "  archivo de configuraci�ykota.conf\n"
+#~ "  \n"
+#~ "    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+#~ "  \n"
+#~ "      Si se establece esto en pykota.conf, a todos los trabajos\n"
+#~ "      de impresi�e anteceder�n banner en A4 sin logotipo,\n"
+#~ "      y la luminosidad del texto se incrementar�n un 75%%.\n"
+#~ "      La salida PostScript se enviar�irectamente a su impresora.\n"
+#~ "      \n"
+#~ "  Encontrar��ejemplos en el archivo de configuraci�e ejemplo\n"
+#~ "  distribu� con PyKota.\n"
+#~ "      \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Por favor, env�los errores por correo electr�o a: %s"
Index: pykota/tags/1.22/po/fr/pykota.po
===================================================================
--- pykota/tags/1.22/po/fr/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/fr/pykota.po (revision 2228)
@@ -0,0 +1,2759 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota french translation file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2005-02-22 19:21:00+0100\n"
+"Last-Translator: Jerome Alet <alet@librelogiciel.com>\n"
+"Language-Team: French <alet@librelogiciel.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Un outil pour automatiser la cr�ion des comptes et l'initialisation\n"
+"du solde.\n"
+"\n"
+"CET OUTIL NE DOIT PAS �RE UTILIS�SI VOUS LIMITEZ VOS UTILISATEURS PAR\n"
+"QUOTA !\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  CET OUTIL NE DOIT PAS �RE UTILIS�DEPUIS LA LIGNE DE COMMANDE MAIS\n"
+"  SEULEMENT DANS UNE external policy DANS pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance valeur } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version d'autopykota et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -i | --initbalance b Positionne le solde initial de l'utilisateur �.\n"
+"                       Si l'utilisateur existe d�, le solde actuel reste\n"
+"                       inchang�Si non indiqu�la valeur par d�ut est "
+"0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr "Le code de sortie du g�rateur de banni�s %s est %s"
+
+msgid "Job contains no data. Printing is denied."
+msgstr ""
+"Le travail d'impression ne contient aucune donn� L'impression est rejet�"
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr "Le travail d'impression est un doublon. Impression interdite."
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+"La banni� ne sera pas imprim�: compteur maximum de banni�s rejet� "
+"atteint."
+
+msgid "Job accounting begins."
+msgstr "D�t du d�mpte pour le travail d'impression"
+
+msgid "Job accounting ends."
+msgstr "Fin du d�mpte pour le travail d'impression"
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr ""
+"Taille du travail d'impression forc�� car l'impression est rejet�"
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+"Attention : taille calcul�du travail d'impression (%s) != taille "
+"pr�lcul�du travail d'impression (%s)"
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+"La taille du travail d'impression sera utilis�quand m�, en accord avec "
+"la directive 'trustjobsize'"
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+"La taille du travail d'impression sera utilis�car elle est inf�eure �a "
+"limite %s de la directive 'trustjobsize'"
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+"La taille du travail d'impression sera modifi�en accord avec la directive "
+"'trustjobsize' : %s"
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Taille du travail d'impression : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Mise �our du quota de l'utilisateur %s sur l'imprimante %s"
+
+msgid "Job added to history."
+msgstr "Travail d'impression ajout� l'historique."
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+"Le fichier num� %s a � retir�eux fois de l'objet poll, action ignor�"
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "SIGTERM a � envoy�u vrai backend %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "Le backend CUPS %s est sorti anormalement."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Exporte le contenu de la base de donn� de PyKota.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  dumpykota [options] [exprfiltre]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de dumpykota et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -d | --data type     Exporte les donn� de type 'type'.\n"
+"                       Les types autoris�sont :\n"
+"                       \n"
+"                         - history : exporte l'historique des travaux.\n"
+"                         - users : exporte les utilisateurs.\n"
+"                         - groups : exporte les groupes d'utilisateurs.\n"
+"                         - printers : exporte les imprimantes.\n"
+"                         - upquotas : exporte les quotas des utilisateurs.\n"
+"                         - gpquotas : exporte les quotas des groupes.\n"
+"                         - payments : exporte l'historique des paiements.\n"
+"                         - pmembers : exporte les membres des groupes\n"
+"                                      d'imprimantes.\n"
+"                         - umembers : exporte les membres des groupes\n"
+"                                      d'utilisateurs.\n"
+"                         \n"
+"                       NB : l'option de ligne de commande -d | --data est\n"
+"                       OBLIGATOIRE.\n"
+"  \n"
+"  -f | --format fmt    Exporte les donn� dans le format 'fmt' sp�fi�n"
+"                       Si non pr�s�le format sera csv (champs s�r�n"
+"                       par des virgules).\n"
+"                       Toutes les donn� sont export� entre double "
+"quotes.\n"
+"                       Les formats autoris�sont :\n"
+"                       \n"
+"                         - csv : donn� s�r� par des virgules\n"
+"                         - ssv : donn� s�r� par des point-virgules\n"
+"                         - tsv : donn� s�r�par des tabulations\n"
+"                         - xml : donn� export� au format XML\n"
+"                         - cups : donn� export� au format page_log\n"
+"                                  de CUPS : DISPONIBLE SEULEMENT\n"
+"                                            AVEC --data history\n"
+"                         \n"
+"  -o | --output nomf   Toutes les donn� seront export� vers un fichier\n"
+"                       plut�ue vers la sortie standard. Le nom sp�al "
+"'-'\n"
+"                       est la valeur par d�ut indiquant la sortie "
+"standard.\n"
+"                       ATTENTION : les fichiers existants sont tronqu�!\n"
+"  \n"
+"  Utilisez les expressions de filtrage pour extraire seulement certaines \n"
+"  parties des donn�. Les filtres autoris�sont de la forme :\n"
+"                \n"
+"         cl�aleur\n"
+"                         \n"
+"  Les cl�autoris� pour l'instant sont : \n"
+"                       \n"
+"         username       Nom de l'utilisateur\n"
+"         groupname      Nom du groupe d'utilisateurs\n"
+"         printername    Nom de l'imprimante\n"
+"         pgroupname     Nom du groupe d'imprimantes\n"
+"         hostname       Nom d'h�de la machine cliente\n"
+"         billingcode    Code de facturation du travail d'impression\n"
+"         \n"
+"  Contrairement aux autres outils d'administration de PyKota, les "
+"caract�s\n"
+"  jokers ne sont pas expans� aussi vous ne pouvez pas les utiliser.\n"
+"  \n"
+"  NB : toutes les cl�ne sont pas autoris� pour chaque type de donn�, \n"
+"  aussi le r�ltat peut �e vide si vous utilisez une cl�ndisponible \n"
+"  pour un type de donn� particulier.\n"
+"  \n"
+"Exemples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >monfichier.csv\n"
+"  \n"
+"  Ceci va exporter l'historique dans un fichier �hamps s�r�par des\n"
+"  virgules, par exemple pour r�portation dans un tableur.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o util.xml\n"
+"  \n"
+"  Exporte toutes les donn� des utilisateurs dans le fichier util.xml\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Exporte l'historique des travaux de l'utilisateur jerome sur l'imprimante\n"
+"  HP2100 seulement.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+"L'option de ligne de commande -d | --data est obligatoire, voir l'aide."
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Un �teur de quotas pour PyKota.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  edpykota [options] utilisateur1 utilisateur2 ... utilisateurN\n"
+"  \n"
+"  edpykota [options] groupe1 groupe2 ... groupeN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version d'edpykota et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -a | --add           Ajoute des utilisateurs et/ou des imprimantes\n"
+"                       s'ils n'existent pas d� dans la base de donn�.\n"
+"                       \n"
+"  -d | --delete        Efface des utilisateurs ou des groupes depuis\n"
+"                       la base de donn�.                       Les "
+"imprimantes ne sont jamais effac�.\n"
+"                       \n"
+"  -c | --charge p[,j]  Positionne le co�r page et par travail\n"
+"                       sur l'imprimante. Le prix par travail est optionel.\n"
+"                       Si les deux sont positionn� il faut les s�rer\n"
+"                       par une virgule. Les nombres r�s sont autoris�\n"
+"                       \n"
+"  -o | --overcharge f  Positionne le facteur de surtaxe qui sera appliqu�\n"
+"                       l'utilisateur lors du calcul du co�un travail\n"
+"                       d'impression. Les valeurs r�les positives ou\n"
+"                       n�tives sont autoris�, ce qui permet de faire\n"
+"                       des choses tr�cr�ives comme donner de l'argent\n"
+"                       �n utilisateur chaque fois qu'il imprime.\n"
+"                       Le nombre de pages d'un travail d'impression n'est\n"
+"                       pas modifi�ar ce coefficient, seulement le co�\n"
+"                       travail pour un utilisateur particulier.\n"
+"                       Seuls les utilisateurs ont un tel coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...] Place les utilisateurs dans chacun des groupes\n"
+"                             list� separ�par des virgules. Les groupes\n"
+"                             doivent d� exister dans la base de donn�.\n"
+"  \n"
+"  -u | --users         Modifie les quotas utilisateur, c'est la valeur\n"
+"                       par d�ut.\n"
+"  \n"
+"  -P | --printer p     Modifie les quotas sur l'imprimante p seulement.\n"
+"                       En fait p peut contenir des caract�s jokers\n"
+"                       pour s�ctionner seulement certaines imprimantes.\n"
+"                       La valeur par d�ut est *, qui signifie toutes les\n"
+"                       imprimantes. \n"
+"                       Vous pouvez sp�fier plusieurs noms ou jokers,\n"
+"                       en les s�rant avec des virgules.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Ajoute l'imprimante aux groupes d'imprimantes\n"
+"                       pg1, pg2, etc... qui doivent d� exister.\n"
+"                       Un groupe d'imprimantes est comme une imprimante\n"
+"                       normale, sauf que celle-ci est inconnue du syst�\n"
+"                       d'impression. On cr�des groupes d'imprimantes de "
+"la\n"
+"                       m� mani� que des imprimantes normale, et ensuite\n"
+"                       on y ajoute d'autres imprimantes avec cette option.\n"
+"                       Le d�mpte est fait sur une imprimante et sur tous\n"
+"                       les groupes d'imprimantes auxquels elle appartient,\n"
+"                       la v�fication de quota est faite sur une "
+"imprimante\n"
+"                       et sur tous les groupes d'imprimantes auxquels elle\n"
+"                       appartient.\n"
+"  \n"
+"  -g | --groups        Modifie les quotas de groupes plut�ue ceux des\n"
+"                       utilisateurs.\n"
+"                       \n"
+"  -p | --prototype u|g Prend l'utilisateur u ou le groupe g comme mod�\n"
+"                       pour positionner le quota d'impression.\n"
+"                       \n"
+"  -n | --noquota       Ne d�nit aucun quota, mais laisse le d�mpte "
+"actif.\n"
+"  \n"
+"  -r | --reset         Remet �� le compteur de pages courant pour\n"
+"                       l'utilisateur ou le groupe sur les imprimantes\n"
+"                       sp�fi�.\n"
+"                       Le compteur de pages '�rnel' est inchang�n"
+"                       \n"
+"  -R | --hardreset     Remet �� les compteurs de pages courant et\n"
+"                       '�rnel' pour l'utilisateur ou le groupe sur les\n"
+"                       imprimantes sp�fi�. Ceci est un raccourci\n"
+"                       pour '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     D�nit le facteur de limitation pour l'utilisateur\n"
+"                       ou le groupe : soit par le solde du compte "
+"(balance),\n"
+"                       soit par le quota par pages.\n"
+"                       La valeur par d�ut est 'quota'. Les valeurs\n"
+"                       autoris� sont 'quota' 'balance' 'quota-then-"
+"balance'\n"
+"                       'balance-then-quota'.\n"
+"                       ATTENTION : quota-then-balance et balance-then-quota\n"
+"                       ne sont pas encore impl�nt�.\n"
+"                       \n"
+"  -b | --balance b     Fixe le solde de l'utiliateur �a valeur b.\n"
+"                       Le solde peut aussi �e incr�nt�u d��nt�"
+"                       si b est pr�d�'un signe + ou -.\n"
+"                       ATTENTION : si on d��nte le solde, le total\n"
+"                       r��ar l'utilisateur est d��nt�ussi.\n"
+"                       Les groupes n'ont pas de solde, leur solde est la\n"
+"                       somme des soldes des utilisateurs membres.\n"
+"                       \n"
+"  -S | --softlimit sl  Fixe la limite souple �l pages.\n"
+"  \n"
+"  -H | --hardlimit hl  Fixe la limite dure �l pages.\n"
+"\n"
+"  -U | --used usage    Positionne les compteurs de pages de l'utilisateur �"
+"                       la valeur usage; utile pour migrer des utilisateurs\n"
+"                       depuis un logiciel diff�nt dans lequel ils ont "
+"d�\n"
+"                       imprim�uelques pages. Les compteurs de pages "
+"actuels\n"
+"                       et globaux peuvent �e incr�nt�ou d��nt�"
+"si\n"
+"                       usage est pr�x�'un signe + ou -.\n"
+"                       ATTENTION : LES DEUX compteurs de pages sont "
+"modifi�n"
+"                       dans tous les cas, donc soyez prudents.\n"
+"                       NB : si 'usage' vaut '0', alors l'action effectu�n"
+"                       est identique �elle effectu�avec --hardreset.\n"
+"  \n"
+"  les noms d'utilisateurs ou de groupes peuvent contenir des caract�s\n"
+"  joker si l'option --add n'est pas utilis�\n"
+"  \n"
+"exemples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  Ceci va ajouter les utilisateurs john, paul, george and ringo �a base\n"
+"  de donn�, et fixer leur quota par pages �a m� valeur que\n"
+"  l'utilisateur jerome. L'utilisateur jerome doit exister.\n"
+"  L'adresse email de ringo sera fix��ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  Ceci va fixer une limite souple de 50 pages et une limite dure de 60 "
+"pages\n"
+"  pour l'utilisteur jerome sur l'imprimante lp.\n"
+"  Si l'utilisateur jerome ou l'imprimante lp n'existent pas dans la base de\n"
+"  donn�alors aucune modification n'est effectu�\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Comme ci-dessus, mais l'utilisateur jerome et l'imprimante lp sont "
+"ajout�n"
+"  automatiquement s'ils n'existaient pas. L'utilisateur jerome est aussi\n"
+"  ajout�aux groupes \"coders\" et \"it\" quoi doivent d� exister dans\n"
+"  la base de donn�.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  Ceci va fixer une limite souple de 500 pages et une limite dure de 550\n"
+"  pages pour les groupes financial et support sur toutes les imprimantes.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  Ceci va remettre �� le compteur de pages courant de jerome sur toutes\n"
+"  les imprimantes, ainsi que pour chaque utilisateur dont le nom commence\n"
+"  par 'jo'.\n"
+"  Leurs compteurs '�rnels' ne seront pas modifi�\n"
+"  Vous pouvez �lement remettre �� les compteurs '�rnels' gr� �"
+"  l'option --hardreset | -R de la ligne de commande.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  Ceci indique �yKota de ne pas limiter jerome lorsqu'il va imprimer\n"
+"  sur l'imprimante hpcolor. Tous ses travaux seront autoris�sur cette\n"
+"  imprimantes, mais la comptabilit�e ses impressions sera quand m�\n"
+"  tenue. Les quotas des autres utilisateurs sont inchang�\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  Ceci indique �yKota de limiter jerome par le solde de son compte\n"
+"  lorsqu'il imprime.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  Ceci va incr�nter le solde de jerome de 10.0 unit�(dans votre\n"
+"  propre monnaie). Vous pouvez d��nter ce solde en utilisant le signe\n"
+"  n�tif, et positionner la valeur en n'utilisant aucun signe.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  Ceci va compl�ment effacer les utilisateurs jerome et rachel de la base\n"
+"  de donn�. Tous leurs quotas et leurs historiques seront aussi effac�\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  Ceci va fixer le co�r page �.1 unit�ur l'imprimante lp. Le co�
+"  d'un travail ne sera pas modifi�n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  Ceci va ajouter les imprimantes hplj1 et hplj2 dans les groupes\n"
+"  d'imprimantes Laser et HP.\n"
+"  En imprimant sur hplj1 ou hplj2, les quotas seront �lement v�fi�n"
+"  et comptabilis�sur les imprimantes virtuelles Laser et HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 pauvreetudiant\n"
+"  \n"
+"  Ceci va surtaxer l'utilisateur pauvreetudiant par un facteur de 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  L'utilisateur jerome va gagner de l'argent �haque fois qu'il imprimera.\n"
+"  \n"
+"  $ edpykota --overcharge 0 patron\n"
+"  \n"
+"  L'utilisateur patron peut imprimer �olont�cela ne lui co� rien\n"
+"  car le co� chaque travail d'impression sera multipli�ar z� avant\n"
+"  de d�ter son compte.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+msgid "You're not allowed to use this command."
+msgstr "Vous n'�s pas autoris�) �tiliser cette commande."
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr "Valeur %s invalide pour le nombre de pages utilis�."
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Valeur %s invalide pour la limite souple."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Valeur %s invalide pour la limite dure."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+"Limite dure %i est inf�eure �a limite souple %i, les valeurs seront "
+"�ang�. "
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr "Valeur %s invalide pour la surtaxe."
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Valeur %s du solde invalide"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Montant �omptabiliser %s invalide"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Valeur de l'option limitby %s invalide"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Impossible d'ajouter l'imprimante %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Nom d'imprimante %s invalide"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Aucune imprimante ne correspond �s"
+
+msgid "You have to pass user or group names on the command line"
+msgstr ""
+"Vous devez passer des noms d'utilisateurs ou de groupes sur la ligne de "
+"commande"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Objet prototype %s introuvable dans le Quota Storage."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prototype %s non trouv�ans le Quota Storage pour l'imprimante %s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+"Limite dure ind�nie, positionn��a limite souple (%s) sur l'imprimante %"
+"s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr ""
+"Limite souple ind�nie, positionn��a limite dure (%s) sur l'imprimante %"
+"s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Adresse �ctronique %s invalide"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr "Groupe %s inconnu"
+
+#, python-format
+msgid "Unknown user %s"
+msgstr "Utilisateur %s inconnu"
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Nom de groupe %s invalide"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Nom d'utilisateur %s invalide"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Quota non trouv�our l'objet %s sur l'imprimante %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Groupe %s non trouv�ans le Quota Storage."
+
+msgid "incompatible options, see help."
+msgstr "options incompatibles, voir l'aide."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "D�mpte logiciel d� effectu�urant la premi� phase. Ignor�
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "D�mpte mat�el d� effectu�urant la premi� phase. Ignor�
+
+msgid "Job size and price now set in history."
+msgstr "Taille et co� travail d�rmais �our dans l'historique."
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr "Inconnu"
+
+msgid "Username"
+msgstr "Utilisateur"
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr "Travail"
+
+msgid "Date"
+msgstr "Date"
+
+msgid "Allowed"
+msgstr "Autoris�
+msgid "Denied"
+msgstr "Rejet�
+msgid "Allowed with Warning"
+msgstr "Autoris�vec Avertissement"
+
+msgid "Result"
+msgstr "R�ltat"
+
+msgid "Title"
+msgstr "Titre"
+
+msgid "Filename"
+msgstr "Fichier"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr "Pages d� imprim� sur %s"
+
+msgid "Account balance"
+msgstr "Solde"
+
+msgid "Soft Limit"
+msgstr "Limite Souple"
+
+msgid "Hard Limit"
+msgstr "Limite Dure"
+
+msgid "Date Limit"
+msgstr "Date Limite"
+
+msgid "Allowed range is (0..99)"
+msgstr "L'intervalle permis est (0..99)"
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr "Valeur %s invalide pour l'option 'savetoner' : %s"
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr "Valeur %s invalide pour l'option 'pagesize', utilisation de A4."
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Un outil pour d�cter la meilleure m�ode de d�mpte pour chaque\n"
+"imprimante.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  pkhint [options] [impr1 impr2 impr3 ... imprN] <fichier.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de pkhint et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"exemples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Va analyser votre syst� d'impression pour d�cter quelle est la\n"
+"  meilleure m�ode de d�mpte pour chacune des imprimantes d�nies\n"
+"  dont le nom correspond aux param�es.\n"
+"  \n"
+"  Si vous ne passer aucune argument sur la ligne de commande, toutes les\n"
+"  imprimantes seront analys�.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "DeviceURI invalide : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Merci de patienter pendant que pkhint analyse la configuration de votre "
+"syst� d'impression..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "P�ph�que %s inconnu pour l'imprimante %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"Mettez les lignes suivantes dans votre fichier /etc/pykota/pykota.conf :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr ""
+"# ATTENTION : si le d�mpte software est sugg�, cela ne veut pas dire"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# que le d�mpte hardware ne fonctionnerait pas, cela veut seulement dire "
+"que PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# n'a pas � capable de d�cter automatiquement quelle m�ode de d�mpte "
+"hardware utiliser."
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Passerelle courrier �ctronique pour PyKota.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de pkmail et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"    \n"
+"  Cette commande est faite pour �e utilis�depuis la base de donn�\n"
+"  d'alias de votre serveur de courrier �ctronique, en tant que pipe.\n"
+"  Elle va accepter les commandes qui lui sont envoy� dans des messages\n"
+"  et renverra sa r�nse �'exp�teur de la demande.\n"
+"  \n"
+"  Pour utiliser cette commande, cr� un alias email dans /etc/aliases\n"
+"  avec le format suivant :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Puis lancez la commande 'newaliases' pour r�n�r la base de donn�\n"
+"  d'alias.\n"
+"  \n"
+"  Vous pouvez maintenant envoyer vos demandes par email �'adresse\n"
+"  'pykotacmd@yourdomain.com', avec la commande dans le champ sujet.\n"
+"  \n"
+"  Liste des commandes support� :\n"
+"  \n"
+"        report [utilisateur]\n"
+"  \n"
+"  NB : Pour que pkmail fonctionne correctement, il se peut que vous ayez �"
+"  mettre l'utilisateur 'mail' dans le groupe syst� 'pykota' afin "
+"d'assurer\n"
+"  que cet utilisateur puisse lire le fichier /etc/pykota/pykotadmin.conf,\n"
+"  et de relancer votre serveur de courrier �ctronique (par exemple\n"
+"  /etc/init.d/exim restart). Cependant, il est fortement conseill�ue vous\n"
+"  r��issiez plut�eux fois qu'une avant de faire ceci.\n"
+"  \n"
+"  Utilisez �os risques et p�ls !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Un gestionnaire d'imprimantes pour PyKota.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  pkprinters [options] impr1 impr2 impr3 ... imprN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de pkprinters et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -a | --add           Ajoute les imprimantes si elles n'existent pas d�\n"
+"                       dans la base de donn�. Si elles existent, alors\n"
+"                       elles sont modifi� sauf si l'option de ligne de\n"
+"                       commande -s|--skipexisting est aussi utilis�\n"
+"                       \n"
+"  -d | --delete        Supprime les imprimantes de la base de donn�.\n"
+"  \n"
+"  -D | --description d Ajoute une description textuelle aux imprimantes.\n"
+"                       \n"
+"  -c | --charge p[,j]  Fixes les co�ar page et par travail.\n"
+"                       Le co�r travail d'impression est optionnel.\n"
+"                       Si les deux sont utilis� s�rez les nombres par\n"
+"                       une virgule.\n"
+"                       Les nombres n�tifs ou avec d�males sont "
+"autoris�\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Ajoute ou supprime les imprimantes des groupes\n"
+"                       pg1, pg2, etc... qui doivent d� exister.\n"
+"                       Un groupe d'imprimantes est comme une imprimante\n"
+"                       normale mais est inconnu du syst� d'impression.\n"
+"                       On cr�les groupes d'imprimantes de la m� mani�\n"
+"                       que l'on cr�des imprimantes, et ensuite on leur\n"
+"                       ajoute des imprimantes avec cette option.\n"
+"                       Le d�mpte et la v�fication sont effectu�sur\n"
+"                       une imprimante et sur tous les groupes auxquels elle\n"
+"                       appartient.\n"
+"                       Si l'option --remove ci-dessous n'est pas utilis�\n"
+"                       l'action par d�ut est d'ajouter les imprimantes "
+"aux\n"
+"                       groupes d'imprimantes sp�fi�\n"
+"                       \n"
+"  -l | --list          Liste les informations sur les imprimantes et les\n"
+"                       groupes dont elles sont membres.\n"
+"                       \n"
+"  -r | --remove        Combin�avec l'option --groups ci-dessus, supprime\n"
+"                       les imprimantes des groupes sp�fi�\n"
+"                       \n"
+"  -s | --skipexisting  Combin�avec l'option --add ci-dessus, indique\n"
+"                       �kprinters de ne pas modifier les imprimantes\n"
+"                       existantes.\n"
+"  \n"
+"  Les noms d'imprimantes peuvent contenir des caract�s jokers si l'option\n"
+"  --add n'est pas utilis�\n"
+"  \n"
+"exemples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"Imprimante HP\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Ceci va cr� les trois imprimantes hp2100, hp2200 and hp8000.\n"
+"  Leur co�r page sera fix� 0.05 unit�et leur co�r travail sera\n"
+"  fix� 0.1 unit�Les unit�sont dans votre propre monnaie,\n"
+"  ou dans ce que vous voulez qu'elles signifient.\n"
+"  Leurs descriptions seront positionn� �"Imprimante HP\".\n"
+"  Si l'une de ces imprimantes existe d�, elle sera modifi��oins que\n"
+"  l'option -s|--skipexisting ne soit aussi utilis�\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  Ceci va compl�ment effacer toutes les imprimantes, leurs informations\n"
+"  de quota ainsi que leurs historiques des travaux. SOYEZ PRUDENTS !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  Ceci ba mettre toutes les imprimantes dont le nom correspond �"hp*\"\n"
+"  dans les groupes Laser et HP, qui DOIVENT d� exister.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  Ceci va enlever l'imprimante hp2200 du groupe LexMark.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "L'imprimante %s existe d�, ignor�"
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "L'imprimante %s existe d�, elle sera modifi�"
+
+msgid "in"
+msgstr "dans"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+"Vous devez passer des noms de groupes d'imprimantes sur la ligne de commande"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Vous devez passer des noms d'imprimantes sur la ligne de commande"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Un afficheur OSD de quota d'impression pour PyKota.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de pykosd et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -c | --color #rrggbb Fixe la couleur �tiliser pour l'affichage �n\n"
+"                       triplet hexadecimal, par exemple #FF0000 est 100%%\n"
+"                       de rouge.\n"
+"                       La valeur par d�ut est 100%% de vert (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Fixe la dur�de l'affichage en secondes. \n"
+"                       La valeur par d�ut est de 3 secondes.\n"
+"                       \n"
+"  -f | --font f        Fixe la police de caract�s �tiliser pour\n"
+"                       l'affichage.\n"
+"                       La valeur par d�ut est celle de la librairie\n"
+"                       Python OSD.\n"
+"                       \n"
+"  -l | --loop n        Fixe le nombre de fois o�nformation sera "
+"affich�\n"
+"                       La valeur par d�ut est 0, qui indique un nombre\n"
+"                       d'affichages infini.\n"
+"                       \n"
+"  -s | --sleep s       Fixe la dur�en secondes de sommeil entre deux\n"
+"                       affichages. La valeur par d�ut est 180 (3 "
+"minutes).\n"
+"                       \n"
+"  \n"
+"exemples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Lance pykosd. L'affichage sera rafra�it toutes les 60 secondes,\n"
+"  et persistera pendant 3 secondes (la valeur par d�ut) �haque fois.\n"
+"  Apr�5 it�tions, le programme se terminera.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Option duration %s invalide"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Option loop %s invalide"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Option sleep %s invalide"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Option color %s invalide"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "L'utilisateur %s n'existe pas dans la base PyKota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "Pages utilis� sur %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Unites PyKota restantes : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Fait des devis d'impression aux utilisateurs.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  pykotme  [options]  [fichiers]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de pykotme et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -P | --printer p     Fait un devis sur cette imprimante seulement.\n"
+"                       En fait p peut contenir des caract�s jokers\n"
+"                       pour s�ctionner seulement certaines imprimantes.\n"
+"                       La valeur par d�ut est *, qui signifie toutes les\n"
+"                       imprimantes. \n"
+"                       Vous pouvez sp�fier plusieurs noms ou jokers,\n"
+"                       en les s�rant avec des virgules.\n"
+"  \n"
+"exemples :                              \n"
+"\n"
+"  $ pykotme --printer apple fichier1.ps fichier2.ps\n"
+"  \n"
+"  Ceci va �blir un devis d'impression pour l'utilisateur courant.\n"
+"  Ce devis indiquera la taille et le co�r l'imprimante apple d'un\n"
+"  travail d'impression consitant en fichier1.ps et fichier2.ps\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <fichier1.ps\n"
+"  \n"
+"  Ceci va �blir un devis d'impression pour l'utilisateur courant.\n"
+"  Ce devis indiquera la taille et le co�un travail provenant de "
+"l'entr�n"
+"  standard dans laquelle on redirigerait le fichier fichier1.ps et qui\n"
+"  serait envoy�sur les imprimantes apple ou hplaser.\n"
+"\n"
+"  $ pykotme \n"
+"  Ceci va �blir un devis d'impression pour l'utilisateur courant.\n"
+"  Ce devis indiquera la taille et le co�un travail provenant de "
+"l'entr�n"
+"  standard, et ce pour chaque imprimante.\n"
+"  \n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Votre solde : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Taille du job : %i pages"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Co�r l'imprimante %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"G�re des rapports de quotas d'impression.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de repykota et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -u | --users         G�re un rapport sur les quotas des utilisateurs,\n"
+"                       c'est la valeur par d�ut.\n"
+"  \n"
+"  -g | --groups        G�re un rapport sur les quotas de groupes plut�"
+"                       que sur ceux des utilisateurs.\n"
+"  \n"
+"  -P | --printer p     Renvoie les quotas pour cette imprimante seulement.\n"
+"                       En fait p peut contenir des caract�s jokers pour\n"
+"                       s�ctionner certaines imprimantes seulement.\n"
+"                       La valeur par d�ut est *, qui signifie de v�fier\n"
+"                       les quotas sur toutes les imprimantes.\n"
+"                       Vous pouvez pr�ser plusieurs noms ou jokers,\n"
+"                       en les s�rant avec des virgules.\n"
+"\n"
+"exemples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  Ceci va afficher un rapport de quotas pour tous les utilisateurs de\n"
+"  l'imprimante lp.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  Ceci va afficher un rapport pour tous les utilisateurs sur toutes les\n"
+"  imprimantes.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  Ceci va afficher un rapport pour l'utilisateur jerome et tous les\n"
+"  utilisateurs dont le nom commence par \"jo\" sur toutes les imprimantes\n"
+"  dont le nom commence par \"laser\" ou se termine par \"pson\".\n"
+"  \n"
+"  Si cette commande est lanc�par un utilisateur qui n'est pas un\n"
+"  administrateur PyKota, les arguments additionnels repr�ntant des noms\n"
+"  d'utilisateurs ou de groupes sont ignor� et un rapport traitant "
+"seulement\n"
+"  de l'utilisateur ou du groupe courant est g�r�n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Pr�ent les utilisateurs ayant atteint leurs limites.\n"
+"\n"
+"ligne de commande :\n"
+"\n"
+"  warnpykota  [options]  [noms]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Affiche la version de warnpykota et quitte.\n"
+"  -h | --help          Affiche ce message et quitte.\n"
+"  \n"
+"  -u | --users         Pr�ent les utilisateur ayant atteint leurs "
+"limites,\n"
+"                       c'est la valeur par d�ult.\n"
+"  \n"
+"  -g | --groups        Pr�ent les utilisateurs dont les groupes auxquels\n"
+"                       ils appartiennent ont atteint leurs limites.\n"
+"  \n"
+"  -P | --printer p     Verifie les quotas sur cette imprimante seulement.\n"
+"                       En fait p peut contenir des caract�s jokers pour\n"
+"                       s�ctionner certaines imprimantes seulement.\n"
+"                       La valeur par d�ut est *, qui signifie de v�fier\n"
+"                       les quotas sur toutes les imprimantes.\n"
+"                       Vous pouvez pr�ser plusieurs noms ou jokers,\n"
+"                       en les s�rant avec des virgules.\n"
+"  \n"
+"exemples :\n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  Ceci va pr�nir tous les utilisateurs ayant atteint leur limite sur\n"
+"  l'imprimante lp.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  Ceci va pr�nir tous les utilisateurs ayant atteint leurs limites quelle\n"
+"  que soit l'imprimanter.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  Ceci va pr�nir tous les membres des groupes dont les noms commencent\n"
+"  par \"dev\" et qui ont atteints leurs limites sur toutes les imprimantes\n"
+"  dont le nom commence par \"laserjet\".\n"
+"  \n"
+"  Si cette commande est lanc�par un utilisateur qui n'est pas un\n"
+"  administrateur PyKota, les arguments additionnels repr�ntant des noms\n"
+"  d'utilisateurs ou de groupes sont ignor� et seulement l'utilisateur ou\n"
+"  le groupe courant est pr�nu.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Merci d'envoyer les rapports de bugs �%s"
+
+msgid "PyKota Data Dumper"
+msgstr "Extracteur de Donn� PyKota"
+
+msgid "Dump"
+msgstr "Extraction"
+
+msgid "Please click on the above button"
+msgstr "Merci de cliquer sur le bouton ci-dessus"
+
+msgid "Data Type"
+msgstr "Type de Donn�"
+
+msgid "Output Format"
+msgstr "Format de Sortie"
+
+msgid "Filter"
+msgstr "Filtre"
+
+msgid "PyKota Reports"
+msgstr "Rapports de Quotas d'Impression PyKota"
+
+msgid "Report"
+msgstr "G�ration du Rapport"
+
+msgid "Printer"
+msgstr "Imprimante"
+
+msgid "User / Group names mask"
+msgstr "Masque de noms Utilisateur / Groupe"
+
+msgid "Groups report"
+msgstr "Rapport de groupes"
+
+msgid "History"
+msgstr "Historique des Impressions"
+
+msgid "Empty"
+msgstr "Vide"
+
+msgid "Action"
+msgstr "Action"
+
+msgid "User"
+msgstr "utilisateur"
+
+msgid "Hostname"
+msgstr "Poste client"
+
+msgid "JobId"
+msgstr "JobId"
+
+msgid "JobSize"
+msgstr "Taille"
+
+msgid "JobPrice"
+msgstr "Co�msgid "Copies"
+msgstr "Copies"
+
+msgid "JobBytes"
+msgstr "Taille en octets"
+
+msgid "PageCounter"
+msgstr "Compteur de pages"
+
+msgid "Options"
+msgstr "Options"
+
+msgid "MD5Sum"
+msgstr "Somme MD5"
+
+msgid "BillingCode"
+msgstr "Code de Facturation"
+
+msgid "Pages"
+msgstr "D�il des Pages"
+
+msgid "Previous page"
+msgstr "Page pr�dente"
+
+msgid "PyKota Quotes"
+msgstr "Devis PyKota"
+
+msgid "Quote"
+msgstr "Devis"
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Backend accounter %s non support�
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Fichier de configuration %s non trouv�
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Option %s non trouv�dans la section global de %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Option %s non trouv�dans la section %s de %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+"Option ldaptls positionn� mais le certificat %s n'est pas disponible."
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "L'option logger supporte seulement les valeurs %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Compteur de pages %s invalide pour l'imprimante %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr ""
+"L'option accounter pour l'imprimante %s supporte seulement les valeurs %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr ""
+"L'option enforcement pour l'imprimante %s supporte seulement les valeurs %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+"L'option onaccountererror pour l'imprimante %s supporte seulement les "
+"valeurs %s"
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Option policy %s invalide pour l'imprimante %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "L'option policy dans la section %s supporte seulement les valeurs %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Option mailto %s invalide pour l'imprimante %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "L'option mailto dans la section %s supporte seulement les valeurs %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr "Compteur maximal de banni�s refus� %s invalide"
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "D�i de gr� %s invalide"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Valeur 'pauvre homme' %s invalide"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"Le solde de votre compte d'impression est Bas.\n"
+"Bient�ous ne serez plus autoris�) �mprimer.\n"
+"Merci de contacter l'Administrateur de Quota d'Impression pour r�udre ce "
+"probl�."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Vous n'�s plus autoris� imprimer car\n"
+"votre Quota d'Impression est d�ss�ur l'imprimante %s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Vous n'aurez bient�lus le droit d'imprimer car\n"
+"votre Quota d'Impression sur l'imprimante %s est presque atteint."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+"L'option accountbanner dans la section %s supporte seulement les valeurs %s"
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr "L'option trustjobsize pour l'imprimante %s est incorrecte"
+
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgid "Groups"
+msgstr "Groupes"
+
+msgid "Printers"
+msgstr "Imprimantes"
+
+msgid "Users Print Quotas"
+msgstr "Quotas d'Impression Utilisateurs"
+
+msgid "Users Groups Print Quotas"
+msgstr "Quotas d'Impression de Groupes d'Utilisateurs"
+
+msgid "History of Payments"
+msgstr "Historique des Paiements"
+
+msgid "Printers Groups Membership"
+msgstr "Membres des Groupes d'Imprimantes"
+
+msgid "Users Groups Membership"
+msgstr "Membres des Groupes d'Utilisateurs"
+
+msgid "Comma Separated Values"
+msgstr "Valeurs s�r� par des virgules"
+
+msgid "Semicolon Separated Values"
+msgstr "Valeurs s�r� par des points virgules"
+
+msgid "Tabulation Separated Values"
+msgstr "Valeurs s�r� par des tabulations"
+
+msgid "eXtensible Markup Language"
+msgstr "eXtensible Markup Language"
+
+msgid "CUPS' page_log"
+msgstr "page_log de CUPS"
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+"Le modificateur [%s] pour l'option de ligne de commande --data est invalide, "
+"voir l'aide."
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+"Le modificateur [%s] pour l'option de ligne de commande --format est "
+"invalide, voir l'aide."
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr "La sortie XML est d�ctiv�car le module jaxml n'est pas disponible."
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "Erreur de l'exporteur de donn� de PyKota : erreur d'entr�sortie"
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Syst� de log %s non support�
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Rapport pour le quota %s sur l'imprimante %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "D�i de gr�: %i jours"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Prix par job: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Prix par page: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+"Groupe           surtaxe    util    soft    hard    balance grace         "
+"total       pay�arn"
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+"Utilisateur      surtaxe    util    soft    hard    balance grace         "
+"total       pay�arn"
+
+msgid "unknown"
+msgstr "inconnu"
+
+#, python-format
+msgid "Real : %s"
+msgstr "R� : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Total : %9i"
+
+msgid "N/A"
+msgstr "N/A"
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "backend reporter %s non support�
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Backend de stockage de quota %s non support�
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr "Probl� �ange avec uid(%s) : %s"
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr "Fonctionne en tant qu'utilisateur '%s'."
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr "Aucun utilisateur appel�pykota'. Pas de restriction des privil�s."
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr "Impossible de restreindre les privil�s : %s"
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+"Privil�s restreints. Fonctionne maintenant en tant qu'utilisateur 'pykota'."
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr "Impossible de r�p�r les privil�s : %s"
+
+msgid "Regained priviledges. Now running as root."
+msgstr "Privil�s r�p�s. Fonctionne maintenant en tant que root."
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "Impossible de se connecter au serveur SMTP : %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Impossible d'envoyer un message �s, erreur %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Merci de contacter votre administrateur syst� :\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Impossible de trouver l'utilisateur %s sur l'imprimante %s, action par "
+"d�ut (%s) appliqu�
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"Impossible de trouver le solde du compte de l'utilisateur %s, action par "
+"d�ut (%s) appliqu�sur l'imprimante %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr "L'utilisateur %s ne paiera pas ses impressions."
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr ""
+"D�ssement de Quota d'impression pour le groupe %s sur l'imprimante %s"
+
+msgid "Print Quota"
+msgstr "Quota d'Impression"
+
+msgid "Print Quota Exceeded"
+msgstr "D�ssement de Quota d'Impression"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Quota d'Impression faible pour le groupe %s sur l'imprimante %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr ""
+"D�ssement de Quota d'Impression pour l'utilisateur %s sur l'imprimante %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Quota d'Impression faible pour l'utilisateur %s sur l'imprimante %s"
+
+msgid "Print Quota Low"
+msgstr "Quota d'Impression Bas"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Syst� d'impression %s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"Impossible de pr�alculer la taille du travail d'impression avec "
+"l'analyzeur g�rique de PDL : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "SIGTERM re� travail d'impression %s annul�
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Nom d'h�de l'imprimante ind�ni, positionn� 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Syst� d'impression inconnu, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Imprimante %s non enregistr�dans le syst� PyKota, action externe (%s) "
+"appliqu�sur l'imprimante %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Utilisateur %s non enregistr�ans le syst� PyKota, application de "
+"l'action externe (%s) sur l'imprimante %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"L'utilisateur %s n'a pas de quota sur l'imprimante %s dans le syst� "
+"PyKota, application de l'action externe (%s) sur l'imprimante %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"L'action externe %s sur l'imprimante %s a produit une erreur. Job rejet�"
+"Merci de v�fier les fichiers de configuration de PyKota."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Imprimante %s non enregistr�dans le syst� PyKota, application de "
+"l'action par d�ut (%s) "
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Utilisateur %s non enregistr�ans le syst� PyKota, application de "
+"l'action par d�ut (%s) sur l'imprimante %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"Utilisateur %s n'a aucun quota sur l'imprimante %s dans le syst� PyKota, "
+"application de l'action par d�ut (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"L'imprimante %s n'est toujours pas enregistr�dans le syst� PyKota, le "
+"travail d'impression sera rejet�
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"L'utilisateur %s n'est toujours pas enregistr�ans le syst� PyKota, le "
+"travail d'impression sera rejet�e l'imprimante %s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"L'utilisateur %s n'a toujours pas de quota sur l'imprimante %s dans le "
+"syst� PyKota, le travail d'impression sera rejet�
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+"Un probl� est survenu durant la lecture du compteur de pages internes de "
+"l'imprimante %s."
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+"R�p�tion du compteur de pages de l'imprimante %s depuis la base de "
+"donn�."
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+"Impossible de r�p�r le compteur de page internes de l'imprimante avant "
+"ou apr�l'impression."
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "Taille du travail forc� 1 page pour l'imprimante %s."
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr "Aucun travail pr�dent pour l'imprimante %s dans la base de donn�."
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr "Valeurs bizarres pour le compteur de pages interne de l'imprimante %s."
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Adresse inconnue dans HARDWARE(%s) pour l'imprimante %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Ex�tion de HARDWARE(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "SIGTERM a � envoy�u compteur hardware %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr "Ligne [%s] ignor�ans la sortie du compteur. R�sayer..."
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "Le code de sortie du compteur hardware %s est %s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Impossible d'interroger l'imprimante %s via HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "Probl� durant la connexion �s:%s : %s"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "Probl� lors de l'envoi des requ�s PJL �s:%s : %s"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr "En attente que l'imprimante %s soit en train d'imprimer..."
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "En attente que l'�t disponible de l'imprimante %s se stabilise..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"Interrogation PJL interrompue. Utilisation de la derni� valeur connue du "
+"compteur (%s) sur l'imprimante %s."
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "Erreur r�au durant les requ�s SNMP sur l'imprimante %s : %s"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr "Erreur de d�dage de message SNMP pour l'imprimante %s : %s"
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr "Probl� rencontr�urant les requ�s SNMP sur l'imprimante %s : %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"Interrogation SNMP interrompue. Utilisation de la derni� valeur connue du "
+"compteur (%s) sur l'imprimante %s."
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Ex�tion de SOFTWARE(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Impossible de calculer la taille du job avec le compteur %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+"Probl� d�ct�n attendant que le compteur software pid %s se termine : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "Le code de sortie du compteur software %s est %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"Les totaux peuvent �e faux si des utilisateurs sont dans plusieurs groupes."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"La base de recherche %s semble �e inexistante. Probablement une mauvaise "
+"configuration. Merci de v�fier /etc/pykota/pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "La recherche de %s(%s) depuis %s(scope=%s) n'a renvoy�ucun r�ltat."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Probl� durant l'ajout de l'entr�LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Probl� durant la suppression de l'entr�LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Probl� durant la modification de l'entr�LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+"Aucun objet pykotaAccountBalance trouv�our l'utilisateur %s. Avez vous "
+"cr�des entr� LDAP manuellement ?"
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"Impossible de trouver une entr�existante ayant pour objectClass %s avec %s="
+"%s �aquelle attacher une objectClass pykotaAccount"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr "%s. Une nouvelle entr�sera cr� �a place."
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"Impossible de trouver une entr�existante �aquelle attacher l'objectClass "
+"pykotaGroup %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr "Cach�ar respect de la vie priv�
Index: pykota/tags/1.22/po/de/pykota.po
===================================================================
--- pykota/tags/1.22/po/de/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/de/pykota.po (revision 2228)
@@ -0,0 +1,2919 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-11-02 08:47+0100\n"
+"Last-Translator: Johannes L�ermann <johannes.laemmermann@t-online.de>\n"
+"Language-Team: German <alet@librelogiciel.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Ein Programm zum automatischen Anlegen von Benutzer-Konti\n"
+"und zum Setzen von Anfangswerten\n"
+"\n"
+"SIE D�FEN NICHT DIESES PROGRAMM VERWENDEN,\n"
+"WENN SIE DIE KONTINGENTE F� IHRE BENUTZER AUF DER BASIS VON SEITENZAHLEN "
+"SETZEN WOLLEN!\n"
+"\n"
+"Gebrauch auf der Kommandozeile:\n"
+"\n"
+"  SIE D�FEN DIESES PROGRAMM NICHT AUF DER KOMMANDOZEILE BENUTZEN, SONDERN\n"
+"  NUR ALS ALS external policy IN pykota.conf\n"
+"\n"
+"  autopykota { -i | --initbalance value }\n"
+"  \n"
+"Optionen:\n"
+"\n"
+"  -v | --version       Gibt die Version von autopykota aus und endet.\n"
+"  -h | --help          Gibt diese Meldung aus und endet.\n"
+"  \n"
+"  -i | --initbalance b Setzt den Anfangswert der Balance des Benutzerkontos "
+"auf b.\n"
+"                       Wenn der Benutzer schon existiert, wird der aktuelle "
+"Balance-Wert\n"
+"                       unver�ert gelassen. Wenn er nicht gesetzt wird,\n"
+"                       ist der Standardwert 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "Auftrag beinhaltet keine Daten. Druck verweigert."
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "Auftrag Accounting beginnt."
+
+msgid "Job accounting ends."
+msgstr "Auftrag Accounting endet."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "Auftragsgr�festgesetzt auf 0, weil der Druck verweigert wurde."
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Auftragsgr� %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Das Kontingent f�utzer %s auf Drucker %s wird angepasst"
+
+msgid "Job added to history."
+msgstr "Auftrag zum Verlauf hinzugef�
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr "Datei Nummer %s zweimal vom Abfrage Objekt abgemeldet, wird ignoriert."
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "SIGTERM wurde an reales Backend %s (pid: %s) gesendet"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "CUPS Backend %s abgest�
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr "Die Kommandozeilenoption -d | --data ist unerl�lich, siehe Hilfe."
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr "Sie d�diesen Befehl nicht ben�"
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Ung�r Wert f�tlimit %s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Ung�r Wert f�dlimit %s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr "Hardlimit %i ist kleiner als Softlimit %i, Werte werden ausgetauscht."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Ung�r Wert f�ance %s"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Ung�r Wert f�ish�%s"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Ung�r Wert f�itby %s"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Unm�ch den Drucker %s hinzuzuf�
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Ung�r Druckername %s"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Kein Drucker stimmt mit %s berein"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "Sie m�Benutzer- oder Gruppenname auf der Kommandozeile �ben"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Prototyp Objekt %s in Kontingentverwaltung nicht gefunden."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prototyp %s in Kontingentverwaltung f�cker %s nicht gefunden."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr "Nicht definiertes Hardlimit auf Softlimit (%s) f�cker %s gesetzt."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "Nicht definiertes Softlimit auf Hardlimit (%s) f�cker %s gesetzt."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Ung� Email-Adresse %s"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Ung�r Gruppenname %s"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Ung�r Benutzername %s"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Kontingent f�ekt %s auf Drucker %s nicht gefunden."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Gruppe %s in der PyKota Kontingentverwaltung nicht gefunden."
+
+msgid "incompatible options, see help."
+msgstr "Inkompatible Optionen, siehe Hilfe."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr ""
+"Software Kontof� bereits im ersten Durchgang erledigt. Wird ignoriert."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "Hardware Kontof� bereits im ersten Durchgang erledigt. Ignoriere."
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "Titel"
+
+msgid "Filename"
+msgstr "Dateiname"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Ein Werkzeug, das Hinweise auf die beste Z�methode f�en Drucker "
+"gibt.\n"
+"\n"
+"Kommandozeilen-Gebrauch:\n"
+"\n"
+"  pkhint [Optionen] [Drucker1 Drucker2 Drucker3 ... DruckerN] <file.conf\n"
+"\n"
+"Optionen:\n"
+"\n"
+"  -v | --version       Gibt die Versionsnummer von pkhint aus und endet.\n"
+"  -h | --help          Gibt diese Meldung aus und endet.\n"
+"\n"
+"Beispiele:\n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"\n"
+"  Analysiert Ihr Drucksystem um festzustellen, welcher Z�er\n"
+"  der geeignetste ist f�en der angegebenen Drucker, dessen\n"
+"  Name zu einem der Parameter passt.\n"
+"\n"
+"  Wenn Sie keinen Parameter auf der Kommandozeile �ben,\n"
+"  werden alle Drucker analysiert.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "Ung� DeviceURI: %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Bitte warten Sie w�end pkhint die Konfiguration ihres Drucksystems "
+"analysiert..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Unbekannter Anschluss %s f�cker %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"F�ie folgende Zeilen in ihre /etc/pykota/pykota.conf Datei ein:\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr ""
+"# ACHTUNG: wenn Software Accounting vorgeschlagen wird, bedeutet dies nicht,"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+" dass Hardware Accounting nicht funktionieren w�es bedeutet nur, dass "
+"PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+" nicht in der Lage war, automatisch festzustellen, welche Hardware "
+"Accounting Methode zu benutzen ist."
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Ein Druckermanager f�ota.\n"
+"\n"
+"Kommandozeilen-Gebrauch:\n"
+"\n"
+"  pkprinters [Optionen] Drucker1 Drucker2 Drucker3 ... DruckerN\n"
+"\n"
+"Optionen:\n"
+"\n"
+"  -v | --version       Gibt die Versionsnummer von pkprinters aus und "
+"endet.\n"
+"  -h | --help          Gibt diese Nachricht aus und endet.\n"
+"\n"
+"  -a | --add           F�ucker hinzu, wenn sie in der "
+"Kontingentverwaltung\n"
+"                       noch nicht existieren. Wenn sie existieren, werden "
+"sie\n"
+"                       angepasst, ausser -s | --skipexisting ist auch "
+"gesetzt.\n"
+"\n"
+"  -d | --delete        L�t Drucker aus der Kontingentverwaltung.\n"
+"\n"
+"  -D | --description d F�n Druckern eine Beschreibung hinzu.\n"
+"\n"
+"  -c | --charge p[,j]  Setzt den Preis pro Seite und pro Auftrag fest. Der "
+"Preis \n"
+"                       pro Auftrag ist fakultativ.\n"
+"                       Werden beide verwendet, trennen Sie sie mit einem "
+"Komma ab.\n"
+"                       Flie�ommazahlen und negative Werte sind erlaubt.\n"
+"   \n"
+"  -g | --groups pg1[,pg2...] F�n/die Drucker der Druckergruppen pg1,\n"
+"                        pg2, etc..., die schon existieren m� hinzu.\n"
+"                        Eine Druckergruppe ist wie ein normaler Drucker,\n"
+"                        bloss kennt man ihn �erweise im\n"
+"                        Drucksystem nicht. Richten Sie Druckergruppen genau\n"
+"                        gleich wie Drucker ein, dann f�ie andere\n"
+"                        Drucker mit dieser Option hinzu.\n"
+"                        Die Kontof� wird f�en Drucker und f�alle\n"
+"                        Druckergruppen, denen er angeh� gemacht,\n"
+"                        die Kontingent��wird f� Drucker\n"
+"                        und f�e Druckergruppen, zu denen er geh�\n"
+"                        gemacht.\n"
+"                        Wenn die Option --remove (siehe weiter unten) nicht\n"
+"                        gesetzt ist, so werden standardm�ig Drucker der\n"
+"                        angegebenen Druckergruppe hinzugef�"
+"\n"
+"  -l | --list           Gibt Informationen �en/die Drucker und die\n"
+"                        Druckergruppen, denen er angeh� aus.\n"
+"\n"
+"  -r | --remove         In Kombination mit der obigen Option --groups "
+"werden\n"
+"                        Drucker aus der angegebenen Druckergruppe entfernt.\n"
+"\n"
+"  -s | --skipexisting   In Kombination mit der obigen Option --add "
+"verhindert\n"
+"                        dies, dass pkprinters existierende Drucker "
+"ver�ert.\n"
+"\n"
+"  Drucker1 bis DruckerN kann Platzhalter enthalten, wenn die Option --add\n"
+"  nicht gesetzt ist.\n"
+"\n"
+"Beispiele:\n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"\n"
+"  Dies richtet drei Drucker mit Namen hp2100, hp2200 und hp8000 ein.\n"
+"  Die Seitenkosten f�se Drucker ist auf 0.05 Einheiten festgelegt und\n"
+"  ihr Preis pro Auftrag auf 0.01 Einheiten. Einheiten k�n Ihrer W�ung\n"
+"  entsprechen oder was immer Sie unter ihnen verstehen wollen.\n"
+"  Die Beschreibung aller Drucker ist auf die Zeichenkette \"HP Printer\"\n"
+"  gesetzt. Wenn irgendeiner dieser Drucker schon existiert, wird er\n"
+"  modifiziert, ausser die Option -s | --skipexisting ist auch gesetzt.\n"
+"\n"
+"  $ pkprinters --delete \"*\"\n"
+"\n"
+"  Dies l�t alle Drucker und dazugeh�en Kontingentinformationen\n"
+"  vollst�ig, ebenso die Liste der Druckauftr�. VORSICHT!\n"
+"\n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"\n"
+"  Dies f�le Drucker, deren Namen zu \"hp*\" passen, den Druckergruppen\n"
+"  Laser und HP, die schon VORHANDEN SEIN M�SEN, hinzu.\n"
+"\n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"\n"
+"  Dies entfernt den Drucker hp2200 aus der Druckergruppe LexMark.<\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "Drucker %s existiert bereits, wird �rungen"
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "Drucker %s existiert bereits, wird modifiziert."
+
+msgid "in"
+msgstr "in"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+"Sie m�die Namen der Druckergruppen auf der Kommandozeile �ben"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Sie m�Druckernamen auf der Kommandozeile �ben"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Ein OSD Kontingent-Anzeiger f�ota.\n"
+"\n"
+"Kommandozeilen-Gebrauch:\n"
+"\n"
+"  pykosd [Optionen]\n"
+"\n"
+"Optionen:\n"
+"\n"
+"   -v | --version       Gibt die Versionsnummer von pykosd aus und endet.\n"
+"   -h | --help          Gibt diese Meldung aus und endet.\n"
+"\n"
+"   -c | --color #rrggbb Stellt die Farbe f� Anzeige in Form eines\n"
+"                        hexadezimalen Triplets ein; zum Beipiel: #FF0000 ist "
+"100%% rot.\n"
+"                        Standard ist 100%% gr�0FF00).\n"
+"\n"
+"   -d | --duration d    Stellt die Dauer der Anzeige in Sekunden ein.\n"
+"                        Standard ist 3 Sekunden.\n"
+"\n"
+"   -f | --font f        Stellt die Schriftart f� Anzeige ein.\n"
+"                        Standard ist der Standard der Python OSD "
+"Bibliothek.\n"
+"\n"
+"   -l | --loop n        Stellt ein, wie oft die Information angezeigt wird.\n"
+"                        Standard ist 0, das hei� immer.\n"
+"\n"
+"   -s | --sleep s       Stellt die Schlafdauer zwischen zwei Anzeigen in\n"
+"                        Sekunden ein.\n"
+"                        Standard ist 180 Sekunden (3 Minuten).\n"
+"\n"
+"\n"
+"Beispiele:\n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"\n"
+"  Startet pykosd. Die Anzeige wird alle 60 Sekunden erneuert und dauert\n"
+"  jedes Mal 3 Sekunden (der Standardwert). Nach f�rchl�en endet\n"
+"  das Programm.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Ung� Option duration %s"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Ung� Option loop %s"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Ung� Option sleep %s"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Ung� Option color %s"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "Benutzer %s existiert nicht in der PyKota-Datenbank"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "Seiten benutzt f� %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Verbleibende PyKota-Einheiten: %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gibt den Benutzern ihre Druckkontingente an.\n"
+"\n"
+"Kommandozeilen-Gebrauch:\n"
+"\n"
+"  pykotme  [Optionen]  [Dateien]\n"
+"\n"
+"  -v | --version       Gibt die Versionsnummer von pyktome aus und endet.\n"
+"  -h | --help          Gibt diese Nachricht aus und endet.\n"
+"\n"
+"  -P | --printer p     Zeigt ein Kontingent ausschliesslich f�sen "
+"Drucker an.\n"
+"                       p kann Platzhalter enthalten um nur einige Drucker\n"
+"                       auszuw�en. Standardwert ist *, d.h. alle Drucker.\n"
+"                       Sie k�n verschiedene Namen oder Platzhalter,\n"
+"                       durch Kommas getrennt, angeben.\n"
+"\n"
+"Beispiele:\n"
+"\n"
+"  $ pykotme --printer apple Datei1.ps Datei2.ps\n"
+"\n"
+"  Dies gibt ein Druckkontingent f� aktuellen Benutzer an. Das "
+"Kontingent\n"
+"  wird mit dem Preis und der Gr�eines Auftrags auf Basis von Datei1.ps\n"
+"  und Datei2.ps angegeben, wenn sie an den Drucker apple gesendet w�\n"
+"\n"
+"  $ pykotme --printer apple,hplaser <Datei1.ps\n"
+"\n"
+"  Dies gibt ein Druckkontingent f� aktuellen Benutzer an. Das "
+"Kontingent\n"
+"  wird mit dem Preis und der Gr�eines Auftrags auf Basis von Datei1.ps,\n"
+"  angegeben, so wie sie vom Standard Input her gelesen wird, wenn sie an \n"
+"  den Drucker apple oder hplaser gesendet w�n"
+"\n"
+"  $ pykotme\n"
+"\n"
+"  Dies gibt ein Kontingent f�en Auftrag an, der aus dem besteht, was\n"
+"  via Standard Input ankommt. Das Kontingent zeigt die Gr�des Auftrags\n"
+"  und den Preis, den der Auftrag auf jedem Drucker kosten w�n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Ihr Kontostand: %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Auftragsgr� %i Seiten"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Kosten f�cker %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Erzeugt Berichte zu den Druckkontingenten.\n"
+"\n"
+"Kommandozeilen-Gebrauch:\n"
+"\n"
+"  repykota [Optionen]\n"
+"\n"
+"  -v | --version       Gibt die Versionsnummer von repykota aus und endet.\n"
+"  -h | --help          Gibt diese Meldung aus und endet.\n"
+"\n"
+"  -u | --users         Erzeugt einen Bericht �ie Kontigente der "
+"Benutzer.\n"
+"                       Dies ist der Standard.\n"
+"\n"
+"  -g | --groups        Erzeugt einen Bericht �ie Kontingente der "
+"Gruppe\n"
+"                       anstelle der Benutzer.\n"
+"\n"
+"  -P | --printer p     Druckkontingent nur f�sen Drucker ausgeben.\n"
+"                       p kann Platzhalter enthalten um nur einige Drucker\n"
+"                       auszuw�en. Der Standardwert ist *, d.h. alle\n"
+"                       Drucker.\n"
+"                       Sie k�n verschiedene Namen oder Platzhalter "
+"angeben,\n"
+"                       die Sie mit Kommas abtrennen.\n"
+"\n"
+"Beispiele:\n"
+"\n"
+"  $ repykota --printer lp\n"
+"\n"
+"  Dies gibt den Stand der Kontingente aller Benutzer aus, die den\n"
+"  Drucker lp benutzen.\n"
+"\n"
+"  $ repykota\n"
+"\n"
+"  Dies gibt den Stand der Kontingente f�e Benutzer auf allen Druckern "
+"aus.\n"
+"\n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"\n"
+"  Dies gibt den Stand der Kontingente f� Benutzer jerome und f�e\n"
+"  Benutzer aus, deren Namen mit \"jo\" beginnt, auf allen Druckern, deren "
+"Namen\n"
+"  mit \"laser\" beginnt oder mit \"pson\" endet.\n"
+"\n"
+"  Wenn das Programm von einem Benutzer aufgerufen wird, der kein\n"
+"  PyKota-Administrator ist, so werden die zus�lichen Optionen f�Benutzer\n"
+"  oder Gruppen ignoriert und nur die Daten des aktuellen Benutzers/Gruppe\n"
+"  ausgegeben.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sendet Post an die Benutzer bez� Druckkontingente.\n"
+"\n"
+"Befehlszeilen-Gebrauch:\n"
+"\n"
+"  warnpykota  [Optionen]  [Namen]\n"
+"\n"
+"Optionen:\n"
+"\n"
+"  -v | --version       Gibt die Version von warnpykota aus und endet.\n"
+"  -h | --help          Gibt diese Meldung aus und endet.\n"
+"\n"
+"  -u | --users         Warnt die Benutzer bez� ihres Druckkontingents.\n"
+"                       Das ist der Standard.\n"
+"\n"
+"  -g | --groups        Warnt die Benutzer, deren Gruppen �em Limit "
+"sind.\n"
+"\n"
+"  -P | --printer p     Verfiziert die Kontingente allein f�sen "
+"Drucker.\n"
+"                       p kann Platzhalter enthalten um nur einige Drucker\n"
+"                       auszuw�en. Standardwert ist *, d.h. alle Drucker.\n"
+"                       Sie k�n verschiedene Namen und Platzhalter "
+"angeben,\n"
+"                       die Sie mit Kommas abtrennen m�\n"
+"\n"
+"Beispiele:\n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"\n"
+"  Dies warnt alle Benutzer des Druckers lp, die ihr Druckkontingent\n"
+"  �hritten haben.\n"
+"\n"
+"  $ warnpykota\n"
+"\n"
+"  Dies warnt alle Benutzer, die Ihr Druckkontingent auf irgendeinem\n"
+"  Drucker �hritten haben.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"\n"
+"  Dies warnt alle Benutzer der Gruppen, deren Namen mit \"dev\" beginnen "
+"und\n"
+"  die ihr Druckkontingent auf irgendeinem Drucker, dessen Name mit\n"
+"  \"laserjet\" beginnt.\n"
+"\n"
+"  Wenn das Programm von einem Benutzer aufgerufen wird, der nicht ein\n"
+"  Pykota-Administrator ist, werden die Optionen f�utzer- und \n"
+"  Gruppennamen ignoriert und nur der aktuelle Benutzer/Gruppe angezeigt.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Melden Sie bitte Fehler an: %s"
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr "Bitte dr�Sie den obigen Knopf"
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "PyKota Reporte"
+
+msgid "Report"
+msgstr "Report"
+
+msgid "Printer"
+msgstr "Drucker"
+
+msgid "User / Group names mask"
+msgstr "Benutzer- / Gruppenname-Maske"
+
+msgid "Groups report"
+msgstr "Gruppen Report"
+
+msgid "History"
+msgstr "Verlauf"
+
+msgid "Empty"
+msgstr "Leer"
+
+msgid "Action"
+msgstr "Aktion"
+
+msgid "User"
+msgstr "Benutzer"
+
+msgid "Hostname"
+msgstr "Hostname"
+
+msgid "JobId"
+msgstr "AuftragsId"
+
+msgid "JobSize"
+msgstr "AuftragsGr�
+
+msgid "JobPrice"
+msgstr "AuftragsPreis"
+
+msgid "Copies"
+msgstr "Kopien"
+
+msgid "JobBytes"
+msgstr "Auftrag in Bytes"
+
+msgid "PageCounter"
+msgstr "SeitenZ�er"
+
+msgid "Options"
+msgstr "Optionen"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "Vorherige Seite"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Accounterbackend %s wird nicht unterst�#, python-format
+msgid "Configuration file %s not found."
+msgstr "Konfigurationsdatei %s nicht gefunden."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Option %s im globalen Abschnitt von %s nicht gefunden"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Option %s in Abschnitt %s von %s nicht gfunden"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "Option logger unterst�ur folgende Werte %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Ung�r Accounter %s f�cker %s "
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "Option 'accounter' in Abschnitt %s unterst�ur folgende Werte %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "Option 'enforcement' in Abschnitt %s unterst�ur folgende Werte %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+"Option 'onaccountererror' in Abschnitt %s unterst�ur folgende Werte %s"
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Ung� Richtlinie ('policy') %s f�cker %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "Option 'policy' in Abschnitt %s unterst�ur folgende Werte %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Ung� Option 'mailto' %s f�cker %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "Option 'mailto' in Abschnitt %s unterst�ur folgende Werte %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Ung� Schongrenze %s"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Ung� 'poorman' Grenze %s"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"Ihr Druckkontingent-Kontostand ist niedrig.\n"
+"Bald wird es Ihnen nicht mehr gestattet sein zu drucken.\n"
+"Bitte kontaktieren Sie den Druckkontingent-Administrator,\n"
+"um dieses Problem zu l�."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Es ist ihnen nicht gestattet weiterhin zu drucken, weil \n"
+"ihr Druckkontingent auf Drucker %s �gen ist."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Bald wird es ihnen verboten sein zu Drucken, weil \n"
+"ihr Druckkontingent auf Drucker %s fast aufgebraucht ist."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+"Ung� Einstellung [%s] f�mandozeilenoption --data, siehe Hilfe."
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+"Ung�e Einstellung [%s] f�mandozeilenoption --format, siehe Hilfe."
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr "XML-Ausgabe ist unm�ch, weil das jaxml-Modul nicht verf�ist."
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "PyKota data dumper fehlgeschlagen: I/O-Fehler"
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Nicht unterst� logging subsystem %s"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Report f�Kontingent auf Drucker %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Schonfrist: %i Tage"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Preis pro Auftrag: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Preis pro Seite: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "unbekannt"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Real : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Gesamt : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Nicht unterst� Report-Backend %s"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Nicht unterst� Kontingentspeicherungsbackend (quota storage) %s"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "SMTP-Server kann nicht erreicht werden: %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Unm�ch Mail an %s zu senden, Fehler %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Bitte kontakieren Sie Ihren Systemadministrator:\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Keine �ereinstimmung f�utzer %s auf Drucker %s vorhanden, wende "
+"Standard-Richtlinie an (%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"Keine �ereinstimmung f� Kontostand von Benutzer %s,\n"
+"wende Standard-Richtlinie (%s) f�cker %s an"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "�erzogenes Druckkontingent f�ppe %s auf Drucker %s"
+
+msgid "Print Quota"
+msgstr "Druckkontingent"
+
+msgid "Print Quota Exceeded"
+msgstr "�erzogenes Druckkontingent"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Niedriges Druckkontingent f�ppe %s auf Drucker %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "�erzogenes Druckkontingent f�utzer %s auf Drucker %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Niedriges Druckkontingent f�utzer %s auf Drucker %s"
+
+msgid "Print Quota Low"
+msgstr "Niedriges Druckkontingent"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Drucksystem %s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"Vorausberechnung der Auftragsgr�nicht m�ch mit der allgemeinen PDL "
+"Analyseroutine : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "SIGTERM empfangen, Auftrag %s abgebrochen."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Hostname des Druckers nicht definiert, setze auf 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Drucksystem unbekannt, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Drucker %s ist nicht im PyKota System registriert, wende externe Richtlinie "
+"(%s) f�cker %s an"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Benutzer %s ist nicht in der PyKota-Verwaltung registriert, wende externe "
+"Richtlinie (%s) f�cker %s an"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"Benutzer %s hat in der PyKota-Verwaltung kein Kontingent auf Drucker %s, "
+"wende externe Richtlinie (%s) f�cker %s an"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"Externe Richtlinie %s f�cker %s hat eine Fehler erzeugt. Auftrag "
+"abgelehnt. Bitte ��ie PyKota's Konfigurationsdatei."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Drucker %s ist nicht in der PyKota-Verwaltung registriert, wende Standard-"
+"Richtlinie (%s) an"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Benutzer %s ist nicht in der PyKota-Verwaltung registriert, wende Standard-"
+"Richtlinie (%s) f�cker %s an"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"Benutzer %s hat in der PyKota-Verwaltung f�cker %s kein Kontingent, "
+"wende Standard-Richtlinie (%s) an"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"Drucker %s noch immer nicht in der PyKota-Verwaltung registriert, Auftrag "
+"wird abgelehnt werden"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"Benutzer %s noch immer nicht in der PyKota-Verwaltung registriert, Auftrag "
+"f�cker %s wird abgelehnt"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"Benutzer %s hat in der PyKota-Verwaltung noch immer kein Kontingent f�Drucker %s, Auftrag wird abgelehnt"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+"Ein Problem trat w�dend des Auslesens des internen Seitenz�ers von "
+"Drucker %s auf."
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+"Seitenz�er f�cker %s wird anstelle dessen aus der Datenbank genommen."
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+"Es war unm�ch, den internen Seitenz�er von Drucker %s vor oder nach dem "
+"Drucken zu lesen."
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "Auftragsgr�f�cker %s auf 1 Seite festgelegt."
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr "Kein fr� Auftrag f�cker %s in der Datenbank"
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr "Inkonsistente Werte f� internen Seitenz�er von Drucker %s"
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Unbekannte Drucker Adresse in HARDWARE(%s) f�cker %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Starte HARDWARE(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "SIGTERM wurde an Hardware Accounter %s (pid: %s) gesendet"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+"Linie [%s] in der Ausgabe des Z�ers �rungen. Erneuter Versuch..."
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "Der Exit-Code des Hardwarez�ers %s ist %s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Unm�ch Drucker %s via HARDWARE(%s) abzufragen"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "Problem w�end der Verbindung zu %s:%s : %s"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "Probleme w�end des Sendens der PJL-Abfrage an %s:%s :%s"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "Am Warten darauf, dass der idle-Status von Drucker %s stabil wird..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"PJL-Abfrage-Status unterbrochen. Es wird der letzte bekannte Wert des "
+"internen Seitenz�er (%s) von Drucker %s verwendet."
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "Netzwerk-Fehler w�end SNMP-Abfragen auf Drucker %s: %s"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+"Es sind Probleme w�end den SNMP-Abfragen auf Drucker %s aufgetreten: %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"SNMP-Abfrage-Status unterbrochen. Es wird der letzte bekannte Wert des "
+"internen Seitenz�ers (%s) von Drucker %s verwendet."
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Starte SOFTWARE(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Es ist unm�ch, die Auftragsgr�mit Accounter %s zu berechnen"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+"Probleme beim Warten auf das Beenden des Software-Accounters pid %s: %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "Der Exit-Code des Software-Accounters %s ist %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"Gesamtsummen sind m�cherweise ungenau, falles einige Benutzer Mitglieder "
+"von mehreren Gruppen sind."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"Suchbasis %s scheint nicht zu existieren. M�herweise falsche "
+"Konfiguration. Bitte /etc/pykota/pykota.conf ��%s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "Suche nach %s(%s) aus %s(scope=%s) ergab kein Antwort."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Problem, den LDAP-Eintrag (%s, %s) hinzuzuf�
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Problem LDAP Eintrag (%s) zu l�en"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Problem LDAP Eintrag (%s, %s) zu modifizieren"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+"Kein Objekt pykotaAccountBalance f�utzer %s gefunden. Haben Sie die "
+"LDAP-Eintr� manuell erzeugt?"
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"Unm�ch einen existierenden objectClass-Entrag %s mit %s=%s zu finden, um "
+"objectClass pykotaAccount anzuf�
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"Unm�ch einen existierenden Eintrag zu finden, um pykotaGroup objectClass %"
+"s anzuf�
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Internal SNMP accounting asked, but Python-SNMP is not available. Please "
+#~ "download it from http://pysnmp.sourceforge.net"
+#~ msgstr ""
+#~ "Internes SNMP-Accounting verlangt, doch Python-SNMP ist nicht verf� "
+#~ "Bitte laden Sie es herunter von http://pysnmp.sourceforge.net"
+
+#~ msgid ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Dumps PyKota database's content.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  dumpykota [options] \n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints dumpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+#~ "                       \n"
+#~ "                         - history : dumps the jobs history.\n"
+#~ "                         - users : dumps users.\n"
+#~ "                         - groups : dumps user groups.\n"
+#~ "                         - printers : dump printers.\n"
+#~ "                         - upquotas : dump user quotas.\n"
+#~ "                         - gpquotas : dump user groups quotas.\n"
+#~ "                         - payments : dumps user payments.\n"
+#~ "                         - pmembers : dumps printer groups members.\n"
+#~ "                         - umembers : dumps user groups members.\n"
+#~ "                         \n"
+#~ "                       NB : the -d | --data command line option   \n"
+#~ "                       is MANDATORY.\n"
+#~ "  \n"
+#~ "  -f | --format fmt    Dumps datas in the 'fmt' format. When not "
+#~ "specified,\n"
+#~ "                       the format is to dump datas in the csv format "
+#~ "(comma\n"
+#~ "                       separated values). All data dumped is between "
+#~ "double\n"
+#~ "                       quotes. Allowed formats are :\n"
+#~ "                       \n"
+#~ "                         - csv : separate datas with commas\n"
+#~ "                         - ssv : separate datas with semicolons\n"
+#~ "                         - tsv : separate datas with tabs\n"
+#~ "                         - xml : dump data as XML\n"
+#~ "                         \n"
+#~ "  -o | --output fname  All datas will be dumped to the file instead of\n"
+#~ "                       to the standard output. The special '-' filename\n"
+#~ "                       is the default value and means stdout.\n"
+#~ "                       WARNING : existing files are truncated !\n"
+#~ "  \n"
+#~ "Examples :\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "  \n"
+#~ "  This dumps the history in a comma separated values file, for possible\n"
+#~ "  use in a spreadsheet.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "  \n"
+#~ "  Dumps all users datas to the users.xml file.\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Erzeugt einen Auszug (Dump) des Inhalts der Pykota-Datenbank.\n"
+#~ "\n"
+#~ "Kommandozeilen-Gebrauch:\n"
+#~ "\n"
+#~ "  dumpykota [Optionen]\n"
+#~ "\n"
+#~ "Optionen:\n"
+#~ "\n"
+#~ "  -v | --version       Gibt die Versionsnummer von dumpykota aus und "
+#~ "endet.\n"
+#~ "  -h | --help          Gibt diese Meldung aus und endet.\n"
+#~ "\n"
+#~ "  -d | --data type     Gibt Daten vom Typ 'type' aus. Erlaubte Typen "
+#~ "sind:\n"
+#~ "\n"
+#~ "                         - history:  Gibt die Liste der Auftr� aus.\n"
+#~ "                         - users:    Gibt die Benutzer aus.\n"
+#~ "                         - groups:   Gibt die Gruppen aus.\n"
+#~ "                         - printers: Gibt die Drucker aus.\n"
+#~ "                         - upquotas: Gibt die Benutzerkontingente aus.\n"
+#~ "                         - gpquotas: Gibt die Gruppenkontingente aus.\n"
+#~ "                         - payments: Gibt die Zahlungen der Benutzer "
+#~ "aus.\n"
+#~ "                         - pmembers: Gibt die Mitglieder der "
+#~ "Druckergruppen aus.\n"
+#~ "                         - umembers: Gibt die Mitglieder der "
+#~ "Benutzergruppen aus.\n"
+#~ "                           \n"
+#~ "                         N.B.: die Kommandozeilenoption -d | --data\n"
+#~ "                         ist VERPFLICHTEND.\n"
+#~ "\n"
+#~ "  -f | --format fmt    Gibt die Daten im Format 'fmt' aus. Wenn nichts "
+#~ "anderes angegeben\n"
+#~ "                       werden die Daten im csv (comma separated values = "
+#~ "Die Werte\n"
+#~ "                       sind durch Kommas getrennt) ausgegeben. Alle "
+#~ "ausgegebenen Daten\n"
+#~ "                       erscheinen zwischen doppelten G�ef�n. "
+#~ "Erlaubte Formate\n"
+#~ "                       sind:\n"
+#~ "\n"
+#~ "                        - csv: trennt Daten durch Kommas\n"
+#~ "                        - ssv: trennt Daten durch Strichpunkte\n"
+#~ "                        - tsv: trennt Daten durch Tabulatorenspr�"
+#~ "                        - xml: gibt die Daten als XML aus\n"
+#~ "\n"
+#~ "  -o | --output fname  Alle Daten werden in eine Datei statt in die "
+#~ "Standardausgabe\n"
+#~ "                       geschrieben. Der spezielle Dateiname '-' ist der "
+#~ "Standardwert\n"
+#~ "                       und bezeichnet stdout.\n"
+#~ "                       ACHTUNG: Existierende Dateien werden "
+#~ "�hrieben.\n"
+#~ "\n"
+#~ "Beispiele:\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "\n"
+#~ "  Dies schreibt die Liste der Auftr� in eine Datei, in der die Daten "
+#~ "durch Kommas\n"
+#~ "  getrennt sind, zum m�chen Gebrauch in einer Tabellenverarbeitung.\n"
+#~ "\n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "\n"
+#~ "  Gibt alle Daten der Nutzer in die Datei users.xml aus.\n"
+#~ "\n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Melden Sie bitte Fehler an: %s"
+
+#~ msgid "Too many arguments, see help."
+#~ msgstr "Zu viele Argumente, siehe Hilfe."
+
+#~ msgid ""
+#~ "edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "A Print Quota editor for PyKota.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  edpykota [options] user1 user2 ... userN\n"
+#~ "  \n"
+#~ "  edpykota [options] group1 group2 ... groupN\n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints edpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -a | --add           Adds users and/or printers if they don't \n"
+#~ "                       exist on the Quota Storage Server.\n"
+#~ "                       \n"
+#~ "  -d | --delete        Deletes users/groups from the quota storage.\n"
+#~ "                       Printers are never deleted.\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+#~ "                       for a particular printer. Job price is optional.\n"
+#~ "                       If both are to be set, separate them with a "
+#~ "comma.\n"
+#~ "                       Floating point values are allowed.\n"
+#~ "  \n"
+#~ "  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+#~ "                              listed, separated by commas. The groups\n"
+#~ "                              must already exist in the Quota Storage.\n"
+#~ "  \n"
+#~ "  -u | --users         Edit users print quotas, this is the default.\n"
+#~ "  \n"
+#~ "  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+#~ "                       use wildcards characters to select only\n"
+#~ "                       some printers. The default value is *, meaning\n"
+#~ "                       all printers. \n"
+#~ "                       You can specify several names or wildcards, \n"
+#~ "                       by separating them with commas.\n"
+#~ "  \n"
+#~ "  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+#~ "                       pg1, pg2, etc... which must already exist.\n"
+#~ "                       A printer group is just like a normal printer,\n"
+#~ "                       only that it is usually unknown from the printing\n"
+#~ "                       system. Create printer groups exactly the same\n"
+#~ "                       way that you create printers, then add other \n"
+#~ "                       printers to them with this option.\n"
+#~ "                       Accounting is done on a printer and on all\n"
+#~ "                       the printer groups it belongs to, quota checking\n"
+#~ "                       is done on a printer and on all the printer "
+#~ "groups\n"
+#~ "                       it belongs to.\n"
+#~ "  \n"
+#~ "  -g | --groups        Edit users groups print quotas instead of users.\n"
+#~ "                          \n"
+#~ "  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+#~ "                       print quotas\n"
+#~ "                       \n"
+#~ "  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+#~ "  \n"
+#~ "  -r | --reset         Resets the actual page counter for the user\n"
+#~ "                       or group to zero on the specified printers. \n"
+#~ "                       The life time page counter is kept unchanged.\n"
+#~ "                       \n"
+#~ "  -R | --hardreset     Resets the actual and life time page counters\n"
+#~ "                       for the user or group to zero on the specified \n"
+#~ "                       printers. \n"
+#~ "                       \n"
+#~ "  -l | --limitby l     Choose if the user/group is limited in "
+#~ "printing                     \n"
+#~ "                       by its account balance or by its page quota.\n"
+#~ "                       The default value is 'quota'. Allowed values\n"
+#~ "                       are 'quota' 'balance' 'quota-then-balance' and\n"
+#~ "                       'balance-then-quota'.\n"
+#~ "                       WARNING : quota-then-balance and balance-then-"
+#~ "quota\n"
+#~ "                       are not yet implemented.\n"
+#~ "                       \n"
+#~ "  -b | --balance b     Sets the user's account balance to "
+#~ "b.                     \n"
+#~ "                       Account balance may be increase or decreased\n"
+#~ "                       if b is prefixed with + or -.\n"
+#~ "                       WARNING : when decreasing account balance,\n"
+#~ "                       the total paid so far by the user is decreased\n"
+#~ "                       too.\n"
+#~ "                       Groups don't have a real balance, but the\n"
+#~ "                       sum of their users' account balance.\n"
+#~ "                       \n"
+#~ "  -S | --softlimit sl  Sets the quota soft limit to sl "
+#~ "pages.                       \n"
+#~ "  \n"
+#~ "  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+#~ "  \n"
+#~ "  user1 through userN and group1 through groupN can use wildcards\n"
+#~ "  if the --add option is not set.\n"
+#~ "  \n"
+#~ "examples :                              \n"
+#~ "\n"
+#~ "  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+#~ "  \n"
+#~ "  This will add users john, paul, george and ringo to the quota\n"
+#~ "  database, and set their print quotas to the same values than user \n"
+#~ "  jerome. User jerome must already exist.\n"
+#~ "  User ringo's email address will also be set to 'ringo@example.com'\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  This will set jerome's print quota on the lp printer to a soft limit\n"
+#~ "  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+#~ "  printer lp doesn't exist on the Quota Storage Server then nothing is "
+#~ "done.\n"
+#~ "\n"
+#~ "  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  Same as above, but if either user jerome or printer lp doesn't exist \n"
+#~ "  on the Quota Storage Server they are automatically added. Also\n"
+#~ "  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+#~ "  already exist in the Quota Storage.\n"
+#~ "            \n"
+#~ "  $ edpykota -g -S 500 -H 550 financial support            \n"
+#~ "  \n"
+#~ "  This will set print quota soft limit to 500 pages and hard limit\n"
+#~ "  to 550 pages for groups financial and support on all printers.\n"
+#~ "  \n"
+#~ "  $ edpykota --reset jerome \"jo*\"\n"
+#~ "  \n"
+#~ "  This will reset jerome's page counter to zero on all printers, as\n"
+#~ "  well as every user whose name begins with 'jo'.\n"
+#~ "  Their life time page counter on each printer will be kept unchanged.\n"
+#~ "  You can also reset the life time page counters by using the\n"
+#~ "  --hardreset | -R command line option.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hpcolor --noquota jerome\n"
+#~ "  \n"
+#~ "  This will tell PyKota to not limit jerome when printing on the \n"
+#~ "  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+#~ "  accounting of the pages he prints will still be kept.\n"
+#~ "  Print Quotas for jerome on other printers are unchanged.\n"
+#~ "  \n"
+#~ "  $ edpykota --limitby balance jerome\n"
+#~ "  \n"
+#~ "  This will tell PyKota to limit jerome by his account's balance\n"
+#~ "  when printing.\n"
+#~ "  \n"
+#~ "  $ edpykota --balance +10.0 jerome\n"
+#~ "  \n"
+#~ "  This will increase jerome's account balance by 10.0 (in your\n"
+#~ "  own currency). You can decrease the account balance with a\n"
+#~ "  dash prefix, and set it to a fixed amount with no prefix.\n"
+#~ "  \n"
+#~ "  $ edpykota --delete jerome rachel\n"
+#~ "  \n"
+#~ "  This will completely delete jerome and rachel from the Quota Storage\n"
+#~ "  database. All their quotas and jobs will be deleted too.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp --charge 0.1\n"
+#~ "  \n"
+#~ "  This will set the page price for printer lp to 0.1. Job price\n"
+#~ "  will not be changed.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+#~ "  \n"
+#~ "  This will put printers hplj1 and hplj2 in printers groups Laser and "
+#~ "HP.\n"
+#~ "  When printing either on hplj1 or hplj2, print quota will also be \n"
+#~ "  checked and accounted for on virtual printers Laser and HP.\n"
+#~ "\n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "Ein Druckkontingent-Editor f�ota.\n"
+#~ "\n"
+#~ "Kommandozeilen-Gebrauch:\n"
+#~ "\n"
+#~ "  edpykota [options] benutzer1 benutzer2 ... benutzerN\n"
+#~ "  \n"
+#~ "  edpykota [options] gruppe1 gruppe2 ... gruppeN\n"
+#~ "\n"
+#~ "Optionen:\n"
+#~ "\n"
+#~ "   -v | --version       Gibt die Versionsnummer von edpykota aus und "
+#~ "endet.\n"
+#~ "   -h | --help          Gibt diese Meldung aus und endet.\n"
+#~ "   \n"
+#~ "   -a | --add           F�ue Benutzer und/oder Drucker hinzu, wenn "
+#~ "sie \n"
+#~ "                        noch nicht in der Datenbank der "
+#~ "Kontigentverwaltung\n"
+#~ "                        vorhanden sind.\n"
+#~ "                        \n"
+#~ "   -d | --delete        L�t Benutzer/Gruppen aus der "
+#~ "Kontigentverwaltung.\n"
+#~ "                        Drucker werden nie gel�t.\n"
+#~ "                        \n"
+#~ "   -c | --charge p[,j]  Setzt den Preis pro Seite und pro Auftrag fest, "
+#~ "der \n"
+#~ "                        f� betreffenden Drucker festgesetzt ist. Der "
+#~ "Preis \n"
+#~ "                        pro Auftrag ist fakultativ. Werden beide "
+#~ "verwendet, \n"
+#~ "                        trennen Sie sie mit einem Komma ab.\n"
+#~ "                        Flie�ommazahlen sind erlaubt.\n"
+#~ "   \n"
+#~ "   -i | --ingroups g1[,g2...] F�n Benutzer in jede der aufgef�\n"
+#~ "                              Gruppen ein, Trennung mit Kommas. Die "
+#~ "Gruppen\n"
+#~ "                              m�schon in der Kontingentverwaltung "
+#~ "existieren.\n"
+#~ "   \n"
+#~ "   -u | --users         Editiert das Kontingent f� Benutzer, dies "
+#~ "ist der Standard.\n"
+#~ "   \n"
+#~ "   -P | --printer p     Editiert das Kontingent nur auf dem Drucker p. p "
+#~ "kann aber\n"
+#~ "                        Platzhalter-Zeichen enthalten, um nur einige "
+#~ "Drucker\n"
+#~ "                        auszuw�en. Der Standardwert ist *, das heisst "
+#~ "alle\n"
+#~ "                        Drucker\n"
+#~ "                        Sie k�n verschiedene Namen oder Platzhalter,\n"
+#~ "                        getrennt durch Kommas, angeben.\n"
+#~ "   \n"
+#~ "   -G | --pgroups pg1[,pg2...] F�n/die Drucker der Druckergruppen "
+#~ "pg1,\n"
+#~ "                        pg2, etc..., die schon existieren m� hinzu.\n"
+#~ "                        Eine Druckergruppe ist wie ein normaler Drucker,\n"
+#~ "                        bloss kennt man ihn �erweise nicht im\n"
+#~ "                        Drucksystem. Richten Sie Druckergruppen genau\n"
+#~ "                        gleich wie Drucker ein, dann f�ie andere\n"
+#~ "                        Drucker mit dieser Option dazu.\n"
+#~ "                        Die Kontof� wird f�en Drucker und f�~ "alle\n"
+#~ "                        Druckergruppen, denen er angeh� gemacht,\n"
+#~ "                        die Kontingent��wird f� Drucker\n"
+#~ "                        und f�e Druckergruppen, zu denen er geh�\n"
+#~ "                        gemacht.\n"
+#~ "  \n"
+#~ "   -g | --groups        Editiert Benutzergruppen-Kontingente anstelle "
+#~ "von\n"
+#~ "                        Einzelbenutzern.\n"
+#~ "\n"
+#~ "   -p | --prototype u|g Setzt Benutzer u oder Gruppe g als Vorlage, um\n"
+#~ "                        Druckkontingente zu setzen.\n"
+#~ "\n"
+#~ "   -n | --noquota       Setzt keine Kontingentsbeschr�ung, sondern\n"
+#~ "                        macht bloss die Kontof�.\n"
+#~ "\n"
+#~ "   -r | --reset         Setzt den aktuellen Seitenz�er auf den\n"
+#~ "                        angegebenen Druckern f� Benutzer oder f�#~ "                        die Gruppe auf Null zur�er lebensl�liche\n"
+#~ "                        Seitenz�er bleibt unver�ert.\n"
+#~ "\n"
+#~ "   -R | --hardreset     Setzt den aktuellen und den lebensl�lichen\n"
+#~ "                        Seitenz�er auf den angegebenen Druckern f�#~ "                        den Benutzer oder die Gruppe auf Null zur�"
+#~ "\n"
+#~ "   -l | --limitby l     Bestimmen Sie, ob der Benutzer/die Gruppe f�~ "das\n"
+#~ "                        Drucken via account balance oder via "
+#~ "Seitenkontingent\n"
+#~ "                        limitiert wird.\n"
+#~ "                        Der Standardwert ist 'quota'. Erlaubte Werte "
+#~ "sind\n"
+#~ "                        'quota' 'balance' 'quota-then-balance' und\n"
+#~ "                        'balance-then-quota'.\n"
+#~ "                        ACHTUNG: quota-then-balance und balance-then-"
+#~ "quota\n"
+#~ "                        sind noch nicht implementiert.\n"
+#~ "\n"
+#~ "   -b | --balance b     Setzt die Abrechnungsbalance f� Benutzer auf "
+#~ "b.\n"
+#~ "                        Die Abrechnungsbalance kann erh�oder "
+#~ "vermindert\n"
+#~ "                        werden, wenn b das Vorzeichen + oder - tr�.\n"
+#~ "                        ACHTUNG: wenn die Abrechnungsbalance vermindert "
+#~ "wird,\n"
+#~ "                        wird auch die Gesamtsumme, die der Benutzer bis "
+#~ "anhin\n"
+#~ "                        bezahlt hat, ebenso vermindert.\n"
+#~ "                        Gruppen haben keine eigentliche Balance, sondern\n"
+#~ "                        die Summe der Balance ihrer Benutzer.\n"
+#~ "\n"
+#~ "   -S | --softlimit sl   Setzt die weiche Kontingentslimite auf sl "
+#~ "Seiten.\n"
+#~ "\n"
+#~ "   -H | --hardlimit hl   Setzt die harte Kontingentslimita auf hl "
+#~ "Seiten.\n"
+#~ "\n"
+#~ "   benutzer1 bis benutzerN und gruppe1 bis gruppeN k�n Platzhalter "
+#~ "benutzen,\n"
+#~ "   wenn die Option --add nicht gesetzt ist.\n"
+#~ "\n"
+#~ "Beispiele:\n"
+#~ "  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+#~ "  \n"
+#~ "  Benutzer john, paul, george und ringo werden zur Kontingentverwaltung\n"
+#~ "  hinzugef�lle ihre Druckkontingentwerte werden auf den Wert\n"
+#~ "  von Benutzer jerome gesetzt. Der Benutzer jerome muss schon "
+#~ "existieren.\n"
+#~ "\n"
+#~ "  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+#~ "\n"
+#~ "  Dies setzt das Druckkontingent von jerome f� lp Drucker auf\n"
+#~ "  eine weiche Grenze von 50 Seiten und auf eine harte Grenze von 80\n"
+#~ "  Seiten. Wenn entweder der Benutzer jerome oder der Drucker lp nicht\n"
+#~ "  exisitiert, wird nichts ausgef�n"
+#~ "\n"
+#~ "  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+#~ "\n"
+#~ "  Das gleiche wie oben, doch wenn entweder der Benutzer jerome oder der\n"
+#~ "  Drucker lp auf der Kontingentverwaltung nicht exisitieren,\n"
+#~ "  werden sie automatisch angelegt. Desgleichen wird der Benutzer jerome\n"
+#~ "  in die Gruppen 'coders' und 'it' eingef�ie aber schon in der\n"
+#~ "  Kontingentverwaltung existieren m�\n"
+#~ "\n"
+#~ "  $ edpykota -g -S 500 -H 550 financial support\n"
+#~ "\n"
+#~ "  Dies setzt den Gruppen 'financial' und 'support' das weiche \n"
+#~ "  Druckkontingent auf 500 und das harte auf 550 Seiten f�e\n"
+#~ "  Drucker.\n"
+#~ "\n"
+#~ "  $ edpykota --reset jerome \"jo*\"\n"
+#~ "\n"
+#~ "  Dies setzt den Seitenz�er f�ome auf allen Druckern auf Null\n"
+#~ "  zur�benso f�e Benutzer, deren Namen mit 'jo' beginnt.\n"
+#~ "  Ihre lebensl�lichen Seitenz�er auf den einzelnen Druckern bleibt\n"
+#~ "  unver�ert.\n"
+#~ "  Sie k�n die lebensl�lichen Seitenz�er mit der\n"
+#~ "  Kommandozeilenoption --hardreset | -R zur�zen.\n"
+#~ "\n"
+#~ "  $ edpykota --printer hpcolor --noquota jerome\n"
+#~ "\n"
+#~ "  Dies weist Pykota an, jerome beim Drucken auf dem Drucker hpcolor\n"
+#~ "  keine Limiten aufzuerlegen. Alle seine Auftr� auf diesen Drucker\n"
+#~ "  werden zugelassen, doch die Abrechnung der Seiten bleibt.\n"
+#~ "  Druckkontingente f�ome auf den anderen Druckern bleiben\n"
+#~ "  unver�ert.\n"
+#~ "\n"
+#~ "  $ edpykota --limitby balance jerome\n"
+#~ "\n"
+#~ "  Das weist Pykota an, jerome beim Drucken via Konto-Balance zu\n"
+#~ "  begrenzen.\n"
+#~ "\n"
+#~ "  $ edpykota --balance +10.0 jerome\n"
+#~ "\n"
+#~ "  Dies erh�den Kontostand von jerome mit 10.0 (in Ihrer W�ung).\n"
+#~ "  Sie k�n den Stand mit einem Minuszeichen erniedrigen und ihn,\n"
+#~ "  wenn sie kein Vorzeichen eingeben, auf einen fixen Betrag festlegen.\n"
+#~ "\n"
+#~ "  $ edpykota --delete jerome rachel\n"
+#~ "\n"
+#~ "  Dies l�t jerome und rachel komplett aus der Kontingenverwaltung.\n"
+#~ "  Alle ihre Kontingenge und Auftr� werden ebenfalls gel�t.\n"
+#~ "\n"
+#~ "  $ edpykota --printer lp --charge 0.1\n"
+#~ "\n"
+#~ "  Dies setzt den Seitenpreis auf dem Drucker lp auf 0.1. Der Preis\n"
+#~ "  pro Auftrag wird nicht ver�ert.\n"
+#~ "\n"
+#~ "  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+#~ "\n"
+#~ "  Dies f�e Drucker hplj1 und hlpj2 in die Druckergruppen Laser\n"
+#~ "  und HP ein. Wenn entweder auf hplj1 oder hplj2 gedruckt wird, wird\n"
+#~ "  das Druckkontingent ebenso f� virtuellen Drucker Laser und\n"
+#~ "  HP beachtet und berechnet.\n"
+#~ "\n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Melden Sie bitte Fehler an: %s"
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Gruppe          used    Soft    Hard    Konto   Aufschub      Gesamt   "
+#~ "Bezahlt"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "User            used    Soft    Hard    Konto   Aufschub      Gesamt   "
+#~ "Bezahlt"
+
+#~ msgid "Waiting for printer %s to be idle or printing..."
+#~ msgstr "Am Warten darauf, dass Drucker %s 'idle' oder 'printing' wird..."
Index: pykota/tags/1.22/po/el_GR/pykota.po
===================================================================
--- pykota/tags/1.22/po/el_GR/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/el_GR/pykota.po (revision 2228)
@@ -0,0 +1,2889 @@
+# PyKota
+# 
+# PyKota : Print Quotas for CUPS and LPRng
+# 
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+# 
+# $Id$
+# 
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-10-26 18:51:00+0200\n"
+"Last-Translator: Spyros Melissovas <peppe@cs.uoi.gr>\n"
+"Language-Team: Greek <peppe@cs.uoi.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-7\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"��� � ������������� ��� ������\n"
+"\n"
+"�� � ���� ����� � ����������������� �����n"
+"�����������!\n"
+"\n"
+"���� ���\n"
+"\n"
+"  � ���� �� ����� � ����������� ��� ���� "
+"��\n"
+"  � ����� ��� ���xternal policy) ��pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance � } \n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����autopykota � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"  -i | --initbalance b ���� �������� �b.\n"
+"                       � ������ ��� ���n"
+"                       �� � � ����, ����\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "����������� �������
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "�����������
+msgid "Job accounting ends."
+msgstr "����������
+msgid "Job size forced to 0 because printing is denied."
+msgstr "� ���������� �� ������"
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "������: %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "��� �����s � ���%s"
+
+msgid "Job added to history."
+msgstr "������� ����"
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+"� �� ��� %s ��� � �������
+"��������
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "SIGTERM ��� ���� �� %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "��� CUPS %s �������
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr "����-d | --data �����, �����."
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr "��������� �����"
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "� ��������%s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "� ����� �s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+"� �� �%i ������������%i, ��� "
+"��
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "� ���� ���%s"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "� ���� ��%s"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "� ���� limitby %s"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "����������%s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "� ������� %s"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "������� ������%s"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "������� ������ �� � �� ���
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "� ������ %s ����������
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "� ��%s ���������������%s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+"����� ��� ������%s) � ���%s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr ""
+"�������������� �%s) � ���%s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "� ������-mail %s"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "� �������%s"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "� �������s"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "� ����� �����s � ���%s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "���%s �����������Kota."
+
+msgid "incompatible options, see help."
+msgstr "������ ������."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "���������� ���� �� ���."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "��������� ���� �� ���."
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "����"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "��"
+
+msgid "Filename"
+msgstr "�����
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"���� ��� � ����� �������\n"
+"\n"
+"���� ���\n"
+"\n"
+"  pkhint [��� [���1 ���2 ... ���N] <file.conf\n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����pkhint � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"����                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  ����� ��� �� ����� ��\n"
+"  ������ ��� � ���� � ���\n"
+"  ��� ����� ����� � ����.\n"
+"  \n"
+"  � �������������������
+"  ����.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "� ���RI ���s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"������ � pkhint ������� �����"���..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "����� %s � ����%s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"������� ������etc/pykota/pykota.conf :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# ����: �������� ��������
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr "# ������ ������ ��� PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr "# ��� ������� �������, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"���� ������yKota.\n"
+"\n"
+"���� ���\n"
+"\n"
+"  pkprinters [��� ���1 ���2 ... ���N\n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����pkprinters � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"  -a | --add           ������� �� �� ���"
+"                       ���. � ��, �������"                       ����� � ����-s|--"
+"skipexisting.\n"
+"                       \n"
+"  -d | --delete        ������� � ��������n"
+"  \n"
+"  -D | --description   ����� ����������"
+"                       \n"
+"  -c | --charge p[,j]  ���� ��� ��� � ���n"
+"                       �� ��������.\n"
+"                       � ������, ��������"
+"                       ��\n"
+"                       �������� ����� ��"
+"  \n"
+"  -g | --groups pg1[,pg2...] ���������� ����\n"
+"                       � �� ����g1, pg2, �.� ���
+"                       ������. ���������n"
+"                       ������ ���, ���� �\n"
+"                       ������� ���. ����n"
+"                       �� ���������������"
+"                       ���, ���������� ��\n"
+"                       ����������������n"
+"                       ������������ ��\n"
+"                       ��� ����������\n"
+"                       � � ���� �������n"
+"                       --remove, ��������� ����"
+"                       � ���� �� ����"
+"                       \n"
+"  -l | --list          ������ �� ��� ����\n"
+"                       � ��� ����������\n"
+"                       \n"
+"  -r | --remove        � �������-groups ��,\n"
+"                       ������ � ���� ��\n"
+"                       ����n"
+"                       \n"
+"  -s | --skipexisting  � �������-add ��, �\n"
+"                       ����pkprinters ��������n"
+"                       ���.\n"
+"  \n"
+"  � ������1 � ���N ������ ���n"
+"  �� �� ����--add.\n"
+"  \n"
+"���:                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  ������������p2100, hp2200 � hp8000.\n"
+"  �� � � ������.05 ��� � �� �\n"
+"  � ����0.1 ��� ��� ��������n"
+"  ���� �� ��� � ���� ����\n"
+"  �� ����� ��������\"HP Printer\".\n"
+"  � ���� � � ��� ���������n"
+"  ������ � ����-s|--skipexisting.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  �������� � ��� � ����� �\n"
+"  ������ ������ �.\n"
+"  ������� � ����!\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  ��������� ������� �\"hp*\" \n"
+"  � �� ����aser � HP, ���� ����.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  ��������hp2200 � �������exMark.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "���� %s �������
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "���� %s ���������"
+
+msgid "in"
+msgstr "�
+msgid "You have to pass printer groups names on the command line"
+msgstr "������� ���������� ���
+msgid "You have to pass printer names on the command line"
+msgstr "������� ������������
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"������PyKota ��������OSD).\n"
+"\n"
+"���� ���\n"
+"\n"
+"  pykosd [���\n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����pykosd � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"  -c | --color #rrggbb ����� ���������n"
+"                       ���� ���� ��� #FF0000 ��n"
+"                       100%% ���n"
+"                       ����������00%% �� "
+"(#00FF00).\n"
+"                       \n"
+"  -d | --duration d    ����������������\n"
+"                       ����� ����� ����n"
+"                       \n"
+"  -f | --font f        ��������� �������"
+"                       �������� �����OSD �"
+"Python.\n"
+"  \n"
+"  -l | --loop n        ������ �������� �
+"���\n"
+"                       �������, ���������"
+"                       \n"
+"  -s | --sleep s       ����� ��� �� � ����\n"
+"                       ����������80 ����3 "
+"��\n"
+"                       \n"
+"  \n"
+"����                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  ����ykosd. ������������0 ����n"
+"  � ��� � 3 ������� ���. ���"
+"  �����, ��������\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "� ���������%s"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "� ����������"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "� ��������� %s"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "� ���������"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "���%s � ���������Kota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "��� �� � %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "���PyKota ���� : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"��� ��� � ���� ����\n"
+"\n"
+"���� ���\n"
+"\n"
+"  pykotme  [���  [��]\n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����pykotme � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"  -P | --printer p     ��� ��� ��������\n"
+"                       �p ���������� ����\n"
+"                       �������� �����*,\n"
+"                       ���������"
+"                       ������������� ��� \n"
+"                       ������.\n"
+"  \n"
+"����                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  ��� ����� � ����������n"
+"  ��� �� � ��������������\n"
+"  ���ile1.ps � file2.ps ����������n"
+"  apple.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  ��� ����� � ����������n"
+"  ��� �� � ��������������\n"
+"  ���ile1.ps ���������, ��n"
+"  ���� ���apple �����hplaser.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  ��� ����� � � ���������\n"
+"  ���� ��. �������������
+"  ���� �� ���� �����.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "� ���������: %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "������: %i ��"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "��� ���%s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"�����������"
+"\n"
+"���� ���\n"
+"\n"
+"  repykota [��� \n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����repykota � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"  -u | --users         ������ ������ �n"
+"                       �� ��������\n"
+"  \n"
+"  -g | --groups        ������ ������ ��\n"
+"                       ������\n"
+"  \n"
+"  -P | --printer p     ����� ����� �n"
+"                       ���p ���������� �n"
+"                       ��� ��������"
+"                       ������*, �� �����"
+"                       ������������ ���\n"
+"                       �������.\n"
+"  \n"
+"����                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  ��� ���� ���� � �� ���n"
+"  ���� ���lp.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  ��� ���� ���� � �� ���"
+"  �� ���.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  ��� ���� ���� � ���erome �\n"
+"  �� ������� ���� \"jo\" ���
+"  � ��� ����� ���� \"laser\" ����n"
+"  �"pson\".\n"
+"  \n"
+"  � ��� � ���� ������ �PyKota, ���"
+"  ���� ������������ � ��\n"
+"  �������������\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"��� email ������ �� �����.\n"
+"\n"
+"���� ���\n"
+"\n"
+"  warnpykota  [���  [���n"
+"\n"
+"���:\n"
+"\n"
+"  -v | --version       ��� �����warnpykota � ���.\n"
+"  -h | --help          ��� ����� ���.\n"
+"  \n"
+"  -u | --users         ������ ���� ���n"
+"                       ��� �. ��������\n"
+"  \n"
+"  -g | --groups        ������ ����� �� ��"
+"��.\n"
+"  \n"
+"  -P | --printer p     �������������� �"
+"���n"
+"                       p ����������� ���� "
+"��"
+"                       ������ ����� ��*, �n"
+"                       ��������"
+"                       ������������ ��� ��"
+"                       ���������"
+"  \n"
+"����                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  ������� ������lp ��� �� �"
+"  ������.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  ������� ����� �� �����\n"
+"  � ���� ���\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  ������� ����� �������� �\n"
+"  \"dev\" ����� �� ����� � ����\n"
+"  ������������  \"laserjet\"\n"
+"  \n"
+"  � ��� � ���� ������ �PyKota, �n"
+"  �������������� ���� �\n"
+"  ����������� ��������n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"��� ��� �� e-mail � %s"
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "���PyKota"
+
+msgid "Report"
+msgstr "���
+msgid "Printer"
+msgstr "���
+
+msgid "User / Group names mask"
+msgstr "�������� ���
+
+msgid "Groups report"
+msgstr "�����msgid "History"
+msgstr "���
+
+msgid "Empty"
+msgstr "���
+msgid "Action"
+msgstr "����
+msgid "User"
+msgstr "���
+
+msgid "Hostname"
+msgstr "����
+
+msgid "JobId"
+msgstr "���"
+
+msgid "JobSize"
+msgstr "���
+
+msgid "JobPrice"
+msgstr "��
+
+msgid "Copies"
+msgstr "���"
+
+msgid "JobBytes"
+msgstr "���
+
+msgid "PageCounter"
+msgstr "�����"
+
+msgid "Options"
+msgstr "���"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "���� ��
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "� ���� �� ���� %s"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "� �������� %s."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "����%s ������� global �%s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "����%s ������� %s �%s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "����logger ��� �����"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "� �������� � ����%s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr ""
+"�������� � �� %s ��� �����"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "����enforcement � �� %s ��� �����"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr "����onaccounterror ���s ��� �����"
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "� ����� %s � ����%s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "����policy � �� %s ��� �����"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "� ������mailto %s � ����%s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "����mailto � ��  %s ��� �����"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "� ��������"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "� �����poor man's %s"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"� ��������� �����\n"
+"������������ ��n"
+"�����������������."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"��������������n"
+"�� �� ����� �� ���%s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"������������� ��"
+"�� ����������� ���%s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr "� �� �� [%s] � ����-data, �����."
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr "� �� �� [%s] � ����-format, �����."
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr "���� XML ��������������axml."
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "������� �PyKota �� : �������
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "� ���� �� ����"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "�����s � ���%s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "�������: %i ��
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "��� ���%.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "��� �� %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "���
+#, python-format
+msgid "Real : %s"
+msgstr "����: %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "��� %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "� ���� �� ���s"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "� ���� �� ����%s"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "���� ����� SMTP : %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "����� e-mail � %s, ��%s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"������������������n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"������s � ���%s, ����� ���s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"�����������s, ����� ���s)"
+"� ����%s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "����� ��� � ���%s � ���%s"
+
+msgid "Print Quota"
+msgstr "�����"
+
+msgid "Print Quota Exceeded"
+msgstr "����� ���"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "������������%s � ���%s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "����� ��� � ���s � ���%s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "������������s � ���%s"
+
+msgid "Print Quota Low"
+msgstr "��������#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "������, ���%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr "�� ����� ���������PDL : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "SIGTERM �� �� ���%s."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "��������� ��localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "����� ���, ���%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"���� %s � ������ ��� PyKota, ���"
+"��� ���s) � ����%s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"���%s � ������ ��� PyKota, ������ "
+"���s) � ����%s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"���%s � �������%s ��� PyKota, ���"
+"��� ���s) � ����%s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"������ %s � ����%s ������� "
+"��� ����������� �PyKota."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"���� %s � ������ ��� PyKota, ����� "
+"���s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"���%s � ������ ��� PyKota, ����� "
+"���s) � ����%s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"���%s � �������%s ��� PyKota, ���"
+"�� ���s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"���� %s � �������� ��� PyKota, ��� "
+"����"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"���%s � �������� ��� PyKota, ��� �"
+"��� � ���%s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"���%s � ���������%s ��� PyKota, �
+"�������
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+"�������� ���������� ���� �"
+"���%s."
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+"������� ����%s � ���������."
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+"��������� ���� ����%s ���"
+"��� ���"
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "� ���������� ��� ����%s."
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+"���������� �����������%s."
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr "����� � �������� ����%s."
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "����� ����HARDWARE(%s) � ����%s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "���ARDWARE(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "SIGTERM ��� ����� ��%s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+"��� [%s] ������� �����. ���� ��.."
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "�� �� ����� ��%s ��%s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "������ �����s ��DWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "�� ���� � %s:%s : %s"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "�� ���������L �%s:%s : %s"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "���� ������������s..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"��� PJL ���. �������������"
+"���� (%s) ����%s."
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "����� ���SNMP �� � ���%s : %s"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr "������ ����� SNMP � ���%s : %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+"��� SNMP ���. �������������"
+"���� (%s) ����%s."
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "���OFTWARE(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "�� ���� ��������� %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+"������������ ����� ����%s : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "�� �� ����� ������%s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"� �����������������������
+"��."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"������� ������� ��������. "
+"�����������etc/pykota/pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "���� �%s(%s) � %s(��%s) � ������"
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "������������LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "������������LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "�������������LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+"� �������ykotaAccountBalance � ���s. ���� "
+"LDAP ������� ;"
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"�������objectClass %s ���� %s=%s � ���
+"pykotaAccount objectClass"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"����������������ykotaGroup "
+"objectclass %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Internal SNMP accounting asked, but Python-SNMP is not available. Please "
+#~ "download it from http://pysnmp.sourceforge.net"
+#~ msgstr ""
+#~ "������� �SNMP, �������ython-SNMP � ��"
+#~ "���. �������� http://pysnmp.sourceforge.net"
+
+#~ msgid ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Dumps PyKota database's content.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  dumpykota [options] \n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints dumpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+#~ "                       \n"
+#~ "                         - history : dumps the jobs history.\n"
+#~ "                         - users : dumps users.\n"
+#~ "                         - groups : dumps user groups.\n"
+#~ "                         - printers : dump printers.\n"
+#~ "                         - upquotas : dump user quotas.\n"
+#~ "                         - gpquotas : dump user groups quotas.\n"
+#~ "                         - payments : dumps user payments.\n"
+#~ "                         - pmembers : dumps printer groups members.\n"
+#~ "                         - umembers : dumps user groups members.\n"
+#~ "                         \n"
+#~ "                       NB : the -d | --data command line option   \n"
+#~ "                       is MANDATORY.\n"
+#~ "  \n"
+#~ "  -f | --format fmt    Dumps datas in the 'fmt' format. When not "
+#~ "specified,\n"
+#~ "                       the format is to dump datas in the csv format "
+#~ "(comma\n"
+#~ "                       separated values). All data dumped is between "
+#~ "double\n"
+#~ "                       quotes. Allowed formats are :\n"
+#~ "                       \n"
+#~ "                         - csv : separate datas with commas\n"
+#~ "                         - ssv : separate datas with semicolons\n"
+#~ "                         - tsv : separate datas with tabs\n"
+#~ "                         - xml : dump data as XML\n"
+#~ "                         \n"
+#~ "  -o | --output fname  All datas will be dumped to the file instead of\n"
+#~ "                       to the standard output. The special '-' filename\n"
+#~ "                       is the default value and means stdout.\n"
+#~ "                       WARNING : existing files are truncated !\n"
+#~ "  \n"
+#~ "Examples :\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "  \n"
+#~ "  This dumps the history in a comma separated values file, for possible\n"
+#~ "  use in a spreadsheet.\n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "  \n"
+#~ "  Dumps all users datas to the users.xml file.\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "��� ����������� PyKota.\n"
+#~ "\n"
+#~ "���� ���\n"
+#~ "\n"
+#~ "  dumpykota [��� \n"
+#~ "\n"
+#~ "���:\n"
+#~ "\n"
+#~ "  -v | --version       ��� �����dumpykota� ���.\n"
+#~ "  -h | --help          ��� ����� ���.\n"
+#~ "  \n"
+#~ "  -d | --data type     ��� ���'���������\n"
+#~ "                       \n"
+#~ "                         - history : ��� ������.\n"
+#~ "                         - users : ��� ��\n"
+#~ "                         - groups : ��� �� ��\n"
+#~ "                         - printers : ��� ���.\n"
+#~ "                         - upquotas : ��� ����n"
+#~ "                         - gpquotas : ��� ������n"
+#~ "                         - payments : ��� ��� ��\n"
+#~ "                         - pmembers : ��� ������\n"
+#~ "                         - umembers : ��� �������n"
+#~ "                         \n"
+#~ "                       ��� ����-d | --data ��"
+#~ "������n"
+#~ "  \n"
+#~ "  -f | --format fmt    ��� ���������� ��"
+#~ "�\n"
+#~ "                       ��� ������sv (��#~ "����n"
+#~ "                       ���� �����������n"
+#~ "                       ������������\n"
+#~ "                       ���������� ��:\n"
+#~ "                       \n"
+#~ "                         - csv : ������ ���"
+#~ "                         - ssv : ������ ���"
+#~ "���\n"
+#~ "                         - tsv : ������ ���"
+#~ "(tabs)\n"
+#~ "                         - xml : ��� ��� �L\n"
+#~ "                         \n"
+#~ "  -o | --output � ��������� �� ��"
+#~ "'�\n"
+#~ "                       ���������� ����#~ "���n"
+#~ "                       ��� � '-' � ����� �
+#~ "���n"
+#~ "                       � ������ � �� ����#~ "���n"
+#~ "                       ���� �����������!\n"
+#~ "  \n"
+#~ "�����\n"
+#~ "\n"
+#~ "  $ dumpykota --data history --format csv >myfile.csv\n"
+#~ "  \n"
+#~ "  ���������� ���� ��������n"
+#~ "  � ��������� ��n"
+#~ "  \n"
+#~ "  $ dumpykota --data users --format xml -o users.xml\n"
+#~ "  \n"
+#~ "  ���� ��������� users.xml .\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "��� ��� �� e-mail � %s"
+
+#~ msgid "Too many arguments, see help."
+#~ msgstr "������ ��� �����."
+
+#~ msgid ""
+#~ "edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "A Print Quota editor for PyKota.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  edpykota [options] user1 user2 ... userN\n"
+#~ "  \n"
+#~ "  edpykota [options] group1 group2 ... groupN\n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints edpykota's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "  -a | --add           Adds users and/or printers if they don't \n"
+#~ "                       exist on the Quota Storage Server.\n"
+#~ "                       \n"
+#~ "  -d | --delete        Deletes users/groups from the quota storage.\n"
+#~ "                       Printers are never deleted.\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+#~ "                       for a particular printer. Job price is optional.\n"
+#~ "                       If both are to be set, separate them with a "
+#~ "comma.\n"
+#~ "                       Floating point values are allowed.\n"
+#~ "  \n"
+#~ "  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+#~ "                              listed, separated by commas. The groups\n"
+#~ "                              must already exist in the Quota Storage.\n"
+#~ "  \n"
+#~ "  -u | --users         Edit users print quotas, this is the default.\n"
+#~ "  \n"
+#~ "  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+#~ "                       use wildcards characters to select only\n"
+#~ "                       some printers. The default value is *, meaning\n"
+#~ "                       all printers. \n"
+#~ "                       You can specify several names or wildcards, \n"
+#~ "                       by separating them with commas.\n"
+#~ "  \n"
+#~ "  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+#~ "                       pg1, pg2, etc... which must already exist.\n"
+#~ "                       A printer group is just like a normal printer,\n"
+#~ "                       only that it is usually unknown from the printing\n"
+#~ "                       system. Create printer groups exactly the same\n"
+#~ "                       way that you create printers, then add other \n"
+#~ "                       printers to them with this option.\n"
+#~ "                       Accounting is done on a printer and on all\n"
+#~ "                       the printer groups it belongs to, quota checking\n"
+#~ "                       is done on a printer and on all the printer "
+#~ "groups\n"
+#~ "                       it belongs to.\n"
+#~ "  \n"
+#~ "  -g | --groups        Edit users groups print quotas instead of users.\n"
+#~ "                          \n"
+#~ "  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+#~ "                       print quotas\n"
+#~ "                       \n"
+#~ "  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+#~ "  \n"
+#~ "  -r | --reset         Resets the actual page counter for the user\n"
+#~ "                       or group to zero on the specified printers. \n"
+#~ "                       The life time page counter is kept unchanged.\n"
+#~ "                       \n"
+#~ "  -R | --hardreset     Resets the actual and life time page counters\n"
+#~ "                       for the user or group to zero on the specified \n"
+#~ "                       printers. \n"
+#~ "                       \n"
+#~ "  -l | --limitby l     Choose if the user/group is limited in "
+#~ "printing                     \n"
+#~ "                       by its account balance or by its page quota.\n"
+#~ "                       The default value is 'quota'. Allowed values\n"
+#~ "                       are 'quota' 'balance' 'quota-then-balance' and\n"
+#~ "                       'balance-then-quota'.\n"
+#~ "                       WARNING : quota-then-balance and balance-then-"
+#~ "quota\n"
+#~ "                       are not yet implemented.\n"
+#~ "                       \n"
+#~ "  -b | --balance b     Sets the user's account balance to "
+#~ "b.                     \n"
+#~ "                       Account balance may be increase or decreased\n"
+#~ "                       if b is prefixed with + or -.\n"
+#~ "                       WARNING : when decreasing account balance,\n"
+#~ "                       the total paid so far by the user is decreased\n"
+#~ "                       too.\n"
+#~ "                       Groups don't have a real balance, but the\n"
+#~ "                       sum of their users' account balance.\n"
+#~ "                       \n"
+#~ "  -S | --softlimit sl  Sets the quota soft limit to sl "
+#~ "pages.                       \n"
+#~ "  \n"
+#~ "  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+#~ "  \n"
+#~ "  user1 through userN and group1 through groupN can use wildcards\n"
+#~ "  if the --add option is not set.\n"
+#~ "  \n"
+#~ "examples :                              \n"
+#~ "\n"
+#~ "  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+#~ "  \n"
+#~ "  This will add users john, paul, george and ringo to the quota\n"
+#~ "  database, and set their print quotas to the same values than user \n"
+#~ "  jerome. User jerome must already exist.\n"
+#~ "  User ringo's email address will also be set to 'ringo@example.com'\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  This will set jerome's print quota on the lp printer to a soft limit\n"
+#~ "  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+#~ "  printer lp doesn't exist on the Quota Storage Server then nothing is "
+#~ "done.\n"
+#~ "\n"
+#~ "  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  Same as above, but if either user jerome or printer lp doesn't exist \n"
+#~ "  on the Quota Storage Server they are automatically added. Also\n"
+#~ "  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+#~ "  already exist in the Quota Storage.\n"
+#~ "            \n"
+#~ "  $ edpykota -g -S 500 -H 550 financial support            \n"
+#~ "  \n"
+#~ "  This will set print quota soft limit to 500 pages and hard limit\n"
+#~ "  to 550 pages for groups financial and support on all printers.\n"
+#~ "  \n"
+#~ "  $ edpykota --reset jerome \"jo*\"\n"
+#~ "  \n"
+#~ "  This will reset jerome's page counter to zero on all printers, as\n"
+#~ "  well as every user whose name begins with 'jo'.\n"
+#~ "  Their life time page counter on each printer will be kept unchanged.\n"
+#~ "  You can also reset the life time page counters by using the\n"
+#~ "  --hardreset | -R command line option.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hpcolor --noquota jerome\n"
+#~ "  \n"
+#~ "  This will tell PyKota to not limit jerome when printing on the \n"
+#~ "  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+#~ "  accounting of the pages he prints will still be kept.\n"
+#~ "  Print Quotas for jerome on other printers are unchanged.\n"
+#~ "  \n"
+#~ "  $ edpykota --limitby balance jerome\n"
+#~ "  \n"
+#~ "  This will tell PyKota to limit jerome by his account's balance\n"
+#~ "  when printing.\n"
+#~ "  \n"
+#~ "  $ edpykota --balance +10.0 jerome\n"
+#~ "  \n"
+#~ "  This will increase jerome's account balance by 10.0 (in your\n"
+#~ "  own currency). You can decrease the account balance with a\n"
+#~ "  dash prefix, and set it to a fixed amount with no prefix.\n"
+#~ "  \n"
+#~ "  $ edpykota --delete jerome rachel\n"
+#~ "  \n"
+#~ "  This will completely delete jerome and rachel from the Quota Storage\n"
+#~ "  database. All their quotas and jobs will be deleted too.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp --charge 0.1\n"
+#~ "  \n"
+#~ "  This will set the page price for printer lp to 0.1. Job price\n"
+#~ "  will not be changed.\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+#~ "  \n"
+#~ "  This will put printers hplj1 and hplj2 in printers groups Laser and "
+#~ "HP.\n"
+#~ "  When printing either on hplj1 or hplj2, print quota will also be \n"
+#~ "  checked and accounted for on virtual printers Laser and HP.\n"
+#~ "\n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "�������� � �yKota.\n"
+#~ "\n"
+#~ "���� ���\n"
+#~ "\n"
+#~ "  edpykota [��� �� �� ... ��\n"
+#~ "  \n"
+#~ "  edpykota [��� �� �� ... ��\n"
+#~ "\n"
+#~ "���:\n"
+#~ "\n"
+#~ "  -v | --version       ��� �����edpykota� ���.\n"
+#~ "  -h | --help          ��� ����� ���.\n"
+#~ "  \n"
+#~ "  -a | --add           �������/���� �� ��\n"
+#~ "                       �����������"
+#~ "                       \n"
+#~ "  -d | --delete        ������� � �������"
+#~ "                       ��������������\n"
+#~ "                       \n"
+#~ "  -c | --charge p[,j]  ����� ��� ��� � "
+#~ "���"
+#~ "                       � ������� �� ����"
+#~ "��n"
+#~ "                       ���. � ������, ���"
+#~ "���"
+#~ "                       �� �������� ���\n"
+#~ "  \n"
+#~ "  -i | --ingroups g1[,g2...]  ����� ����� � �"
+#~ "��\n"
+#~ "                              ���������� � "
+#~ "��\n"
+#~ "                              ����� ��������"
+#~ "  \n"
+#~ "  -u | --users         ��������� �� ����"
+#~ "�"
+#~ "                       �������n"
+#~ "  \n"
+#~ "  -P | --printer p     �������� �������"
+#~ "p.\n"
+#~ "                       ����p ���������� "
+#~ "�n"
+#~ "                       ��� �������� ����"
+#~ "�\n"
+#~ "                       ��*, �� �����n"
+#~ "                       ������������ ��� \n"
+#~ "                       �������.\n"
+#~ "  \n"
+#~ "  -G | --pgroups pg1[,pg2...] ������ ���� � ��\n"
+#~ "                       ����g1, pg2, �.�����"
+#~ "���.\n"
+#~ "                       �������������� "
+#~ "��"
+#~ "                       ��� ������� ���.\n"
+#~ "                       ������ ����������
+#~ "�n"
+#~ "                       �������� �����
+#~ "���\n"
+#~ "                       �� �������n"
+#~ "                       ����� � �������� "
+#~ "�n"
+#~ "                       ���� � ���� �����"
+#~ "���
+#~ "                       ��.\n"
+#~ "  \n"
+#~ "  -g | --groups        �������� � �� ����"
+#~ "�\n"
+#~ "                       �� ��\n"
+#~ "                          \n"
+#~ "  -p | --prototype u|g �������� ����g ��"
+#~ "�\n"
+#~ "                       �������\n"
+#~ "                       \n"
+#~ "  -n | --noquota       ���������� "
+#~ "����.\n"
+#~ "  \n"
+#~ "  -r | --reset         ������� �� � ��� �n"
+#~ "                       ��� � ������� \n"
+#~ "                       �������� �����\n"
+#~ "                       \n"
+#~ "  -R | --hardreset     �������� � ��� "
+#~ "����\n"
+#~ "                       � ��� ��������� \n"
+#~ "                       ���. \n"
+#~ "                       \n"
+#~ "  -l | --limitby l     �������������� "
+#~ "���                       � ��� ��������
+#~ "������\n"
+#~ "                       ������ ��'quota' (�
+#~ "���).\n"
+#~ "                       ���� ��� 'quota' (����n"
+#~ "                       'balance' (������), 'quota-then-"
+#~ "balance' (��"
+#~ "                       �� ���� 'balance-then-"
+#~ "quota' (����\n"
+#~ "                       ���                       ����: � "
+#~ "��� quota-then-balance � balance-then-quota\n"
+#~ "                       � �� ��� ��\n"
+#~ "                       \n"
+#~ "  -b | --balance b     ������ ��� ����� "
+#~ "���.\n"
+#~ "                       � ��������������"
+#~ "�����n"
+#~ "                       � � � ����+ �-.\n"
+#~ "                       ����: ������� ���, "
+#~ "�����,\n"
+#~ "                       �� ������� �����
+#~ "����"
+#~ "                       ��\n"
+#~ "                       � �� � �� ��� ������
+#~ "����n"
+#~ "                       ��������.\n"
+#~ "                       \n"
+#~ "  -S | --softlimit sl  ���������l ��\n"
+#~ "  \n"
+#~ "  -H | --hardlimit hl  ����� ���� hl ��.\n"
+#~ "  \n"
+#~ "  ������ � �� � �� � �� �� �"
+#~ "����#~ "  ����� �� ����--add.\n"
+#~ "  \n"
+#~ "����                              \n"
+#~ "\n"
+#~ "  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+#~ "  \n"
+#~ "  ����� ��john, paul, george � ringo ���"
+#~ "  ���, � ������ � � �� ��"
+#~ "  ����erome. ���jerome ������\n"
+#~ "  �������mail �� ���ingo �"
+#~ "  'ringo@example.com'\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  �������erome � ���lp ��
+#~ "����n"
+#~ "  50 ��, � �� �0 ��. � �� ��jerome ��"
+#~ "  ���� � ��������������    "
+#~ "����\n"
+#~ "\n"
+#~ "  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+#~ "  \n"
+#~ "  ��� ��, ���� �� �� ��jerome �� \n"
+#~ "  ��� lp ������������ ����
+#~ "��n"
+#~ "  jerome ������� \"coders\" � \"it\" ����n"
+#~ "  ��� ������"
+#~ "            \n"
+#~ "  $ edpykota -g -S 500 -H 550 financial support            \n"
+#~ "  \n"
+#~ "  ���������00 �� � ��� ��50\n"
+#~ "  �� � ��� financial � support �������"
+#~ "  \n"
+#~ "  $ edpykota --reset jerome \"jo*\"\n"
+#~ "  \n"
+#~ "  ����� ��������erome � ����"
+#~ "���"
+#~ "  ������'jo' �������"
+#~ "  ������ � ����� �������"
+#~ "  ������ ��� � �����������#~ "�n"
+#~ "  ���-hardreset | -R .\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hpcolor --noquota jerome\n"
+#~ "  \n"
+#~ "  �������� ���erome � ����"
+#~ "hpcolor. \n"
+#~ "  �� ����������� ��� ���
+#~ "���� \n"
+#~ "  ���� ��������\n"
+#~ "  � �����rome ���������
+#~ "���.\n"
+#~ "  \n"
+#~ "  $ edpykota --limitby balance jerome\n"
+#~ "  \n"
+#~ "  �������erome ������ ��� �\n"
+#~ "  \n"
+#~ "  $ edpykota --balance +10.0 jerome\n"
+#~ "  \n"
+#~ "  ������ �����jerome ��10.0 ���(�"
+#~ "��n"
+#~ "  ��� ������� ��� ����(-) ���"
+#~ "  �� ��� �� � ���\n"
+#~ "  \n"
+#~ "  $ edpykota --delete jerome rachel\n"
+#~ "  \n"
+#~ "  ���������jerome � rachel � ������"
+#~ "  ������� � ��� ����������\n"
+#~ "  \n"
+#~ "  $ edpykota --printer lp --charge 0.1\n"
+#~ "  \n"
+#~ "  ���� ��� � �����.1. �� ����n"
+#~ "  ������\n"
+#~ "  \n"
+#~ "  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+#~ "  \n"
+#~ "  ���� ��� hplj1 � hplj2 � �� ����aser � "
+#~ "HP.\n"
+#~ "  ������� ���hplj1 ��plj2, ����� "
+#~ "�n"
+#~ "  ��� � ���� � � ������Laser � "
+#~ "HP.\n"
+#~ "\n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "��� ��� �� e-mail � %s"
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "���         �� �� �� �����       ��     "
+#~ "��"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "���        �� �� �� �����       ��     "
+#~ "��"
+
+#~ msgid "Waiting for printer %s to be idle or printing..."
+#~ msgstr "���� ��� ������ � ���%s..."
Index: pykota/tags/1.22/po/pykota.pot
===================================================================
--- pykota/tags/1.22/po/pykota.pot (revision 2228)
+++ pykota/tags/1.22/po/pykota.pot (revision 2228)
@@ -0,0 +1,1835 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.22\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2005-05-03 23:47:00+0100\n"
+"Last-Translator: Jerome Alet <alet@librelogiciel.com>\n"
+"Language-Team: English <alet@librelogiciel.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr ""
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr ""
+
+msgid "Job accounting ends."
+msgstr ""
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr ""
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr ""
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr ""
+
+msgid "Job added to history."
+msgstr ""
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr ""
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr ""
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr ""
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr ""
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr ""
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr ""
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr ""
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr ""
+
+msgid "You have to pass user or group names on the command line"
+msgstr ""
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr ""
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr ""
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr ""
+
+msgid "incompatible options, see help."
+msgstr ""
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr ""
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr ""
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Filename"
+msgstr ""
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr ""
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr ""
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr ""
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr ""
+
+msgid "in"
+msgstr ""
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+
+msgid "You have to pass printer names on the command line"
+msgstr ""
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr ""
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr ""
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr ""
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr ""
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr ""
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr ""
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr ""
+
+msgid "Report"
+msgstr ""
+
+msgid "Printer"
+msgstr ""
+
+msgid "User / Group names mask"
+msgstr ""
+
+msgid "Groups report"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+msgid "Empty"
+msgstr ""
+
+msgid "Action"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Hostname"
+msgstr ""
+
+msgid "JobId"
+msgstr ""
+
+msgid "JobSize"
+msgstr ""
+
+msgid "JobPrice"
+msgstr ""
+
+msgid "Copies"
+msgstr ""
+
+msgid "JobBytes"
+msgstr ""
+
+msgid "PageCounter"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr ""
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr ""
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr ""
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr ""
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr ""
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr ""
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr ""
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr ""
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr ""
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr ""
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr ""
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr ""
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr ""
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr ""
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr ""
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+#, python-format
+msgid "Real : %s"
+msgstr ""
+
+#, python-format
+msgid "Total : %9i"
+msgstr ""
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr ""
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr ""
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr ""
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr ""
+
+msgid "Print Quota"
+msgstr ""
+
+msgid "Print Quota Exceeded"
+msgstr ""
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr ""
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr ""
+
+msgid "Print Quota Low"
+msgstr ""
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr ""
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr ""
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr ""
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr ""
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr ""
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr ""
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr ""
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr ""
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr ""
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr ""
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr ""
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr ""
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr ""
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr ""
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr ""
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr ""
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr ""
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
Index: pykota/tags/1.22/po/nb_NO/pykota.po
===================================================================
--- pykota/tags/1.22/po/nb_NO/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/nb_NO/pykota.po (revision 2228)
@@ -0,0 +1,2381 @@
+# translation of pykota.po to Norwegian Bokm�<
+# translation of pykota.po to Norwegian Bokm�#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+# Klaus Ade Johnstad <klaus@inout.no>, 2004.
+# Klaus Ade Johnstad <klaus@skolelinux.no>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pykota\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2005-03-05 12:16+0100\n"
+"Last-Translator: Klaus Ade Johnstad <klaus@skolelinux.no>\n"
+"Language-Team: Norwegian Bokm�< <i18n-nb@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"Et verkt�r �utomatisere oppretting av brukere og oppstarten av "
+"kvotesystemet.\n"
+"\n"
+"DETTE VERKT�ET KAN IKKE BRUKES HVIS DU �SKER �KONTROLLERER DINE BRUKERES "
+"MULIGHETER MED PAGE QUOTA!\n"
+"\n"
+"kommandolinje bruk :\n"
+"\n"
+"  DETTE VERKT�ET M�IKKE BRUKES FRA KOMMANDOLINJA, MEN KUN SOM EN DEL\n"
+"  AV EN EKSTERN policy I pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"opsjoner :\n"
+"\n"
+"  -v | --version       Viser autopykota's versjon nummer.\n"
+"  -h | --help          Viser denne meldingen.\n"
+"  \n"
+"  -i | --initbalance b Setter brukerens startkonto til verdien b.\n"
+"                       Hvis brukeren allerede finnes, vil kontoen ikke "
+"endres.\n"
+"                       Hvis den ikke har noen verdi,vil standard verdi 0 "
+"brukes.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "Utskriften inneholdt ingen data. Ingen utskrift utf�
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr "Utskriften er en duplikat. Utskriften blir ikke skrevet."
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+"Utskriftsbanner vil ikke bli skrevet : det maksimale antall utskriftsbannere "
+"som nektes er n�."
+
+msgid "Job accounting begins."
+msgstr "Telling av utskrifter begynner."
+
+msgid "Job accounting ends."
+msgstr "Telling av utskrifter avsluttes."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr ""
+"St�sen p�tskriften ble satt til 0 fordi du har ikke tillatelse til �
+"skrive ut."
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+"Advarsel : beregnet utskriftst�se (%s) != forberegnet utskriftst�se "
+"(%s)"
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+"St�sen p�tskriften vil bli endret, i samsvar med 'trustjobsize' "
+"regelen : %s"
+
+#, python-format
+msgid "Job size : %i"
+msgstr "St�se p�tskriften : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Oppdaterer brukeren %s sin kvote p�kriveren %s"
+
+msgid "Job added to history."
+msgstr "Utskriften er bokf�
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr ""
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "Signalet SIGTERM ble sendt til bakgrunnen %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "CUPS bakgrunnen %s stoppet p�n unormal m�."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr "Du m�ruke opsjonen -d eller --data, se Hjelp."
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr "Du har ikke tillatelse til �ruke denne kommandoen."
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr "Ugyldig verdi brukt %s."
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Ugyldig verdi for mykgrense %s."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Ugyldig verdi for hardgrense %s."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr "Hardgrensen %i er mindre enn mykgrensen %i, verdiene vil bli utbyttet."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr "Ugyldig overcharge verdi %s"
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Ugyldig verdi p�alanse %s."
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Ugyldig verdi p�ostnad %s."
+
+#, fuzzy, python-format
+msgid "Invalid limitby value %s"
+msgstr "Ugyldig limitby verdi %s"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Ikke mulig �egge til skriver %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Ugyldig skrivernavn %s"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Finner ingen skriver som passer med %s"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "Du m�ppgi en bruker eller gruppenavn p�ommandolinja"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Prototype objekt %s ikke funnet i PyKotasystemet."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "Prototypen %s for skriver %s ikke funnet i PyKotasystemet."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr "Udefinert hardgrense satt til mykgrense (%s) p�kriver %s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "Udefinert mykgrense satt til hardgrense (%s) p�kriver %s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Ugyldig e-post adresse %s"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr "Ukjent gruppe %s"
+
+#, python-format
+msgid "Unknown user %s"
+msgstr "Ukjent bruker %s"
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Ugyldig gruppenavn %s"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Ugyldig brukernavn %s"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Ingen kvote funnet for %s p�kriver %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Gruppen %s ble ikke funnet i PyKotasystemet."
+
+msgid "incompatible options, see help."
+msgstr "valgene passer ikke sammen, se i Hjelp."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "Programvare basert bokf� ble utf� f� omgang. Ignorerer."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "Maskinvare basert bokf� ble utf� f� omgang. Ignorerer."
+
+msgid "Job size and price now set in history."
+msgstr "Utskriftst�se og pris er bokf�
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr "Ukjent"
+
+msgid "Username"
+msgstr "Brukernavn"
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr "Utskrift"
+
+msgid "Date"
+msgstr "Dato"
+
+msgid "Allowed"
+msgstr "Tillat"
+
+msgid "Denied"
+msgstr "Nektet"
+
+msgid "Allowed with Warning"
+msgstr "Tillat med advarsel"
+
+msgid "Result"
+msgstr "Resultat"
+
+msgid "Title"
+msgstr "Tittel"
+
+msgid "Filename"
+msgstr "Filnavn"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr "Antall sider skrevet ut hittil p�s"
+
+msgid "Account balance"
+msgstr "Konto oversikt"
+
+msgid "Soft Limit"
+msgstr "Mykgrense"
+
+msgid "Hard Limit"
+msgstr "Hardgrense"
+
+msgid "Date Limit"
+msgstr "Datogrense"
+
+msgid "Allowed range is (0..99)"
+msgstr "Tillate verdier er i omr� (0..99)"
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr "Ugyldig 'savetoner' opsjon %s : %s"
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr "Ugyldig 'pagesize' opsjon %s, bruker A4 som standard."
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"Et verkt�r �est avgj�va slags bokf�ssystem som best egner seg "
+"for hver skriver.\n"
+"\n"
+"kommandolinje bruk :\n"
+"\n"
+"  pkhint [opsjoner] [skriver1 skriver2 skriver3 ... skriverN] <file.conf\n"
+"\n"
+"opsjoner :\n"
+"\n"
+"  -v | --version       Viser pkhint's versjon nummer.\n"
+"  -h | --help          Viser denne meldingen.\n"
+"  \n"
+"eksempler :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Ditt utskriftssysetm vil bli analysert for �vgj�va som er beste "
+"bokf�smetode\n"
+"  for de oppgitte skriverene som passer med\n"
+"  de skrivernavn som er oppgitt som parametere.\n"
+"  \n"
+"  Hvis du ikke oppgir noen opsjoner p�ommandolinja, s�il alle\n"
+"  skriverene bli analysert.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "Ugyldig enhets URI : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Vent litt mens pkhint sjekker hvordan ditt utskriftssystem er "
+"konfigurert ... "
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Ukjent enhet %s for skriver %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"Legg til f�de linjer i fila /etc/pykota/pykota.conf :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr ""
+"# OBS! : selv om programvare basert bokf� er anbefalt, s�etyr ikke det "
+"at"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr "# maskinvare basert bokf� ikke virker, det betyr kun at PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# ikke automatisk klarte �vgj�vilken type maskinvare bsaert bokf� "
+"den skulle bruke."
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"En skriverbehandler for PyKota.\n"
+"\n"
+"kommandolinje bruk :\n"
+"\n"
+"  pkprinters [opsjoner] skriver1 skriver2 skriver3 ... skriverN\n"
+"\n"
+"opsjoner :\n"
+"\n"
+"  -v | --version       Viser pkprinters's versjon nummer.\n"
+"  -h | --help          Viser denne meldingen.\n"
+"  \n"
+"  -a | --add           Legger til skrivere hvis de ikke allerede finnes p�n"
+"                       PyKota systemet.Hvis de allerede finnes, s�il de "
+"bli endret\n"
+"                       med mindre -s|--skipexisting brukes samtidig.\n"
+"                       \n"
+"  -d | --delete        Sletter skrivere fra kvotesystemet.\n"
+"  \n"
+"  -D | --description d Legger til en beskrivelse av skriverene.\n"
+"                       \n"
+"  -c | --charge p[,j]  Setter prisen for side og utskrift til charge.\n"
+"                       Pris p�tskrift er frivillig.\n"
+"                       Hvis begge brukes, s�eparer dem med et komma.\n"
+"                       Desimaltall og negative verdider er tillat.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Legger til eller fjerner skiver(e) til "
+"skrivergruppene \n"
+"                       pg1, pg2, etc... som allerede m�innes.\n"
+"                       En skrivergruppe er akkurat som en vanlig skriver,\n"
+"                       bortsett fra at de vanligvis er ukjente for "
+"skriversystemet.\n"
+"                       Opprett skrivergrupper p�amme m� som du legger "
+"til\n"
+"                       skrivere, s�egger du til skrivere \n"
+"                       til dem med denne opsjonen.\n"
+"                       Bokf� utf�p�kriveren og p�lle "
+"skrivergrupper\n"
+"                       skriveren tilh� kontroll av kvoter utf�n"
+"                       p�kriveren og p�lle skrivergrupper "
+"den                       tilh�\n"
+"                       Hvis --remove opsjonen ikke brukes, s�r standard \n"
+"                       handling �egge den oppgitte skriveren til oppgitt\n"
+"                       skrivergruppe.\n"
+"                       \n"
+"  -l | --list          Viser informasjon om skriveren(e) og skrivergruppene\n"
+"                       den er medlem av.\n"
+"                       \n"
+"  -r | --remove        I kombinasjon med opsjonen --groups "
+"ovenfor,                       \n"
+"                       s�il skriverene bli slettet fra de oppgitte "
+"skrivergruppene.\n"
+"                       \n"
+"  -s | --skipexisting  I kombinasjon med opsjonen --add ovenfor, s�il \n"
+"                       pkprinters ikke endre allerede eksisterende "
+"skrivere.\n"
+"  \n"
+"  skriver1 tilogmed skriverN kan inneholde jokertegn hvis opsjonen --add \n"
+"  ikke brukes.\n"
+"  \n"
+"eksempler :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Dette vil opprette tre skrivere med navn hp2100, hp2200 og hp8000.\n"
+"  Prisen per side vilo bli satt lik 0.05 enheter, og prisen per\n"
+"  utskrifts vil bli satt lik 0.1 enhet. Enheter kan v� kroner og �n"
+"  eller noe helt annet hvis du �r det.\n"
+"  Alle deres beskrivelser settes lik med strengen \"HP Printer\".\n"
+"  Hvis noen av disse allerede finnes s�il de bli endret,\n"
+"  med mindre du ogs�ar brukt -s|--skipexisting kommandolinje opsjonen.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  Dette vil fullsetendig slette alle skrivere og tilh�e kvote "
+"informasjon,\n"
+"  dessuten ogs�eres utskriftshistorie. BRUKES MED FORSIKTIGHET!\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  Dette vil legge til alle skrivere med navn som passer med \"hp*\" inn i "
+"skrivergruppene \n"
+"  Laser og HP, som p�orh� M�finnes.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  Dette vil fjerne skriveren med navn hp2200 printer fra skrivergruppen "
+"LexMark.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "Skriveren %s finnes allerede, avbryter."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "Skriveren %s finnes allerede, endrer p�en."
+
+msgid "in"
+msgstr "i"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr "Du m�ppgi skrivergruppe p�ommandolinja"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Du m�ppgi skrivernavn p�ommandolinja"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"En OSD kvote overv�r for PyKota.\n"
+"\n"
+"kommandolinje bruk :\n"
+"\n"
+"  pykosd [opsjoner]\n"
+"\n"
+"opsjoner :\n"
+"\n"
+"  -v | --version       Viser pykosd versjons nummer.\n"
+"  -h | --help          Viser denne meldingen.\n"
+"  \n"
+"  -c | --color #rrggbb Setter fargen som skal brukes p�kjermen i "
+"hexadesimal\n"
+"                       formatet, f.eks er #FF0000 100%% r�n"
+"                       Standard er 100%% gr�#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Setter visningsvarigheten til et antall sekunder.\n"
+"                       Standard er 3 sekunder.\n"
+"                       \n"
+"  -f | --font f        Setter skrifttypen som skal brukes "
+"p�jermen.                      \n"
+"                       Bruker bibliotekete til Python OSD som standard.\n"
+"  \n"
+"  -l | --loop n        Setter antall ganger informasjonen vil bli vist.\n"
+"                       Standard er 0, som betyr at den g�i en evig l�\n"
+"                       \n"
+"  -s | --sleep s       Setter dvaleperioden i sekunder mellom to visninger \n"
+"                       Standard er 180 sekunder (3 minutter).\n"
+"                       \n"
+"  \n"
+"eksempler :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Vil starte pykosd med oppdatert visning hvert 60 sekund,\n"
+"  som varer i 3 sekunder (standard) hver gang. Etter 5 visninger\n"
+"  s�topper det.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Ugyldig verdi for varighet %s"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Ugyldig repetisjons valg %s"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Ugyldig dvale valg %s"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Ugyldig fargevalg %s"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "Brukeren %s finnes ikke i databasen til PyKota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "Antall sider brukt p�s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Pykota enheter igjen : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Setter utskriftskvoter p�ine brukere.\n"
+"\n"
+"kommandolinje bruk :\n"
+"\n"
+"  pykotme  [opsjoner]  [filer]\n"
+"\n"
+"opsjoner :\n"
+"\n"
+"  -v | --version       Viser pykotme's versjons nummer.\n"
+"  -h | --help          Viser denne meldingen.\n"
+"  \n"
+"  -P | --printer p     Setter kvoter p�un denne skriveren. Opsjonen p kan\n"
+"                       bruker jokertegn for �elge kun noen skrivere.\n"
+"                       Standard verdi er *, som betyr\n"
+"                       alle skrivere.\n"
+"                       Du kan oppgi flere skrivernavn eller jokertegn ved �"
+"                       skille dem med komma.\n"
+"  \n"
+"eksempler :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  Dette vil sette en utskriftskvote for brukeren. Utskriftskvoten vil \n"
+"  vise prisen og st�sen p�n utskrift som best�av filene file1.ps og "
+"file2.ps \n"
+"  som skal skrives ut p�kriver apple.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  Dette vil sette en utskriftskvote for brukeren. Utskriftskvoten vil \n"
+"  vise prisen og st�sen p�n utskrift som best�av filen file1.ps\n"
+"  som skal skrives ut p�kriver apple eller hplaser.\n"
+"  \n"
+"  $ pykotme \n"
+"  \n"
+"  Dette vil sette en utskriftskvote for utskrift som ligger p�"
+"  standard inout. Utskriftskvoten vil vise st�sen og prisen p�"
+"  utskriften p�ver skriver.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Din utskriftskvote balanse : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "St�se p�tskriften : %i sider"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Prisen p�kriver %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sender e-post til brukere som har oversetget sin utskriftskvote.\n"
+"\n"
+"kommandolinje bruk :\n"
+"\n"
+"  warnpykota  [opsjoner]  [navn]\n"
+"\n"
+"opsjoner :\n"
+"\n"
+"  -v | --version       Viser warnpykota versjon nummer.\n"
+"  -h | --help          Viser denne meldingen.\n"
+"  \n"
+"  -u | --users         Advarer brukere som har oversteget sin "
+"utskriftskvote,\n"
+"                       dette er standard.\n"
+"  \n"
+"  -g | --groups        Advarer brukere som er medlem av en gruppe som har "
+"overseteget sin gruppeutskriftskvote.\n"
+"  \n"
+"  -P | --printer p     Verifiser kvoter p�un denne skriveren.Faktisk s�
+"kan p\n"
+"                       ogs�� jokertegn for �un velge noen bestemte\n"
+"                       skrivere. Standard er *, som betyr \n"
+"                       alle skrivere.\n"
+"                       Du kan bruke flere skrivernavn eller jokertegn\n"
+"                       ved �eparere dem med komma.\n"
+"  \n"
+"eksempler :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  Dette vil advare alle brukere p�kriveren lp som har oversteget sin\n"
+"  utskriftskvote.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  Dette vil advare alle brukere som har oversteget sin\n"
+"  utskriftskvote.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  Dette vil advare alle brukere i grupper som begynner p�"dev\" om at\n"
+"  de har oversteget sin kvote p�kriver med navn som begynner med\n"
+"  \"laserjet\"\n"
+"  \n"
+"  Hvis en bruker som ikke er en PyKota administrator bruker programet,\n"
+"  sp vil opsjoner som representerer brukere eller grupper bli sett bort "
+"fra,\n"
+"  kun vedkommendes bruker/gruppe blir rapportert.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+
+msgid "PyKota Data Dumper"
+msgstr "PyKota Data Dumper"
+
+msgid "Dump"
+msgstr "Dump"
+
+msgid "Please click on the above button"
+msgstr "Vennligst trykk p�nappen ovenfor"
+
+msgid "Data Type"
+msgstr "Datatype"
+
+msgid "Output Format"
+msgstr "Output format"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "PyKota Reports"
+msgstr "Pykota rapporter"
+
+msgid "Report"
+msgstr "Rapport"
+
+msgid "Printer"
+msgstr "Skriver"
+
+msgid "User / Group names mask"
+msgstr "Bruker / gruppe navn felt"
+
+msgid "Groups report"
+msgstr "Grupperapport"
+
+msgid "History"
+msgstr "Historie"
+
+msgid "Empty"
+msgstr "Tomt"
+
+msgid "Action"
+msgstr "Handling"
+
+msgid "User"
+msgstr "Bruker"
+
+msgid "Hostname"
+msgstr "Vertsnavn"
+
+msgid "JobId"
+msgstr "UtskriftsId"
+
+msgid "JobSize"
+msgstr "UtskriftsSt�se"
+
+msgid "JobPrice"
+msgstr "UtskriftsPris"
+
+msgid "Copies"
+msgstr "Kopier"
+
+msgid "JobBytes"
+msgstr "UtskriftsBytes"
+
+msgid "PageCounter"
+msgstr "SideTeller"
+
+msgid "Options"
+msgstr "Opsjoner"
+
+msgid "MD5Sum"
+msgstr "MD5Sum"
+
+msgid "BillingCode"
+msgstr "PrisKode"
+
+msgid "Pages"
+msgstr "Sider"
+
+msgid "Previous page"
+msgstr "Forrige side"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Bokf�sbakgrunnen er ikke st� %s"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "Konfigurasjonsfil %s ble ikke funnet."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Opsjonen %s ble ikke funnet i den globale delen av %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Opsjonen %s ble ikke funnet i delen %s i %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr "Opsjonen ldaptls er satt, men sertifikatet %s er ikke lesbart."
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "Opsjonen logger st� kun verdier i %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Ugyldig bokf�ssystem %s for skriver %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr ""
+"Opsjonen bokf�system i avsnittet %s st� kun verdier i omr�t %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Ugyldige regel %s for skriver %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "Regelopsjon i avsnitt %s st� kun verdier i %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Ugyldige mailto opsjon %s for skriver %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "Opsjonen mailto i avsnitt %s st� kun verdier i %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr "Ugyldig verdi for maksimalt antall nektede bannere %s"
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Ugyldig grace forsinkelse %s"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Ugyldig fattigmansterskel %s"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"Din resterende utskriftskvote er lav.\n"
+"Du vil snart ikke kunne skrive ut mer.\n"
+"Ta kontakt med administratoren for utskriftskvotene for ��roblemet."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Du kan ikke lenger skrive ut fordi\n"
+"din utskriftkvote er overskredet p�kriver %s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"Du vil snart ikke lenger kunne skrive ut fordi\n"
+"din utskriftskvote snart er overskredet p�kriver %s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr "Brukere"
+
+msgid "Groups"
+msgstr "Grupper"
+
+msgid "Printers"
+msgstr "Skrivere"
+
+msgid "Users Print Quotas"
+msgstr "Brukerens utskriftskvote"
+
+msgid "Users Groups Print Quotas"
+msgstr "Brukerens gruppeutskriftskvote"
+
+msgid "History of Payments"
+msgstr "Betalingshistorikk"
+
+msgid "Printers Groups Membership"
+msgstr "Skriverens gruppemedlemskap"
+
+msgid "Users Groups Membership"
+msgstr "Brukerens gruppemedlemskap"
+
+msgid "Comma Separated Values"
+msgstr "Komma Separerte Verdier"
+
+msgid "Semicolon Separated Values"
+msgstr "Semikolon Separerte Verdier"
+
+msgid "Tabulation Separated Values"
+msgstr "Tabulator Separerte Verdier"
+
+msgid "eXtensible Markup Language"
+msgstr "eXtensible Markup Language"
+
+msgid "CUPS' page_log"
+msgstr "CUPS' page_log"
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr "Ugyldig modifikator [%s] for kommandolinje opsjonen --data, se Hjelp."
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+"Ugyldig modifikator [%s] for kommandolinje opsjonen --format, se Hjelp."
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr "Bruk av XML er ikke mulig fordi jaxml modulen ikke er tilgjengelig."
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "PyKota datadumper feilet: I/O-feil"
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Det underliggende systemet %s for bokf� er ikke st�"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Rapport for %s kvote p�kriver %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr ""
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Pris per utskrift: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Pris per side: %.3f"
+
+#, fuzzy
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+"Gruppe          overcharge   brukt    myk    hard    balanse grace         "
+"totalt       betalt advarsel"
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+"Bruker           overcharge   brukt    myk    hard    balanse grace         "
+"totalt       betalt advarsel"
+
+msgid "unknown"
+msgstr "ukjent"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Virkelig : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Totalt : %9i"
+
+msgid "N/A"
+msgstr "I/T"
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Det bakenforliggende rapportprogrammet %s er ikke st�"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Det bakenforliggende kvotesystemet %s er ikke st�"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr "Merkelig problem med uid(%s) : %s"
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr "Kj�som bruker '%s'."
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr "Ingen bruker 'pykota'. Gir ikke slipp p�rivilegier."
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr "Ikke mulig �i slipp p�rivilegier : %s"
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr "Har gitt slipp p�rivilegier. Kj�n�om bruker 'pykota'."
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr "Ikke mulig �a tilbake privilegier : %s"
+
+msgid "Regained priviledges. Now running as root."
+msgstr "Fikk tilbake privilegier. Kj�n�om root."
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "Ikke mulig �oble seg til SMTP serveren . %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Ikke mulig �ende e-post til %s, feil %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Vennligst kontakt din systemadministrator :\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Klarte ikke �inne bruker %s p�kriver %s, bruker standard regel (%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr "Bruker %s trenger ikke �etale for utskrift."
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "Utskriftskvoten er oversteget for gruppe %s p�kriver %s"
+
+msgid "Print Quota"
+msgstr "Utskriftskvote"
+
+msgid "Print Quota Exceeded"
+msgstr "Utskriftskvoten er oversteget"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Utskriftskvoten er lav for gruppe %s p�kriver %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "Utskriftskvoten er oversteget for bruker %s p�kriver %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Utskriftskvoten er lav for bruker %s p�kriver %s"
+
+msgid "Print Quota Low"
+msgstr "Utskriftskvoten er lav"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Utskriftssystem %s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"Klarer ikke �eregne st�sen p�tskriften ved hjelp av den generiske "
+"PDL analyseren : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "Signalet SIGTERM ble sendt, utskriften %s ble avbrutt."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Vertsnavnet til skriveren er udefinert, setter det lik 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Utskriftssystemet er ukjent, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"Skriver %s er ikke registret i Pykotasystemet, bruker ekstern regel (%s) p�
+"skriver %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"Bruker %s er ikke registret i Pykotasystemet, bruker ekstern regel (%s) p�
+"skriver %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"Bruker %s har ingen kvote p�kriver %s i Pykotasystemet, bruker ekstern "
+"regel (%s) p�kriver %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Skriveren %s er ikke registrert i Pykotasystemet, bruker standard regel (%s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Bruker %s er ikke registrert i PyKota systemet, bruker standard regel (%s) "
+"for skriver %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"Bruker %s har ingen kvote p�kriver %s i PyKota systemet, bruker standard "
+"regel (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"Skriver %s er fremdeles ikke registrert i Pykotasystemet, utskriften vil "
+"derfor bli nektet"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"Bruker %s er fremdeles ikke registrert i Pykotasystemet, utskriften vil "
+"derfor bli nektet p�kriver %s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"Bruker %s har fremdeles ikke en kvote p�kriver %s i Pykotasystemet, "
+"utskriften vil derfor bli nektet"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr "Det oppstod et problem under avlesing av sidetelleren til skriver %s."
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "Utskriftst�sen ble satt til 1 side for skriver %s."
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr "Ingen tidligere utskrift er registrert i databasen for skriver %s."
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Ukjent skriveradresse i HARDWARE(%s) for skriver %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Starter HARDWARE(%s) ..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "SIGTERM ble sendt til hardware bokholders %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "Hardware telleren %s avsluttet med kode %s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Klarte ikke �p�skriver %s via HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "Det oppstod et problem under oppkobling til %s:%s : %s"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "Det oppstod et problem under sending av PJL til %s:%s : %s"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr "Venter p�t skriver %s skal begynne �krive ..."
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "Venter p�t skriver %s sin hvilestatus skal stabilisere seg ..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "Feil p�ettverket mens SNMP sp�g ble utf��kriver %s : %s"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr "En feil oppstod mens en SNMP sp�g ble utf��kriver %s : %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Starter SOFTWARE(%s) ..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Klarte ikke �eregne utskriftst�se med bokholder %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr ""
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr "Totalen kan v� feil hvis en bruker er medlem av flere grupper."
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "S�ter %s(%s) fra %s(scope=%s) returnerte ikke et svar."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Det oppstod et problem med �egge til i LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Det oppstod et problem med �lette i LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Det oppstod et problem med �ndre i LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid "Invalid value [%s] for --filter command line option, see help."
+#~ msgstr "Ugyldig verdi [%s] for --filter kommandolinje opsjonen, se Hjelp."
+
+#~ msgid ""
+#~ "pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Email gateway for PyKota.\n"
+#~ "\n"
+#~ "command line usage :\n"
+#~ "\n"
+#~ "  pkmail  [options]\n"
+#~ "\n"
+#~ "options :\n"
+#~ "\n"
+#~ "  -v | --version       Prints pkmail's version number then exits.\n"
+#~ "  -h | --help          Prints this message then exits.\n"
+#~ "  \n"
+#~ "    \n"
+#~ "  This command is meant to be used from your mail server's aliases file,\n"
+#~ "  as a pipe. It will then accept commands send to it in email messages,\n"
+#~ "  and will send the answer to the command's originator.\n"
+#~ "  \n"
+#~ "  To use this command, create an email alias in /etc/aliases with\n"
+#~ "  the following format :\n"
+#~ "  \n"
+#~ "    pykotacmd: \"|/usr/bin/pkmail\"\n"
+#~ "    \n"
+#~ "  Then run the 'newaliases' command to regenerate the aliases database.\n"
+#~ "  \n"
+#~ "  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+#~ "  the command in the subject.\n"
+#~ "  \n"
+#~ "  List of supported commands :\n"
+#~ "  \n"
+#~ "        report [username]\n"
+#~ "  \n"
+#~ "  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+#~ "  system user in the 'lpadmin' system group to ensure this user can\n"
+#~ "  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+#~ "  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+#~ "  that you think at least twice before doing this though.\n"
+#~ "  \n"
+#~ "  Use at your own risk !\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
+#~ msgstr ""
+#~ "pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+#~ "Libres\n"
+#~ "\n"
+#~ "Epost gateway for PyKota.\n"
+#~ "\n"
+#~ "kommandolinje bruk :\n"
+#~ "\n"
+#~ "  pkmail  [opsjoner]\n"
+#~ "\n"
+#~ "opsjoner :\n"
+#~ "\n"
+#~ "  -v | --version       Viser pkmail's versjon nummer.\n"
+#~ "  -h | --help          Viser denne meldingen.\n"
+#~ "  \n"
+#~ "    \n"
+#~ "  Denne kommandoen er ment brukt fra din epostservers aliasfil,\n"
+#~ "  som en pipe. Den vil da akseptere kommandoer sendt til den i epost,\n"
+#~ "  og vil sende et svar til avsenderen.\n"
+#~ "  \n"
+#~ "  For �ruke denne kommandoen, lag en epostalias i /etc/aliases med\n"
+#~ "  f�de format :\n"
+#~ "  \n"
+#~ "    pykotacmd: \"|/usr/bin/pkmail\"\n"
+#~ "    \n"
+#~ "  Utf�retter kommandoen 'newaliases' for �jenoppfriske alias "
+#~ "databasen.\n"
+#~ "  \n"
+#~ "  Du kan n�ende kommandoer i epost til 'pykotacmd@yourdomain.com', med\n"
+#~ "  kommandoen i Emne-feltet.\n"
+#~ "  \n"
+#~ "  Liste med st�e kommandoer :\n"
+#~ "  \n"
+#~ "        report [brukernavn]\n"
+#~ "  \n"
+#~ "  NB : For at plmail skal fungere korrect, s��u muligens legge til "
+#~ "'mail'\n"
+#~ "  system brukeren til 'lpadmin' systemgruppa slik at brukeren kan\n"
+#~ "  lese fila /etc/pykota/pykotadmin.conf, og kunne restarte din\n"
+#~ "  epostserver (f.eks /etc/init.d/exim restart). Det anbefales p�et "
+#~ "sterkeste\n"
+#~ "  at du tenker deg om minst to ganger f� gj�tte.\n"
+#~ "  \n"
+#~ "  Brukes p�get ansvar !\n"
+#~ "  \n"
+#~ "This program is free software; you can redistribute it and/or modify\n"
+#~ "it under the terms of the GNU General Public License as published by\n"
+#~ "the Free Software Foundation; either version 2 of the License, or\n"
+#~ "(at your option) any later version.\n"
+#~ "\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ "\n"
+#~ "You should have received a copy of the GNU General Public License\n"
+#~ "along with this program; if not, write to the Free Software\n"
+#~ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, "
+#~ "USA.\n"
+#~ "\n"
+#~ "Please e-mail bugs to: %s"
Index: pykota/tags/1.22/po/th/pykota.po
===================================================================
--- pykota/tags/1.22/po/th/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/th/pykota.po (revision 2228)
@@ -0,0 +1,1875 @@
+# PyKota
+# 
+# PyKota : Print Quotas for CUPS and LPRng
+# 
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+# 
+# $Id$
+# 
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-07-21 15:35:00+0100\n"
+"Last-Translator: Suthep Yonpimai <tomzt@hotmail.com>\n"
+"Language-Team: Thai <tomzt@hotmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=TIS-620\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "������㹧ҹ ���ʸ������
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "����ӧҹ�ͧ�Ҫԡ"
+
+msgid "Job accounting ends."
+msgstr "�����ӧҹ�ͧ�Ҫԡ"
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "��Ҵ�ͧ�ҹ�١��¹�� 0 �����ʸ������
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "��Ҵ�ҹ : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "��ѧ���������ͧ��� %s ����ͧ����s"
+
+msgid "Job added to history."
+msgstr "���ҹ��������
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr "������� %s ������ŧ����� 2 ��駨ҡ������� ,���
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "���ҳ SIGTERM �١���ѧ��ͧ�� %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "CUPS �ͧ��ͧ�� %s ����ش�ӧҹẺ�Դ�á��
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr ""
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "��%s �ͧ softlimit ��١��"
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "��%s �ͧ hardlimit��١�� "
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr "��Hard limit %i �������soft limit %i ������"
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "����������١�� %s"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "����������١�� %s"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "����ӡѴ %s ��١��"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "���ö�ӡ�����������
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "����������s ��١��"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "�����ͧ����s ����ҹ�"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "�س���������� �����������������
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "������ص��� %s ���������"
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "������� %s �����������Ѻ��ͧ����s "
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr "���ӡ������hard limit �֧ soft limit (%s) ����ͧ����s"
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "���ӡ������soft limit �֧ hard limit (%s) ����ͧ����s"
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "email address %s ��١��"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "��͡���� %s ��١��"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "��ͼ�� %s ��١��"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "��������������Ѻ %s ����ͧ����s"
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "�������� %s ��������ͧ PyKota"
+
+msgid "incompatible options, see help."
+msgstr "���͡����, ���Ҵ٨ҡ�ǹ����"
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "����Ϳ�������ѭ����ԡ����ǹ� ���
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "�����������ѭ����ԡ����ǹ� ���
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "����"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "�����"
+
+msgid "Filename"
+msgstr "�������"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "��DeviceURI : %s ��١��"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"�����pkhint �зӡ������������к����������..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "�������ó�s ��Ѻ��ͧ����s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"��������Ѵ�����ŧ���/etc/pykota/pykota.conf file :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# ����� : ��Ϳ�������Ҫԡ����й�
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr "# ��������Ҫԡ���ö�ӧҹ�, �ѭ�������੾��Ѻ PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr "# ��������������Ҫԡ����ö��"
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "��ͧ����s ��١�Դ����� ���
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "��ͧ����s ��١�Դ����� �ӡ������"
+
+msgid "in"
+msgstr "�
+
+msgid "You have to pass printer groups names on the command line"
+msgstr "�س�����͡��������캹��������
+msgid "You have to pass printer names on the command line"
+msgstr "�س������������캹��������
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "������������١��"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "�ҵ������ӫ���١��"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "���������ѡ��ͧ��١��"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "����������١��"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "����ͼ�� %s 㹰ҹ����ͧ PyKota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "�ӹǹ˹���仺� %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "˹������ͧ PyKota : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "���������ͧ�س : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "�ӹǹ�ҹ : %i ˹�
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "��ҡ��������ͧ����s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "�§ҹ PyKota"
+
+msgid "Report"
+msgstr "�§ҹ"
+
+msgid "Printer"
+msgstr "��ͧ����
+msgid "User / Group names mask"
+msgstr "�� ��ͼ��/��͡����"
+
+msgid "Groups report"
+msgstr "�§ҹ���
+
+msgid "History"
+msgstr "�����
+
+msgid "Empty"
+msgstr "�ҧ"
+
+msgid "Action"
+msgstr "�Ԩ���
+
+msgid "User"
+msgstr "���"
+
+msgid "Hostname"
+msgstr "������"
+
+msgid "JobId"
+msgstr "����ҹ"
+
+msgid "JobSize"
+msgstr "��Ҵ�ҹ"
+
+msgid "JobPrice"
+msgstr "��ҧҹ"
+
+msgid "Copies"
+msgstr "�ӹǹ��"
+
+msgid "JobBytes"
+msgstr "�����Ҵ�ҹ"
+
+msgid "PageCounter"
+msgstr "�ӹǹ˹�
+
+msgid "Options"
+msgstr "���͡"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "˹����
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "����ѭ����ԡ�ʹѺʹع���ӧҹ %s"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "���! ����͹�ԡ��s"
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "������͡ %s ��������ͧ %s "
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "������͡ %s ��� %s �ͧ %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "���͡�ѹ�֡���ӧҹʹѺʹع������%s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "����ѭ����ԡ %s ��Ѻ��ͧ����s ��١��"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "���͡����ѭ����ԡ��� %s ʹѺʹع੾���� %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "���͡ enforcement ��� %s ʹѺʹع੾���� %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "����� %s ��Ѻ��ͧ����s ��١��"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "���͡�������� %s ʹѺʹع੾���� %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "���͡����%s ��Ѻ��ͧ����s ��١��"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "���͡�����Ǵ %s ʹѺʹع੾���� %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "��grace delay %s ��١��"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "��poor man's threshold %s ��١��"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"���� �����ͧ������\n"
+"�������þ����������������"
+"���ҵԴ������к������������ѭ�"
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"���� �س���ö�ӡ�����������ҡ\n"
+"����㹡�������س����������ͧ����s."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"���� �س������͹حҵ��ӡ����������\n"
+"������������س�������ͧ����s."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr ""
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "����ѹ�֡�����ʹѺʹع���ӧҹ %s"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "�§ҹ�����������Ѻ %s ����ͧ����s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "˹�grace time : %i ��"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "��ҵ�ҹ : %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "��ҵ���: %.3f "
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "�������"
+
+#, python-format
+msgid "Real : %s"
+msgstr "����� : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "��: %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "����§ҹ�ʹѺʹع %s"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "�������㹡��������ʹѺʹع %s"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "���ö�Դ��Ѻ SMTP ������"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "���ö����� %s, ����Դ��� %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"���ҵԴ������к� :\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr "�����ͼ�� %s ����ͧ����s, �����������ҹ����(%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr "��������ͧ��� %s, �����������ҹ����%s) �ͧ ��ͧ����s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "���� ��������������%s ����ͧ����s ����
+
+msgid "Print Quota"
+msgstr "����������
+msgid "Print Quota Exceeded"
+msgstr "����������Թ��
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "��������������%s ����ͧ����s �����
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "����������� %s ����ͧ����s ����
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "����������� %s ����ͧ����s �����
+
+msgid "Print Quota Low"
+msgstr "���������������
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "���������s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr "���ö�ӡ��ӹǳ��Ҵ�ͧ�ҹ��� PDL analyzer : %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "�����SIGTERM , �ҹ %s �١¡��."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "������������������ҵ���� 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "�������������args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"��ͧ����s ����ŧ������к��ͧ PyKota ,ŧ�������������ҹ�¹͡ (%"
+"s) ��Ѻ��ͧ����s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"��� %s ����ŧ������к��ͧ PyKota, ,ŧ�������������ҹ�¹͡ (%s) "
+"��Ѻ��ͧ����s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"��� %s �����������캹��ͧ����s �к��ͧ PyKota, "
+"ŧ�������������ҹ�¹͡ (%s) ��Ѻ��ͧ����s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"������ҹ�¹͡ %s ��Ѻ��ͧ����s ����Դ���. ¡�����ӧҹ. "
+"���ҵ��������ԡ��ê���ͧ PyKota"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"��ͧ����s ����ŧ������к��ͧ PyKota, ŧ�������������ҹ����(%"
+"s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"��� %s ����ŧ������к��ͧ PyKota, ŧ�������������ҹ����(%s) "
+"��Ѻ��ͧ����s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"��� %s �����������캹��ͧ����s �к��ͧ PyKota , ŧ����� "
+"��������ҹ����(%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr "��ͧ����s ������ŧ������к� PyKota, �ҹ���觨ж١¡��"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr "��� %s ������ŧ������к� PyKota, �ҹ���觨ж١¡�� printer %s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"��� %s ���������������캹��ͧ����s �к� PyKota ,�ҹ���觨ж١¡�� "
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr ""
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "��������ͧ��ͧ�������ó�%s) ��Ѻ��ͧ����s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "����ӧҹ�ͧ���ó�%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "���ҳ SIGTERM �١���ѧ���ó����ѭ����ԡ %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr ""
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "���ä���������s ������ó�s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr ""
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "����ӧҹ�ͧ�Ϳ���(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "���ö�ӹǳ��Ҵ�ҹ�������Ҫԡ %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr "���ѭ��ҡ�����Ϳ�������Ҫԡ pid %s ��͡ : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "�Ϳ�������Ҫԡ %s ���觡����� %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr "�ӹǹ��Ҩ��١�� ������ҧ�����Ҫԡ�ͧ����¡��"
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"�š����%s ���. ������������١�� �������� /etc/pykota/pykota.conf : %"
+"s �����
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "�š����%s(%s) �ҡ %s(scope=%s) �� ����觷���"
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "���ѭ�㹡�������� LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "���ѭ�㹡�ź����ҡ LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "���ѭ�㹡��㢢���LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"���ö�鹾��������%s ���Ҷ֧�� %s=%s �����Ѻ ����Ҫԡ Pykota "
+"�������
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr "���ö�鹾�������Ҷ֧�������Ѻ pykotaGroup �������%s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "���          ��   soft    hard    ���� grace         ��      ���
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "���            ��   soft    hard    ���� grace         ��      ���
Index: pykota/tags/1.22/po/zh_TW/pykota.po
===================================================================
--- pykota/tags/1.22/po/zh_TW/pykota.po (revision 2226)
+++ pykota/tags/1.22/po/zh_TW/pykota.po (revision 2226)
@@ -0,0 +1,1884 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2005-01-25 09:03+0800\n"
+"Last-Translator: Tsang Yu Pong, Teddy, Wing Kwong College in Hong Kong,"
+"<oops_teddy@yahoo.com.hk>\n"
+"Language-Team: Hong Kong, Traditional Chinese <oops_teddy@yahoo.com.hk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr "標題產生器 %s 中斷，代碼為 %s"
+
+msgid "Job contains no data. Printing is denied."
+msgstr "列印工作並沒有資料存在，列印中止"
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "列印計算開始"
+
+msgid "Job accounting ends."
+msgstr "列印計算結束"
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "因為列印被拒，列印總頁數被強制性設定為0"
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "列印總頁數 : %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "更新使用者 %s 的配額於列印機 %s"
+
+msgid "Job added to history."
+msgstr "列印工作已被加入到列印工作紀錄"
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr "檔案編號 %s 在polling object上已兩次未能成功註冊，因此被忽略"
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "中斷信號被傳送到 %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "CUPS %s 不正常的停止運作"
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr "-d | --data是強制的指令選項，請參閱說明文件"
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr "你沒有權限執行這個指令"
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "%s 是不正確的softlimit設定值"
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "%s 是不正確的hardlimit設定值"
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr "由於hard limit %i 少於soft limit %i，因此數值將會被倒置"
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "%s 是不正確的balance數值"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "%s 是不正確的charge數值"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "%s 是不正確的limitby數值"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "不能加入列印機 %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "%s 是不正確的列印機名稱"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "沒有列印機能對應 %s"
+
+msgid "You have to pass user or group names on the command line"
+msgstr "你必須於指令摸式下成功通過確認使用者或群組名稱"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "在配額資料庫內未能找到物件類別 %s"
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr "在配額資料庫內未能找到類別 %s 用於列印機 %s"
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr "未能確認的hard limit用於已設定soft limit (%s) 的列印機 %s上"
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr "未能確認的soft limit用於已設定hard limit (%s) 的列印機 %s上"
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "%s 是不正確的電郵地址"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr "未能確認的群組 %s"
+
+#, python-format
+msgid "Unknown user %s"
+msgstr "未能確認的使用者 %s"
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "%s 是不正確的群組名稱"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "%s 是不正確的使用者名稱"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "%s 在印表機 %s 沒有列印配額"
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "群組 %s 未能夠於配額資料庫內找到"
+
+msgid "incompatible options, see help."
+msgstr "不兼容的選項，請參閱說明文件"
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "軟體記帳通過第一階段的運作，閒置中"
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "硬體記帳通過第一階段的運作，閒置中"
+
+msgid "Job size and price now set in history."
+msgstr "列印總頁數及列印費用已於列印紀錄中設定"
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr "未能確認"
+
+msgid "Username"
+msgstr "使用者名稱"
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr "列印工作"
+
+msgid "Date"
+msgstr "日期"
+
+msgid "Allowed"
+msgstr "允許"
+
+msgid "Denied"
+msgstr "禁止"
+
+msgid "Allowed with Warning"
+msgstr "允許但帶有警告"
+
+msgid "Result"
+msgstr "結果"
+
+msgid "Title"
+msgstr "檔案標題"
+
+msgid "Filename"
+msgstr "檔案名稱"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr "現正列印第 %s 頁"
+
+msgid "Account balance"
+msgstr "賬戶結餘"
+
+msgid "Soft Limit"
+msgstr "警告配額"
+
+msgid "Hard Limit"
+msgstr "有效配額"
+
+msgid "Date Limit"
+msgstr "需要在此日期前増加配額"
+
+msgid "Allowed range is (0..99)"
+msgstr "有效範圍是 (0..99)"
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr "不正確的'savetoner'選項 %s : %s"
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr "%s 是不正確的'pagesize'設定，改為使用預設的A4"
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "不正確的DeviceURI : %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"pkhint正分析你的列印系統設定，請稍候"
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "不知名裝置 %s 對應列印機 %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"請把以下的設定放到/etc/pykota/pykota.conf內 :\n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr "# 請注意 : 假若軟件記帳是建議使用，這並不表示"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr "# 硬體記帳不能使用，這只代表PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr "未能自動偵測哪一個硬體記帳方法能夠使用"
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "列印機 %s 經已存在，指令被跳過"
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "列印機 %s 經已存在，列印機將會被變更"
+
+msgid "in"
+msgstr "在"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr "你必須需入列印機群組名稱"
+
+msgid "You have to pass printer names on the command line"
+msgstr "你必須需入列印機名稱"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "%s 是錯誤的duration設定"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "%s 是錯誤的loop設定"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "%s 是錯誤的sleep設定"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "%s是錯誤的color選項"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "使用者 %s 並沒有存在於PyKota的資料庫內"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "於列印機 %s 共使列印了 %s 頁"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "PyKota 配額還剩 : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "你的帳目結餘為 : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "列印總頁數 : %i 頁"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "於 %s 列印，你所需要的費用為 %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr "請按以上按鈕"
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "PyKota 列印配額報告"
+
+msgid "Report"
+msgstr "報告"
+
+msgid "Printer"
+msgstr "列印機"
+
+msgid "User / Group names mask"
+msgstr "使用者/群組 名稱篩選"
+
+msgid "Groups report"
+msgstr "群組報告"
+
+msgid "History"
+msgstr "列印紀錄"
+
+msgid "Empty"
+msgstr "沒有紀錄"
+
+msgid "Action"
+msgstr "允許/禁止 列印"
+
+msgid "User"
+msgstr "使用者"
+
+msgid "Hostname"
+msgstr "列印使用電腦"
+
+msgid "JobId"
+msgstr "列印工作識別碼"
+
+msgid "JobSize"
+msgstr "列印總頁數"
+
+msgid "JobPrice"
+msgstr "列印費用"
+
+msgid "Copies"
+msgstr "複製數量"
+
+msgid "JobBytes"
+msgstr "列印工作容量"
+
+msgid "PageCounter"
+msgstr "列印總計"
+
+msgid "Options"
+msgstr "其他選項"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "上一頁"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "%s 是暫時未能夠支援的計算器"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "未能尋找設定檔 %s"
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "%s 這個設定未能於 %s 內的section global找到"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "%s 這個設定未能在 %s section附屬於 %s 內找到"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "logger只支援數值在 %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "%s 是不正確的計算器用於列印機 %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr "accounter於 %s 部份只支援數值在 %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr "enforcement於 %s 部份只支援數值在 %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr "onaccountererror於 %s 部份只支援數值在 %s"
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "%s 是不正確的政策設定用於列印機 %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr "政策設定在 %s 只能夠支援的數值在 %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "%s 是不正確的mailto選項用於列印機 %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr "mailto 於 %s 的部份只支援數值在 %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "%s 是不正確的寬限時間"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "%s 是不正確的poor man's threshold"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"你的列印配額經已很低，\n"
+"假若你不增加配額，在不久的時間後，你將不能再列印，\n"
+"請你聯絡負責列印配額的管理人員，以解決這個問題。"
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"你不能再列印任何文件，\n"
+"因為你在列印機 %s 已沒有列印配額。"
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"在不久的時間内，你將會被禁止作任何列印，\n"
+"因為你在印表機 %s 的列印配額，差不多用完。"
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr "accountbanner內的 %s 只能支援數值在 %s"
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr "不正確的修改參數 [%s] 給 --data 指令選項，請參閱說明文件"
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr "不正確的修改參數 [%s] 給 --format 指令選項，請參閱說明文件"
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr "因為jaxml模組尙未安裝，XML輸出已停用"
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr "PyKota data dumper失敗 : I/O 錯誤 "
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "%s 暫時不支援的紀錄系統"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "使用者 %s 的列印配額於印表機%s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "寬限日期: %i 日"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "毎次列印工作所需費用: %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "列印毎頁所需費用: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "未能確認"
+
+#, python-format
+msgid "Real : %s"
+msgstr "硬體/軟體內部計算的數值 : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "總計 : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "%s 是不能支援的reporter backend"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "%s 是不能支援的配額資料庫"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "不能夠連線至SMTP伺服器 : %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "未能成功發送電郵到 %s，錯誤 %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"請聯絡系統管理員 :\n"
+"\t%s - <%S>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr "未能尋找使用者 %s 於印表機 %s，因此採用預設的政策(%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr "未能尋找使用者 %s 的帳目結算，因此採用預設的政策(%s)於列印機 %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "群組 %s 超出列印配額於列印機 %s"
+
+msgid "Print Quota"
+msgstr "列印配額"
+
+msgid "Print Quota Exceeded"
+msgstr "超出列印配額"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "羣組 %s 的列印配額於列印機 %s 經已很低"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "使用者 %s 的列印配額於列印機 %s 經已超出配額"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "使用者 %s 的列印配額於列印機 %s經已很低"
+
+msgid "Print Quota Low"
+msgstr "列印配額經已很低"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "列印系統 %s，args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr "未能運用通用的PDL分析器 %s 計算列印工作的數量"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "收到信號中止信息，列印工作 %s 中斷"
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "列印機主機名稱未能確認，設定為'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "未能確認列系統，args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"列印機 %s 在PyKota系統內沒有登記，因此這台列印機套用external policy (%s) "
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"使用者 %s 在PyKota內沒有登記，因此這個使用者將會套用external policy(%s) 於列"
+"印機 %s "
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr "使用者沒有列印配額於列印機 %s ，套用對外政策 (%s) 於列印機 %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr "對外政策 %s 於列印機 %s 產生錯誤，列印工作被拒，請撿查PyKota的設定檔案"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr "列印機 %s 沒有於PyKota系統內登記，套用預設的政策 (%s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr "使用者 %s 沒有於PyKota系統內登記，套用預設的政策 (%s)於列印機 %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr "使用者 %s 沒有列印配額於列印機 %s，套用預設的政策 (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr "列印機 %s 依然沒有於PyKota系統內登記，列印工作要求被拒"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr "使用者 %s 依然沒有於PyKota系統內登記，列印工作要求被拒於列印機 %s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr "使用者 %s 依然沒有列印配額於列印機 %s 在PyKota系統，列印工作被拒"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr "在讀取列印機 %s 的內存頁面計算器時出現問題"
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr "從資料庫讀取，恢復列印機 %s 的頁面計算器的計算值"
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr "不能恢復列印機 %s 的內存頁面計算器不論在列印的之前或之後"
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr "列印機 %s 被強制設定列印總頁數為 1 頁"
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr "資料庫沒有紀錄列印機 %s 上一次的列印紀錄"
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr "列印機 %s 的內存頁面計算器的數值不一致"
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "不明的列印機地址在硬體(%s)用於列印機 %s 上"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "正在執行硬體(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "中止信號傳送到硬體計算器 %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr "計算器輸出的第 [%s] 行被跳過，請再試一次..."
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr "硬件計算器 %s 中止，代碼為 %s"
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "未能夠查詢列印機 %s 透過硬件(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr "連線到 %s:%s : %s 時出現問題"
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr "傳送查詢到 %s:%s : %s 出現問題"
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr "正等待列印機 %s 閒置狀況達到穩定..."
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr "PJL查詢被中斷，使用最更新的數值來計算頁數計算器 (%s) 在列印機 %s 上"
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr "當列印機 %s : %s 進行SNMP查詢時出現網絡錯誤"
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr "SNMP信息解讀錯誤於列印機 %s : %s"
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr "當在列印機 %s 進行SNMP查詢時出現問題 : %s"
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr "SNMP查詢被中斷，使用最更新的數值來計算頁數計算器 (%s) 在列印機 %s 上"
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "正在執行軟件(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "未能夠使用記帳器計算列印總頁數 %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr "等待軟件記帳時出現問題，pid為 %s : %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "軟件記帳器 %s 終止，代碼為 %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr "假若有些使用者是屬於幾個不同組別，總計數值有機會不準確"
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr "%s 不存在，很可能是錯誤設定所致請撿查 /etc/pykota/pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "搜尋不到 %s(%s) 從 %s(scope=%s)"
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "新增LDAP紀錄 (%s, %s) 時出現問題"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "刪除LDAP紀錄 (%s) 時出現問題"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "修改LDAP紀錄出現問題 (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+"未能為使用者 %s 尋找pkotaAccountBalance object，請問你是否已手動建立LDAP 紀"
+"錄?  "
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"未能尋找現存的objectclass %s 紀錄帶有 %s=%s 連繫到pykotaAccount objectClass "
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr "未能尋找現存的紀錄連繫到pykotaGroup objectclass %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Internal SNMP accounting asked, but Python-SNMP is not available. Please "
+#~ "download it from http://pysnmp.sourceforge.net"
+#~ msgstr ""
+#~ "要求內存的SNMP計算器，但找不到Python-SNMP請到http://pysnmp.sourceforge.net"
+#~ "下載"
+
+#~ msgid "Too many arguments, see help."
+#~ msgstr "太多arguments，請參閱說明文件"
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "群組           已列印    警告限制    有效限制    結餘 寬限日期        付款"
+#~ "總計       已繳付"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "群組           已列印    警告限制    有效限制    結餘 寬限日期         付"
+#~ "款總計       已繳付"
+
+#~ msgid "Waiting for printer %s to be idle or printing..."
+#~ msgstr "正等待列印機 %s 致閒置或列印狀態..."
Index: pykota/tags/1.22/po/it/pykota.po
===================================================================
--- pykota/tags/1.22/po/it/pykota.po (revision 2228)
+++ pykota/tags/1.22/po/it/pykota.po (revision 2228)
@@ -0,0 +1,1915 @@
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# PyKota translation master file.
+# Copyright (c) 2003, 2004, 2005 Conseil Internet & Logiciels Libres
+# Jerome Alet <alet@librelogiciel.com>, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PyKota v1.20\n"
+"Report-Msgid-Bugs-To: alet@librelogiciel.com\n"
+"POT-Creation-Date: 2004-11-25 10:16+0100\n"
+"PO-Revision-Date: 2004-07-27 12:00+0100\n"
+"Last-Translator: Michele Baldessari <michele@pupazzo.org>\n"
+"Language-Team: Italian <michele@pupazzo.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid ""
+"autopykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A tool to automate user account creation and initial balance setting.\n"
+"\n"
+"THIS TOOL MUST NOT BE USED IF YOU WANT TO LIMIT YOUR USERS BY PAGE QUOTA !\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  THIS TOOL MUST NOT BE USED FROM THE COMMAND LINE BUT ONLY AS PART\n"
+"  OF AN external policy IN pykota.conf\n"
+"  \n"
+"  autopykota { -i | --initbalance value } \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints autopykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -i | --initbalance b Sets the user's account initial balance value to b.\n"
+"                       If the user already exists, actual balance is left\n"
+"                       unmodified. If unset, the default value is 0.\n"
+"                       \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Banner generator %s exit code is %s"
+msgstr ""
+
+msgid "Job contains no data. Printing is denied."
+msgstr "Stampa non contiene dati. Stampa rifiutata."
+
+msgid "Job is a duplicate. Printing is denied."
+msgstr ""
+
+msgid "Banner won't be printed : maximum number of deny banners reached."
+msgstr ""
+
+msgid "Job accounting begins."
+msgstr "Inizio accounting stampa."
+
+msgid "Job accounting ends."
+msgstr "Fine accounting stampa."
+
+msgid "Job size forced to 0 because printing is denied."
+msgstr "Dimensione stampa forzato a 0 perch�a stampa non �ermessa."
+
+#, python-format
+msgid "Beware : computed job size (%s) != precomputed job size (%s)"
+msgstr ""
+
+msgid ""
+"The job size will be trusted anyway according to the 'trustjobsize' directive"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be trusted because it is inferior to the 'trustjobsize' "
+"directive's limit %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"The job size will be modified according to the 'trustjobsize' directive : %s"
+msgstr ""
+
+#, python-format
+msgid "Job size : %i"
+msgstr "Dimensione stampa: %i"
+
+#, python-format
+msgid "Updating user %s's quota on printer %s"
+msgstr "Aggiornamento quota per l'utente %s sulla stampante %s"
+
+msgid "Job added to history."
+msgstr "Stampa aggiunta in cronologia."
+
+#, python-format
+msgid "File number %s unregistered twice from polling object, ignored."
+msgstr "Numero file %s rimosso due volte dall'oggetto polling, ignorato."
+
+#, python-format
+msgid "SIGTERM was sent to real backend %s (pid: %s)"
+msgstr "Segnale SIGTERM inviato al backend %s (pid: %s)"
+
+#, python-format
+msgid "CUPS backend %s died abnormally."
+msgstr "Backend CUPS %s terminato inaspettatamente."
+
+#, python-format
+msgid ""
+"dumpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Dumps PyKota database's content.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  dumpykota [options] [filterexpr]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints dumpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -d | --data type     Dumps 'type' datas. Allowed types are :\n"
+"                       \n"
+"                         - history : dumps the jobs history.\n"
+"                         - users : dumps users.\n"
+"                         - groups : dumps user groups.\n"
+"                         - printers : dump printers.\n"
+"                         - upquotas : dump user quotas.\n"
+"                         - gpquotas : dump user groups quotas.\n"
+"                         - payments : dumps user payments.\n"
+"                         - pmembers : dumps printer groups members.\n"
+"                         - umembers : dumps user groups members.\n"
+"                         \n"
+"                       NB : the -d | --data command line option   \n"
+"                       is MANDATORY.\n"
+"  \n"
+"  -f | --format fmt    Dumps datas in the 'fmt' format. When not specified,\n"
+"                       the format is to dump datas in the csv format (comma\n"
+"                       separated values). All data dumped is between double\n"
+"                       quotes. Allowed formats are :\n"
+"                       \n"
+"                         - csv : separate datas with commas\n"
+"                         - ssv : separate datas with semicolons\n"
+"                         - tsv : separate datas with tabs\n"
+"                         - xml : dump data as XML\n"
+"                         - cups : dump datas in CUPS' page_log format :\n"
+"                                  ONLY AVAILABLE WITH --data history\n"
+"                         \n"
+"  -o | --output fname  All datas will be dumped to the file instead of\n"
+"                       to the standard output. The special '-' filename\n"
+"                       is the default value and means stdout.\n"
+"                       WARNING : existing files are truncated !\n"
+"                       \n"
+"  Use the filter expressions to extract only parts of the \n"
+"  datas. Allowed filters are of the form :\n"
+"                \n"
+"         key=value\n"
+"                         \n"
+"  Allowed keys for now are :  \n"
+"                       \n"
+"         username       User's name\n"
+"         groupname      Users group's name\n"
+"         printername    Printer's name\n"
+"         pgroupname     Printers group's name\n"
+"         hostname       Client's hostname\n"
+"         billingcode    Job's billing code\n"
+"         \n"
+"  Contrary to other PyKota management tools, wildcard characters are not \n"
+"  expanded, so you can't use them.\n"
+"  \n"
+"  NB : not all keys are allowed for each data type, so the result may be \n"
+"  empty if you use a key not available for a particular data type.\n"
+"  \n"
+"Examples :\n"
+"\n"
+"  $ dumpykota --data history --format csv >myfile.csv\n"
+"  \n"
+"  This dumps the history in a comma separated values file, for possible\n"
+"  use in a spreadsheet.\n"
+"  \n"
+"  $ dumpykota --data users --format xml -o users.xml\n"
+"  \n"
+"  Dumps all users datas to the users.xml file.\n"
+"  \n"
+"  $ dumpykota --data history printername=HP2100 username=jerome\n"
+"  \n"
+"  Dumps the job history for user jerome on printer HP2100 only.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "The -d | --data command line option is mandatory, see help."
+msgstr ""
+
+#, python-format
+msgid ""
+"edpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Print Quota editor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  edpykota [options] user1 user2 ... userN\n"
+"  \n"
+"  edpykota [options] group1 group2 ... groupN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints edpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds users and/or printers if they don't \n"
+"                       exist on the Quota Storage Server.\n"
+"                       \n"
+"  -d | --delete        Deletes users/groups from the quota storage.\n"
+"                       Printers are never deleted.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge\n"
+"                       for a particular printer. Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point values are allowed.\n"
+"                       \n"
+"  -o | --overcharge f  Sets the overcharging factor applied to the user \n"
+"                       when computing the cost of a print job. Positive or \n"
+"                       negative floating point values are allowed,\n"
+"                       this allows you to do some really creative\n"
+"                       things like giving money to an user whenever\n"
+"                       he prints. The number of pages in a print job\n"
+"                       is not modified by this coefficient, only the\n"
+"                       cost of the job for a particular user.\n"
+"                       Only users have a coefficient.\n"
+"  \n"
+"  -i | --ingroups g1[,g2...]  Puts the users into each of the groups\n"
+"                              listed, separated by commas. The groups\n"
+"                              must already exist in the Quota Storage.\n"
+"  \n"
+"  -u | --users         Edit users print quotas, this is the default.\n"
+"  \n"
+"  -P | --printer p     Edit quotas on printer p only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers. \n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups\n"
+"                       pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"  \n"
+"  -g | --groups        Edit users groups print quotas instead of users.\n"
+"                          \n"
+"  -p | --prototype u|g Uses user u or group g as a prototype to set\n"
+"                       print quotas\n"
+"                       \n"
+"  -n | --noquota       Doesn't set a quota but only does accounting.\n"
+"  \n"
+"  -r | --reset         Resets the actual page counter for the user\n"
+"                       or group to zero on the specified printers. \n"
+"                       The life time page counter is kept unchanged.\n"
+"                       \n"
+"  -R | --hardreset     Resets the actual and life time page counters\n"
+"                       for the user or group to zero on the specified \n"
+"                       printers. This is a shortcut for '--used 0'.\n"
+"                       \n"
+"  -l | --limitby l     Choose if the user/group is limited in "
+"printing                     \n"
+"                       by its account balance or by its page quota.\n"
+"                       The default value is 'quota'. Allowed values\n"
+"                       are 'quota' 'balance' 'quota-then-balance' and\n"
+"                       'balance-then-quota'.\n"
+"                       WARNING : quota-then-balance and balance-then-quota\n"
+"                       are not yet implemented.\n"
+"                       \n"
+"  -b | --balance b     Sets the user's account balance to "
+"b.                     \n"
+"                       Account balance may be increase or decreased\n"
+"                       if b is prefixed with + or -.\n"
+"                       WARNING : when decreasing account balance,\n"
+"                       the total paid so far by the user is decreased\n"
+"                       too.\n"
+"                       Groups don't have a real balance, but the\n"
+"                       sum of their users' account balance.\n"
+"                       \n"
+"  -S | --softlimit sl  Sets the quota soft limit to sl "
+"pages.                       \n"
+"  \n"
+"  -H | --hardlimit hl  Sets the quota hard limit to hl pages.\n"
+"\n"
+"  -U | --used usage    Sets the pagecounters for the user to usage pages;\n"
+"                       useful for migrating users from a different system\n"
+"                       where they have already used some pages. Actual\n"
+"                       and Life Time page counters may be increased or "
+"decreased\n"
+"                       if usage is prefixed with + or -.\n"
+"                       WARNING : BOTH page counters are modified in all "
+"cases,\n"
+"                       so be careful.\n"
+"                       NB : if 'usage' equals '0', then the action taken is\n"
+"                       the same as if --hardreset was used.\n"
+"\n"
+"  user1 through userN and group1 through groupN can use wildcards\n"
+"  if the --add option is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ edpykota --add -p jerome john paul george ringo/ringo@example.com\n"
+"  \n"
+"  This will add users john, paul, george and ringo to the quota\n"
+"  database, and set their print quotas to the same values than user \n"
+"  jerome. User jerome must already exist.\n"
+"  User ringo's email address will also be set to 'ringo@example.com'\n"
+"  \n"
+"  $ edpykota --printer lp -S 50 -H 60 jerome\n"
+"  \n"
+"  This will set jerome's print quota on the lp printer to a soft limit\n"
+"  of 50 pages, and a hard limit of 60 pages. If either user jerome or\n"
+"  printer lp doesn't exist on the Quota Storage Server then nothing is "
+"done.\n"
+"\n"
+"  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome\n"
+"  \n"
+"  Same as above, but if either user jerome or printer lp doesn't exist \n"
+"  on the Quota Storage Server they are automatically added. Also\n"
+"  user jerome is put into the groups \"coders\" and \"it\" which must\n"
+"  already exist in the Quota Storage.\n"
+"            \n"
+"  $ edpykota -g -S 500 -H 550 financial support            \n"
+"  \n"
+"  This will set print quota soft limit to 500 pages and hard limit\n"
+"  to 550 pages for groups financial and support on all printers.\n"
+"  \n"
+"  $ edpykota --reset jerome \"jo*\"\n"
+"  \n"
+"  This will reset jerome's page counter to zero on all printers, as\n"
+"  well as every user whose name begins with 'jo'.\n"
+"  Their life time page counter on each printer will be kept unchanged.\n"
+"  You can also reset the life time page counters by using the\n"
+"  --hardreset | -R command line option.\n"
+"  \n"
+"  $ edpykota --printer hpcolor --noquota jerome\n"
+"  \n"
+"  This will tell PyKota to not limit jerome when printing on the \n"
+"  hpcolor printer. All his jobs will be allowed on this printer, but \n"
+"  accounting of the pages he prints will still be kept.\n"
+"  Print Quotas for jerome on other printers are unchanged.\n"
+"  \n"
+"  $ edpykota --limitby balance jerome\n"
+"  \n"
+"  This will tell PyKota to limit jerome by his account's balance\n"
+"  when printing.\n"
+"  \n"
+"  $ edpykota --balance +10.0 jerome\n"
+"  \n"
+"  This will increase jerome's account balance by 10.0 (in your\n"
+"  own currency). You can decrease the account balance with a\n"
+"  dash prefix, and set it to a fixed amount with no prefix.\n"
+"  \n"
+"  $ edpykota --delete jerome rachel\n"
+"  \n"
+"  This will completely delete jerome and rachel from the Quota Storage\n"
+"  database. All their quotas and jobs will be deleted too.\n"
+"  \n"
+"  $ edpykota --printer lp --charge 0.1\n"
+"  \n"
+"  This will set the page price for printer lp to 0.1. Job price\n"
+"  will not be changed.\n"
+"  \n"
+"  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP\n"
+"  \n"
+"  This will put printers hplj1 and hplj2 in printers groups Laser and HP.\n"
+"  When printing either on hplj1 or hplj2, print quota will also be \n"
+"  checked and accounted for on virtual printers Laser and HP.\n"
+"  \n"
+"  $ edpykota --overcharge 2.5 poorstudent\n"
+"  \n"
+"  This will overcharge the poorstudent user by a factor of 2.5.\n"
+"  \n"
+"  $ edpykota --overcharge -1 jerome\n"
+"  \n"
+"  User jerome will actually earn money whenever he prints.\n"
+"  \n"
+"  $ edpykota --overcharge 0 boss\n"
+"  \n"
+"  User boss can print at will, it won't cost him anything because the\n"
+"  cost of each print job will be multiplied by zero before charging\n"
+"  his account.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "You're not allowed to use this command."
+msgstr ""
+
+#, python-format
+msgid "Invalid used value %s."
+msgstr ""
+
+#, python-format
+msgid "Invalid softlimit value %s."
+msgstr "Limite soft %s non valido."
+
+#, python-format
+msgid "Invalid hardlimit value %s."
+msgstr "Limite hard %s non valido."
+
+#, python-format
+msgid "Hard limit %i is less than soft limit %i, values will be exchanged."
+msgstr "Limite hard %i minore del limite soft %i, i valori verranno scambiati."
+
+#, python-format
+msgid "Invalid overcharge value %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid balance value %s"
+msgstr "Valore di credito %s"
+
+#, python-format
+msgid "Invalid charge amount value %s"
+msgstr "Ammontare del costo non valido %s"
+
+#, python-format
+msgid "Invalid limitby value %s"
+msgstr "Valore di limite %s non valido"
+
+#, python-format
+msgid "Impossible to add printer %s"
+msgstr "Impossibile aggiungere la stampante %s"
+
+#, python-format
+msgid "Invalid printer name %s"
+msgstr "Nome stampante %s non valido"
+
+#, python-format
+msgid "There's no printer matching %s"
+msgstr "Non esiste una stampante %s"
+
+msgid "You have to pass user or group names on the command line"
+msgstr ""
+"Bisogna specificare dei nomi di utente o di gruppo sulla linea di comando"
+
+#, python-format
+msgid "Prototype object %s not found in Quota Storage."
+msgstr "Oggetto prototipo %s non trovato nello storage delle quote."
+
+#, python-format
+msgid "Prototype %s not found in Quota Storage for printer %s."
+msgstr ""
+"Prototipo %s non trovato nello storage delle quote per la stampante %s."
+
+#, python-format
+msgid "Undefined hard limit set to soft limit (%s) on printer %s."
+msgstr ""
+"Limite hard non specificato impostato al limite soft (%s) sulla stampante %s."
+
+#, python-format
+msgid "Undefined soft limit set to hard limit (%s) on printer %s."
+msgstr ""
+"Limite soft non specificato impostato al limite hard (%s) sulla stampante %s."
+
+#, python-format
+msgid "Invalid email address %s"
+msgstr "Indirizzo email non valido %s"
+
+#, python-format
+msgid "Unknown group %s"
+msgstr ""
+
+#, python-format
+msgid "Unknown user %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid group name %s"
+msgstr "Nome gruppo non valido %s"
+
+#, python-format
+msgid "Invalid user name %s"
+msgstr "Nome utente non valido %s"
+
+#, python-format
+msgid "Quota not found for object %s on printer %s."
+msgstr "Quota non trovata per l'oggetto %s sulla stampante %s."
+
+#, python-format
+msgid "Group %s not found in the PyKota Storage."
+msgstr "Gruppo %s non trovato nello storage di PyKota."
+
+msgid "incompatible options, see help."
+msgstr "opzioni non compatibili, vedere la guida."
+
+msgid "Software accounting already done in first pass. Ignoring."
+msgstr "Conteggio software gi�ffettuato nel primo passaggio. Ignorato."
+
+msgid "Hardware accounting already done in first pass. Ignoring."
+msgstr "Conteggio hardware gi�ffettuato nel primo passaggio. Ignorato."
+
+msgid "Job size and price now set in history."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkbanner v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates banners.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkbanner  [options]  [more info]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkbanner's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -l | --logo img      Use the image as the banner's logo. The logo will\n"
+"                       be drawn at the center top of the page. The default\n"
+"                       logo is /usr/share/pykota/logos/pykota.jpeg\n"
+"                       \n"
+"  -p | --pagesize sz   Sets sz as the page size. Most well known\n"
+"                       page sizes are recognized, like 'A4' or 'Letter'\n"
+"                       to name a few. The default size is A4.\n"
+"  \n"
+"  -s | --savetoner s   Sets the text luminosity factor to s%%. This can be \n"
+"                       used to save toner. The default value is 0, which\n"
+"                       means that no toner saving will be done.\n"
+"  \n"
+"  -u | --url u         Uses u as an url to be written at the bottom of \n"
+"                       the banner page. The default url is :\n"
+"                       http://www.librelogiciel.com/software/\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  Using pkbanner directly from the command line is not recommended,\n"
+"  excepted for testing purposes. You should use pkbanner in the\n"
+"  'startingbanner' or 'endingbanner' directives in pykota.conf\n"
+"  \n"
+"    startingbanner: /usr/bin/pkbanner --logo=\"\" --savetoner=75\n"
+"  \n"
+"      With such a setting in pykota.conf, all print jobs will be \n"
+"      prefixed with an A4 banner with no logo, and text luminosity will\n"
+"      be increased by 75%%. The PostScript output will be directly sent\n"
+"      to your printer.\n"
+"      \n"
+"  You'll find more examples in the sample configuration file included    \n"
+"  in PyKota.\n"
+"      \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "More Info"
+msgstr ""
+
+msgid "Job"
+msgstr ""
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Allowed"
+msgstr ""
+
+msgid "Denied"
+msgstr ""
+
+msgid "Allowed with Warning"
+msgstr ""
+
+msgid "Result"
+msgstr ""
+
+msgid "Title"
+msgstr "Titolo"
+
+msgid "Filename"
+msgstr "Nome file"
+
+#, python-format
+msgid "Pages printed so far on %s"
+msgstr ""
+
+msgid "Account balance"
+msgstr ""
+
+msgid "Soft Limit"
+msgstr ""
+
+msgid "Hard Limit"
+msgstr ""
+
+msgid "Date Limit"
+msgstr ""
+
+msgid "Allowed range is (0..99)"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'savetoner' option %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid 'pagesize' option %s, defaulting to A4."
+msgstr ""
+
+#, python-format
+msgid ""
+"pkhint v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"A tool to give hints on what accounting method is best for each printer.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkhint [options] [printer1 printer2 printer3 ... printerN] <file.conf\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkhint's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkhint \"hp*\" printer103 </etc/cups/printers.conf\n"
+"  \n"
+"  Will analyze your printing system to test which accounter\n"
+"  is the best for each of the defined printer which\n"
+"  name matches one of the parameters.\n"
+"  \n"
+"  If you don't pass any argument on the command line, all\n"
+"  printers will be analyzed.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid DeviceURI : %s"
+msgstr "DeviceURI non valido: %s"
+
+msgid ""
+"\n"
+"Please wait while pkhint analyzes your printing system's configuration..."
+msgstr ""
+"\n"
+"Prego attendere fino a che pkhint termini di analizzare la configurazione di "
+"stampa del sistema..."
+
+#, python-format
+msgid "Unknown device %s for printer %s"
+msgstr "Periferica %s sconosciuta per la stampante %s"
+
+msgid ""
+"\n"
+"Put the following lines into your /etc/pykota/pykota.conf file :\n"
+msgstr ""
+"\n"
+"Si inseriscano le seguenti righe nel file /etc/pykota/pykota.conf : \n"
+
+msgid "# BEWARE : if software accounting is suggested, this doesn't mean"
+msgstr ""
+"# ATTENZIONE: se �tato suggerito conteggio software, ci�n significa"
+
+msgid "# that hardware accounting wouldn't work, this only means that PyKota"
+msgstr ""
+"# che il conteggio hardware non sia funzionante, ma solamente che PyKota"
+
+msgid "# wasn't able to autodetect which hardware accounting method to use."
+msgstr ""
+"# non �tato in grado di riconoscere automaticamente quale metodo di "
+"conteggio utilizzare"
+
+#, python-format
+msgid ""
+"pkmail v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Email gateway for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkmail  [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkmail's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"    \n"
+"  This command is meant to be used from your mail server's aliases file,\n"
+"  as a pipe. It will then accept commands send to it in email messages,\n"
+"  and will send the answer to the command's originator.\n"
+"  \n"
+"  To use this command, create an email alias in /etc/aliases with\n"
+"  the following format :\n"
+"  \n"
+"    pykotacmd: \"|/usr/bin/pkmail\"\n"
+"    \n"
+"  Then run the 'newaliases' command to regenerate the aliases database.\n"
+"  \n"
+"  You can now send commands by email to 'pykotacmd@yourdomain.com', with\n"
+"  the command in the subject.\n"
+"  \n"
+"  List of supported commands :\n"
+"  \n"
+"        report [username]\n"
+"  \n"
+"  NB : For pkmail to work correctly, you may have to put the 'mail'\n"
+"  system user in the 'pykota' system group to ensure this user can\n"
+"  read the /etc/pykota/pykotadmin.conf file, and restart your\n"
+"  mail server (e.g. /etc/init.d/exim restart). It is strongly advised\n"
+"  that you think at least twice before doing this though.\n"
+"  \n"
+"  Use at your own risk !\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"pkprinters v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"A Printers Manager for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pkprinters [options] printer1 printer2 printer3 ... printerN\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pkprinters's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -a | --add           Adds printers if they don't exist on the Quota \n"
+"                       Storage Server. If they exist, they are modified\n"
+"                       unless -s|--skipexisting is also used.\n"
+"                       \n"
+"  -d | --delete        Deletes printers from the quota storage.\n"
+"  \n"
+"  -D | --description d Adds a textual description to printers.\n"
+"                       \n"
+"  -c | --charge p[,j]  Sets the price per page and per job to charge.\n"
+"                       Job price is optional.\n"
+"                       If both are to be set, separate them with a comma.\n"
+"                       Floating point and negative values are allowed.\n"
+"  \n"
+"  -g | --groups pg1[,pg2...] Adds or Remove the printer(s) to the printer \n"
+"                       groups pg1, pg2, etc... which must already exist.\n"
+"                       A printer group is just like a normal printer,\n"
+"                       only that it is usually unknown from the printing\n"
+"                       system. Create printer groups exactly the same\n"
+"                       way that you create printers, then add other \n"
+"                       printers to them with this option.\n"
+"                       Accounting is done on a printer and on all\n"
+"                       the printer groups it belongs to, quota checking\n"
+"                       is done on a printer and on all the printer groups\n"
+"                       it belongs to.\n"
+"                       If the --remove option below is not used, the \n"
+"                       default action is to add printers to the specified\n"
+"                       printer groups.\n"
+"                       \n"
+"  -l | --list          List informations about the printer(s) and the\n"
+"                       printers groups it is a member of.\n"
+"                       \n"
+"  -r | --remove        In combination with the --groups option "
+"above,                       \n"
+"                       remove printers from the specified printers groups.\n"
+"                       \n"
+"  -s | --skipexisting  In combination with the --add option above, tells\n"
+"                       pkprinters to not modify existing printers.\n"
+"  \n"
+"  printer1 through printerN can contain wildcards if the --add option \n"
+"  is not set.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pkprinters --add -D \"HP Printer\" --charge 0.05,0.1 hp2100 hp2200 "
+"hp8000\n"
+"  \n"
+"  Will create three printers named hp2100, hp2200 and hp8000.\n"
+"  Their price per page will be set at 0.05 unit, and their price\n"
+"  per job will be set at 0.1 unit. Units are in your own currency,\n"
+"  or whatever you want them to mean.\n"
+"  All of their descriptions will be set to the string \"HP Printer\".\n"
+"  If any of these printers already exists, it will also be modified \n"
+"  unless the -s|--skipexisting command line option is also used.\n"
+"            \n"
+"  $ pkprinters --delete \"*\"\n"
+"  \n"
+"  This will completely delete all printers and associated quota "
+"information,\n"
+"  as well as their job history. USE WITH CARE !\n"
+"  \n"
+"  $ pkprinters --groups Laser,HP \"hp*\"\n"
+"  \n"
+"  This will put all printers which name matches \"hp*\" into printers "
+"groups \n"
+"  Laser and HP, which MUST already exist.\n"
+"  \n"
+"  $ pkprinters --groups LexMark --remove hp2200\n"
+"  \n"
+"  This will remove the hp2200 printer from the LexMark printer group.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Printer %s already exists, skipping."
+msgstr "Stampante %s gi�sistente, omessa."
+
+#, python-format
+msgid "Printer %s already exists, will be modified."
+msgstr "Stampante %s gi�sistente, verr�odificata."
+
+msgid "in"
+msgstr "in"
+
+msgid "You have to pass printer groups names on the command line"
+msgstr ""
+"Bisogna specificare i nomi di gruppo delle stampanti sulla riga di comando"
+
+msgid "You have to pass printer names on the command line"
+msgstr "Bisogna specificare i nomi delle stampanti sulla riga di comando"
+
+#, python-format
+msgid ""
+"pykosd v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"An OSD quota monitor for PyKota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykosd [options]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykosd's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -c | --color #rrggbb Sets the color to use for display as an hexadecimal\n"
+"                       triplet, for example #FF0000 is 100%% red.\n"
+"                       Defaults to 100%% green (#00FF00).\n"
+"                       \n"
+"  -d | --duration d    Sets the duration of the display in seconds. \n"
+"                       Defaults to 3 seconds.\n"
+"                       \n"
+"  -f | --font f        Sets the font to use for "
+"display.                      \n"
+"                       Defaults to the Python OSD library's default.\n"
+"  \n"
+"  -l | --loop n        Sets the number of times the info will be displayed.\n"
+"                       Defaults to 0, which means loop forever.\n"
+"                       \n"
+"  -s | --sleep s       Sets the sleeping duration between two displays \n"
+"                       in seconds. Defaults to 180 seconds (3 minutes).\n"
+"                       \n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykosd -s 60 --loop 5\n"
+"  \n"
+"  Will launch pykosd. Display will be refreshed every 60 seconds,\n"
+"  and will last for 3 seconds (the default) each time. After five\n"
+"  iterations, the program will exit.\n"
+"  \n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid duration option %s"
+msgstr "Opzione duration %s non valida"
+
+#, python-format
+msgid "Invalid loop option %s"
+msgstr "Opzione loop %s non valida"
+
+#, python-format
+msgid "Invalid sleep option %s"
+msgstr "Opzione sleep %s non valida"
+
+#, python-format
+msgid "Invalid color option %s"
+msgstr "Opzione colore %s non valida"
+
+#, python-format
+msgid "User %s doesn't exist in PyKota's database"
+msgstr "Utente %s non esiste nel database di PyKota"
+
+#, python-format
+msgid "Pages used on %s : %s"
+msgstr "Pagine utilizzate su %s : %s"
+
+#, python-format
+msgid "PyKota Units left : %.2f"
+msgstr "Unit�yKota rimaste : %.2f"
+
+#, python-format
+msgid ""
+"pykotme v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels Libres\n"
+"\n"
+"Gives print quotes to users.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  pykotme  [options]  [files]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints pykotme's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -P | --printer p     Gives a quote for this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ pykotme --printer apple file1.ps file2.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps and file2.ps \n"
+"  which would be sent to the apple printer.\n"
+"  \n"
+"  $ pykotme --printer apple,hplaser <file1.ps\n"
+"  \n"
+"  This will give a print quote to the current user. The quote will show\n"
+"  the price and size of a job consisting in file1.ps as read from\n"
+"  standard input, which would be sent to the apple or hplaser\n"
+"  printer.\n"
+"\n"
+"  $ pykotme \n"
+"  \n"
+"  This will give a quote for a job consisting of what is on standard \n"
+"  input. The quote will list the job size, and the price the job\n"
+"  would cost on each printer.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid "Your account balance : %.2f"
+msgstr "Il tuo totale : %.2f"
+
+#, python-format
+msgid "Job size : %i pages"
+msgstr "Dimensione stampa : %i pagine"
+
+#, python-format
+msgid "Cost on printer %s : %.2f"
+msgstr "Costo sulla stampante %s : %.2f"
+
+#, python-format
+msgid ""
+"repykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Generates print quota reports.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  repykota [options] \n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints repykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Generates a report on users quota, this is \n"
+"                       the default.\n"
+"  \n"
+"  -g | --groups        Generates a report on group quota instead of users.\n"
+"  \n"
+"  -P | --printer p     Report quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ repykota --printer lp\n"
+"  \n"
+"  This will print the quota status for all users who use the lp printer.\n"
+"\n"
+"  $ repykota \n"
+"  \n"
+"  This will print the quota status for all users on all printers.\n"
+"  \n"
+"  $ repykota --printer \"laser*,*pson\" jerome \"jo*\"\n"
+"  \n"
+"  This will print the quota status for user jerome and all users\n"
+"  whose name begins with \"jo\" on all printers which name begins\n"
+"  with \"laser\" or ends with \"pson\".\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warnpykota v%s (c) 2003, 2004, 2005 C@LL - Conseil Internet & Logiciels "
+"Libres\n"
+"\n"
+"Sends mail to users over print quota.\n"
+"\n"
+"command line usage :\n"
+"\n"
+"  warnpykota  [options]  [names]\n"
+"\n"
+"options :\n"
+"\n"
+"  -v | --version       Prints warnpykota's version number then exits.\n"
+"  -h | --help          Prints this message then exits.\n"
+"  \n"
+"  -u | --users         Warns users over their print quota, this is the \n"
+"                       default.\n"
+"  \n"
+"  -g | --groups        Warns users whose groups quota are over limit.\n"
+"  \n"
+"  -P | --printer p     Verify quotas on this printer only. Actually p can\n"
+"                       use wildcards characters to select only\n"
+"                       some printers. The default value is *, meaning\n"
+"                       all printers.\n"
+"                       You can specify several names or wildcards, \n"
+"                       by separating them with commas.\n"
+"  \n"
+"examples :                              \n"
+"\n"
+"  $ warnpykota --printer lp\n"
+"  \n"
+"  This will warn all users of the lp printer who have exceeded their\n"
+"  print quota.\n"
+"\n"
+"  $ warnpykota \n"
+"  \n"
+"  This will warn all users  who have exceeded their print quota on\n"
+"  any printer.\n"
+"\n"
+"  $ warnpykota --groups --printer \"laserjet*\" \"dev*\"\n"
+"  \n"
+"  This will warn all users of groups which names begins with \"dev\" and\n"
+"  who have exceeded their print quota on any printer which name begins \n"
+"  with \"laserjet\"\n"
+"  \n"
+"  If launched by an user who is not a PyKota administrator, additionnal\n"
+"  arguments representing users or groups names are ignored, and only the\n"
+"  current user/group is reported.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.\n"
+"\n"
+"Please e-mail bugs to: %s"
+msgstr ""
+
+msgid "PyKota Data Dumper"
+msgstr ""
+
+msgid "Dump"
+msgstr ""
+
+msgid "Please click on the above button"
+msgstr ""
+
+msgid "Data Type"
+msgstr ""
+
+msgid "Output Format"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "PyKota Reports"
+msgstr "Report di PyKota"
+
+msgid "Report"
+msgstr "Report"
+
+msgid "Printer"
+msgstr "Stampante"
+
+msgid "User / Group names mask"
+msgstr "Mask nomi utenti / gruppi"
+
+msgid "Groups report"
+msgstr "Report gruppi"
+
+msgid "History"
+msgstr "Cronologia"
+
+msgid "Empty"
+msgstr "Vuoto"
+
+msgid "Action"
+msgstr "Azione"
+
+msgid "User"
+msgstr "Utente"
+
+msgid "Hostname"
+msgstr "Nome host"
+
+msgid "JobId"
+msgstr "Id stampa"
+
+msgid "JobSize"
+msgstr "Dimensione stampa"
+
+msgid "JobPrice"
+msgstr "Prezzo stampa"
+
+msgid "Copies"
+msgstr "Copie"
+
+msgid "JobBytes"
+msgstr "Stampa in byte"
+
+msgid "PageCounter"
+msgstr "Contatore pagine"
+
+msgid "Options"
+msgstr "Opzioni"
+
+msgid "MD5Sum"
+msgstr ""
+
+msgid "BillingCode"
+msgstr ""
+
+msgid "Pages"
+msgstr ""
+
+msgid "Previous page"
+msgstr "Pagina precedente"
+
+msgid "PyKota Quotes"
+msgstr ""
+
+msgid "Quote"
+msgstr ""
+
+#, python-format
+msgid "This file is %i pages long."
+msgstr ""
+
+#, python-format
+msgid "Unsupported accounter backend %s"
+msgstr "Backend per il conteggio non supportato %s"
+
+#, python-format
+msgid "Configuration file %s not found."
+msgstr "File di configurazione %s non trovato."
+
+#, python-format
+msgid "Option %s not found in section global of %s"
+msgstr "Opzione %s non trovata nella sezione globale di %s"
+
+#, python-format
+msgid "Option %s not found in section %s of %s"
+msgstr "Opzione %s non trovata nella sezione %s di %s"
+
+#, python-format
+msgid "Option ldaptls is set, but certificate %s is not readable."
+msgstr ""
+
+#, python-format
+msgid "Option logger only supports values in %s"
+msgstr "L'opzione logger supporta solamente i seguenti valori %s"
+
+#, python-format
+msgid "Invalid accounter %s for printer %s"
+msgstr "Accounter non valido %s per la stampante %s"
+
+#, python-format
+msgid "Option accounter in section %s only supports values in %s"
+msgstr ""
+"L'opzione accounter nella sezione %s supporta solamente i seguenti valori %s"
+
+#, python-format
+msgid "Option enforcement in section %s only supports values in %s"
+msgstr ""
+"Imposizione dell'opzione nella sezione %s supporta solamente i valori in %s"
+
+#, python-format
+msgid "Option onaccountererror in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid policy %s for printer %s"
+msgstr "Policy non valida %s per la stampante %s"
+
+#, python-format
+msgid "Option policy in section %s only supports values in %s"
+msgstr ""
+"L'opzione policy nella sezione %s supporta solamente i seguenti valori %s"
+
+#, python-format
+msgid "Invalid option mailto %s for printer %s"
+msgstr "Opzione mailto %s non valida per la stampante %s"
+
+#, python-format
+msgid "Option mailto in section %s only supports values in %s"
+msgstr ""
+"Opzione mailto nella sezione %s supporta solamente i seguenti valori %s"
+
+#, python-format
+msgid "Invalid maximal deny banners counter %s"
+msgstr ""
+
+#, python-format
+msgid "Invalid grace delay %s"
+msgstr "Periodo di grace delay %s non valido"
+
+#, python-format
+msgid "Invalid poor man's threshold %s"
+msgstr "Poor man's threshold non valido %s"
+
+msgid ""
+"Your Print Quota account balance is Low.\n"
+"Soon you'll not be allowed to print anymore.\n"
+"Please contact the Print Quota Administrator to solve the problem."
+msgstr ""
+"Il credito di stampa del vostro account �n esaurimento. \n"
+"A breve non sar�i�sibile stampare.\n"
+"Si prega di contattare l'amministratore delle quote di stampa per risolvere "
+"il problema."
+
+#, python-format
+msgid ""
+"You are not allowed to print anymore because\n"
+"your Print Quota is exceeded on printer %s."
+msgstr ""
+"Non siete pi�grado di stampare in quanto\n"
+"la vostra quota sulla stampante %s �saurita."
+
+#, python-format
+msgid ""
+"You will soon be forbidden to print anymore because\n"
+"your Print Quota is almost reached on printer %s."
+msgstr ""
+"A breve non sarete pi�grado di stampare in quanto\n"
+"la vostra quota sulla stampante %s �uasi esaurita."
+
+#, python-format
+msgid "Option accountbanner in section %s only supports values in %s"
+msgstr ""
+
+#, python-format
+msgid "Option trustjobsize for printer %s is incorrect"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Printers"
+msgstr ""
+
+msgid "Users Print Quotas"
+msgstr ""
+
+msgid "Users Groups Print Quotas"
+msgstr ""
+
+msgid "History of Payments"
+msgstr ""
+
+msgid "Printers Groups Membership"
+msgstr ""
+
+msgid "Users Groups Membership"
+msgstr ""
+
+msgid "Comma Separated Values"
+msgstr ""
+
+msgid "Semicolon Separated Values"
+msgstr ""
+
+msgid "Tabulation Separated Values"
+msgstr ""
+
+msgid "eXtensible Markup Language"
+msgstr ""
+
+msgid "CUPS' page_log"
+msgstr ""
+
+#, python-format
+msgid "Invalid filter value [%s], see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --data command line option, see help."
+msgstr ""
+
+#, python-format
+msgid "Invalid modifier [%s] for --format command line option, see help."
+msgstr ""
+
+msgid "XML output is disabled because the jaxml module is not available."
+msgstr ""
+
+msgid "PyKota data dumper failed : I/O error"
+msgstr ""
+
+#, python-format
+msgid "Unsupported logging subsystem %s"
+msgstr "Sottosistema di logging %s non supportato"
+
+#, python-format
+msgid "Report for %s quota on printer %s"
+msgstr "Report per la quota di %s sulla stampante %s"
+
+#, python-format
+msgid "Pages grace time: %i days"
+msgstr "Tempo di grace per pagine: %i giorni"
+
+#, python-format
+msgid "Price per job: %.3f"
+msgstr "Prezzo per stampa : %.3f"
+
+#, python-format
+msgid "Price per page: %.3f"
+msgstr "Prezzo per pagina: %.3f"
+
+msgid ""
+"Group          overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid ""
+"User           overcharge   used    soft    hard    balance grace         "
+"total       paid warn"
+msgstr ""
+
+msgid "unknown"
+msgstr "sconosciuto"
+
+#, python-format
+msgid "Real : %s"
+msgstr "Reale : %s"
+
+#, python-format
+msgid "Total : %9i"
+msgstr "Totale : %9i"
+
+msgid "N/A"
+msgstr ""
+
+#, python-format
+msgid "Unsupported reporter backend %s"
+msgstr "Reporter backend non supportato %s"
+
+#, python-format
+msgid "Unsupported quota storage backend %s"
+msgstr "Storage delle quote non supportato %s"
+
+#, python-format
+msgid "Strange problem with uid(%s) : %s"
+msgstr ""
+
+#, python-format
+msgid "Running as user '%s'."
+msgstr ""
+
+msgid "No user named 'pykota'. Not dropping priviledges."
+msgstr ""
+
+#, python-format
+msgid "Impossible to drop priviledges : %s"
+msgstr ""
+
+msgid "Priviledges dropped. Now running as user 'pykota'."
+msgstr ""
+
+#, python-format
+msgid "Impossible to regain priviledges : %s"
+msgstr ""
+
+msgid "Regained priviledges. Now running as root."
+msgstr ""
+
+#, python-format
+msgid "Impossible to connect to SMTP server : %s"
+msgstr "Impossibile connettersi al server SMTP : %s"
+
+#, python-format
+msgid "Impossible to send mail to %s, error %s : %s"
+msgstr "Impossibile inviare la mail a %s, errore %s : %s"
+
+#, python-format
+msgid ""
+"\n"
+"\n"
+"Please contact your system administrator :\n"
+"\n"
+"\t%s - <%s>\n"
+msgstr ""
+"\n"
+"\n"
+"Prego contattare il proprio amministratore di sistema :\n"
+"\n"
+"\t%s - <%s>\n"
+
+#, python-format
+msgid "Unable to match user %s on printer %s, applying default policy (%s)"
+msgstr ""
+"Impossibile trovare l'utente %s sulla stampante %s, verr�pplicata la "
+"policy di default (%s)"
+
+#, python-format
+msgid ""
+"Unable to find user %s's account balance, applying default policy (%s) for "
+"printer %s"
+msgstr ""
+"Impossibile trovare il bilancio dell'account utente %s, verr�pplicata la "
+"policy di default (%s) per la stampante %s"
+
+#, python-format
+msgid "User %s will not be charged for printing."
+msgstr ""
+
+#, python-format
+msgid "Print Quota exceeded for group %s on printer %s"
+msgstr "Quota di stampa superata per il gruppo %s sulla stampante %s"
+
+msgid "Print Quota"
+msgstr "Quota di stampa"
+
+msgid "Print Quota Exceeded"
+msgstr "Quota di stampa superata"
+
+#, python-format
+msgid "Print Quota low for group %s on printer %s"
+msgstr "Quota di stampa in esaurimento per il gruppo %s sulla stampante %s"
+
+#, python-format
+msgid "Print Quota exceeded for user %s on printer %s"
+msgstr "Quota di stampa superata per l'utente %s sulla stampante %s"
+
+#, python-format
+msgid "Print Quota low for user %s on printer %s"
+msgstr "Quota di stampa in esaurimento per l'utente %s sulla stampante %s"
+
+msgid "Print Quota Low"
+msgstr "Quota di stampa in esaurimento"
+
+#, python-format
+msgid "Printing system %s, args=%s"
+msgstr "Sistema di stampa %s, args=%s"
+
+#, python-format
+msgid "Unable to precompute the job's size with the generic PDL analyzer : %s"
+msgstr ""
+"Impossibile precalcolare la dimensione della stampa con il modulo PDL "
+"generico: %s"
+
+#, python-format
+msgid "SIGTERM received, job %s cancelled."
+msgstr "Segnale SIGTERM ricevuto, stampa %s cancellata."
+
+msgid "Printer hostname undefined, set to 'localhost'"
+msgstr "Nome host della stampante non definito, impostato a 'localhost'"
+
+#, python-format
+msgid "Printing system unknown, args=%s"
+msgstr "Sistema di stampa sconosciuto, args=%s"
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying external policy (%"
+"s) for printer %s"
+msgstr ""
+"La stampante %s non �egistrata all'interno del sistema PyKota, verr�
+"utilizzata la policy esterna (%s)per la stampante %s"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying external policy (%s) "
+"for printer %s"
+msgstr ""
+"L'utente %s non �egistrato all'interno del sistema PyKota, verr�
+"utilizzata la policy esterna (%s) per la stampante %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"external policy (%s) for printer %s"
+msgstr ""
+"L'utente %s non possiede una quota sulla stampante %s all'interno di PyKota, "
+"verr�sata la policy esterna (%s) per la stampante %s"
+
+#, python-format
+msgid ""
+"External policy %s for printer %s produced an error. Job rejected. Please "
+"check PyKota's configuration files."
+msgstr ""
+"La policy esterna %s per la stampante %s ha causato un errore. Stampa "
+"annullata. Si verifichinoi file di configurazione di PyKota."
+
+#, python-format
+msgid ""
+"Printer %s not registered in the PyKota system, applying default policy (%s)"
+msgstr ""
+"Stampante %s non presente nel sistema PyKota, verr�tilizzata la policy di "
+"default (%s)"
+
+#, python-format
+msgid ""
+"User %s not registered in the PyKota system, applying default policy (%s) "
+"for printer %s"
+msgstr ""
+"Utente %s non ancora presente nel sistema PyKota, verr�tilizzata una "
+"policty di default (%s) per la stampante %s"
+
+#, python-format
+msgid ""
+"User %s doesn't have quota on printer %s in the PyKota system, applying "
+"default policy (%s)"
+msgstr ""
+"Utente %s non possiede una quota sulla stampante %s nel sistema PyKota, "
+"verr�tilizzata la policy di default (%s)"
+
+#, python-format
+msgid ""
+"Printer %s still not registered in the PyKota system, job will be rejected"
+msgstr ""
+"Stampante %s non ancora presente nel sistema PyKota, la stampa verr�
+"rifiutata"
+
+#, python-format
+msgid ""
+"User %s still not registered in the PyKota system, job will be rejected on "
+"printer %s"
+msgstr ""
+"Utente %s non ancora presente nel sistema PyKota, la stampa verr�ifiutata "
+"sulla stampante %s"
+
+#, python-format
+msgid ""
+"User %s still doesn't have quota on printer %s in the PyKota system, job "
+"will be rejected"
+msgstr ""
+"L'utente %s non ha alcuna quota impostata sulla stampante %s all'interno di "
+"Pykota, la stampa verr�ifiutata"
+
+#, python-format
+msgid "A problem occured while reading printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Retrieving printer %s's page counter from database instead."
+msgstr ""
+
+#, python-format
+msgid ""
+"Couldn't retrieve printer %s's internal page counter either before or after "
+"printing."
+msgstr ""
+
+#, python-format
+msgid "Job's size forced to 1 page for printer %s."
+msgstr ""
+
+#, python-format
+msgid "No previous job in database for printer %s."
+msgstr ""
+
+#, python-format
+msgid "Inconsistent values for printer %s's internal page counter."
+msgstr ""
+
+#, python-format
+msgid "Unknown printer address in HARDWARE(%s) for printer %s"
+msgstr "Indirizzo stampante sconosciuto per HARDWARE(%s) per la stampante %s"
+
+#, python-format
+msgid "Launching HARDWARE(%s)..."
+msgstr "Avvio HARDWARE(%s)..."
+
+#, python-format
+msgid "SIGTERM was sent to hardware accounter %s (pid: %s)"
+msgstr "SIGTERM inviato al contatore hardware %s (pid: %s)"
+
+#, python-format
+msgid "Line [%s] skipped in accounter's output. Trying again..."
+msgstr ""
+
+#, python-format
+msgid "Hardware accounter %s exit code is %s"
+msgstr ""
+
+#, python-format
+msgid "Unable to query printer %s via HARDWARE(%s)"
+msgstr "Impossibile ottenere informazioni dalla stampante %s via HARDWARE(%s)"
+
+#, python-format
+msgid "Problem during connection to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem while sending PJL query to %s:%s : %s"
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s to be printing..."
+msgstr ""
+
+#, python-format
+msgid "Waiting for printer %s's idle status to stabilize..."
+msgstr ""
+
+#, python-format
+msgid ""
+"PJL querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Network error while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "SNMP message decoding error for printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid "Problem encountered while doing SNMP queries on printer %s : %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"SNMP querying stage interrupted. Using latest value seen for internal page "
+"counter (%s) on printer %s."
+msgstr ""
+
+#, python-format
+msgid "Launching SOFTWARE(%s)..."
+msgstr "Avvio SOFTWARE(%s)..."
+
+#, python-format
+msgid "Unable to compute job size with accounter %s"
+msgstr "Impossibile calcolare la dimensione della stampa con il metodo %s"
+
+#, python-format
+msgid "Problem while waiting for software accounter pid %s to exit : %s"
+msgstr ""
+"Errore durante l'attesa della terminzaione del contatore software con pid %"
+"s: %s"
+
+#, python-format
+msgid "Software accounter %s exit code is %s"
+msgstr "Contatore software %s terminato con codice %s"
+
+msgid "Totals may be inaccurate if some users are members of several groups."
+msgstr ""
+"Le somme potranno non essere accurate se alcuni utenti fanno parte di pi�gruppi"
+
+#, python-format
+msgid ""
+"Search base %s doesn't seem to exist. Probable misconfiguration. Please "
+"double check /etc/pykota/pykota.conf : %s"
+msgstr ""
+"La base di ricerca %s non sembra esistere. Possibile errore di "
+"configurazione.Si verifichi il file /etc/pykota/pykota.conf : %s"
+
+#, python-format
+msgid "Search for %s(%s) from %s(scope=%s) returned no answer."
+msgstr "La ricerca di %s(%s) da %s(scope=%s) non ha ottenuto risultati."
+
+#, python-format
+msgid "Problem adding LDAP entry (%s, %s)"
+msgstr "Errore avvenuto aggiungendo la entry LDAP (%s, %s)"
+
+#, python-format
+msgid "Problem deleting LDAP entry (%s)"
+msgstr "Errore avvenuto cancellando la entry LDAP (%s)"
+
+#, python-format
+msgid "Problem modifying LDAP entry (%s, %s)"
+msgstr "Errore avvenuto durante la modifica della entry LDAP (%s, %s)"
+
+#, python-format
+msgid ""
+"No pykotaAccountBalance object found for user %s. Did you create LDAP "
+"entries manually ?"
+msgstr ""
+
+#, python-format
+msgid ""
+"Unable to find an existing objectClass %s entry with %s=%s to attach "
+"pykotaAccount objectClass"
+msgstr ""
+"Impossibile trovare un una entry con objectClass %s esistente con %s=%s a "
+"cui aggiungere pykotaAccount objectClass"
+
+#, python-format
+msgid "%s. A new entry will be created instead."
+msgstr ""
+
+#, python-format
+msgid "Unable to find an existing entry to attach pykotaGroup objectclass %s"
+msgstr ""
+"Impossibile trovare una entry esistente a cui aggiungere objectclass "
+"pykotaGroup %s"
+
+msgid "Hidden because of privacy concerns"
+msgstr ""
+
+#~ msgid ""
+#~ "Group           used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "Gruppo          usato   soft    hard    balance grace         totale      "
+#~ "pagato"
+
+#~ msgid ""
+#~ "User            used    soft    hard    balance grace         total       "
+#~ "paid"
+#~ msgstr ""
+#~ "User            usato   soft    hard    balance grace         totale      "
+#~ "pagato"
Index: pykota/tags/1.22/po/README
===================================================================
--- pykota/tags/1.22/po/README (revision 2146)
+++ pykota/tags/1.22/po/README (revision 2146)
@@ -0,0 +1,27 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains the different translations available
+for PyKota tools.
+
+Please send me your own translations in other languages.
+
+====================================================================
Index: pykota/tags/1.22/po/genmo.sh
===================================================================
--- pykota/tags/1.22/po/genmo.sh (revision 2146)
+++ pykota/tags/1.22/po/genmo.sh (revision 2146)
@@ -0,0 +1,29 @@
+#! /bin/sh
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# You're welcome to redistribute this software under the
+# terms of the GNU General Public Licence version 2.0
+# or, at your option, any higher version.
+#
+# You can read the complete GNU GPL in the file COPYING
+# which should come along with this software, or visit
+# the Free Software Foundation's WEB site http://www.fsf.org
+#
+# $Id$
+#
+for dir in * ; do 
+    if [ -d $dir ] ; then
+        if [ -e $dir/pykota.po ] ; then
+            echo -n $dir ;
+            cd $dir ;
+            chmod 644 *.?o ;
+            msgmerge --no-location --no-fuzzy-matching --output-file=pykota.po.new pykota.po ../pykota.pot ;
+            mv pykota.po.new pykota.po ;
+            rm pykota.mo ;
+            msgfmt -o pykota.mo pykota.po ;
+            cd .. ;
+        fi ;    
+    fi ;     
+done
Index: pykota/tags/1.22/checkdeps.py
===================================================================
--- pykota/tags/1.22/checkdeps.py (revision 2147)
+++ pykota/tags/1.22/checkdeps.py (revision 2147)
@@ -0,0 +1,90 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+
+def checkModule(module) :
+    """Checks if a Python module is available or not."""
+    try :
+        exec "import %s" % module
+    except ImportError :    
+        return 0
+    else :    
+        return 1
+        
+def checkCommand(command) :
+    """Checks if a command is available or not."""
+    input = os.popen("type %s 2>/dev/null" % command)
+    result = input.read().strip()
+    input.close()
+    return result
+    
+def checkWithPrompt(prompt, module=None, command=None, helper=None) :
+    """Tells the user what will be checked, and asks him what to do if something is absent."""
+    sys.stdout.write("Checking for %s availability : " % prompt)
+    sys.stdout.flush()
+    if command is not None :
+        result = checkCommand(command)
+    elif module is not None :    
+        result = checkModule(module)
+    if result :    
+        sys.stdout.write("OK\n")
+    else :    
+        sys.stdout.write("NO.\n")
+        sys.stderr.write("ERROR : %s not available !\n" % prompt)
+        sys.stdout.write("%s\n" % helper)
+    
+if __name__ == "__main__" :    
+    print "Checking PyKota dependencies..."
+    
+    # checks if Python version is correct, we need >= 2.1
+    if not (sys.version > "2.1") :
+        sys.stderr.write("PyKota needs at least Python v2.1 !\nYour version seems to be older than that, please update.\nAborted !\n")
+        sys.exit(-1)
+        
+    # checks if some needed Python modules are there or not.
+    modulestocheck = [ ("Python-PygreSQL", "pg", "PygreSQL is mandatory if you want to use PostgreSQL as the quota storage backend.\nSee http://www.pygresql.org"),
+                       ("Python-egenix-mxDateTime", "mx.DateTime", "eGenix' mxDateTime is mandatory for PyKota to work.\nSee http://www.egenix.com"),
+                       ("Python-LDAP", "ldap", "Python-LDAP is mandatory if you plan to use an LDAP\ndirectory as the quota storage backend.\nSee http://python-ldap.sf.net"),
+                       ("Python-OSD", "pyosd", "Python-OSD is recommended if you plan to use the X Window On Screen Display\nprint quota reminder named pykosd."),
+                       ("Python-SNMP", "pysnmp", "Python-SNMP is recommended if you plan to use hardware\naccounting with printers which support SNMP.\nSee http://pysnmp.sf.net"),
+                       ("Python-JAXML", "jaxml", "Python-JAXML is recommended if you plan to dump datas in the XML format.\nSee http://www.librelogiciel.com/software/"),
+                       ("Python-ReportLab", "reportlab.pdfgen.canvas", "Python-ReportLab is required if you plan to have PyKota generate banners.\nSee http://www.reportlab.org/"),
+                       ("Python-Imaging", "PIL.Image", "Python-Imaging is required if you plan to have PyKota generate banners.\nSee http://www.pythonware.com/downloads/"),
+                       ("Python-Psyco", "psyco", "Python-Psyco speedups parsing of print files, you should use it.\nSee http://psyco.sourceforge.net/"),
+                     ]
+    commandstocheck = [ ("GhostScript", "gs", "Depending on your configuration, GhostScript may be needed in different parts of PyKota."),
+                        ("SNMP Tools", "snmpget", "SNMP Tools are needed if you want to use SNMP enabled printers."), 
+                        ("Netatalk", "pap", "Netatalk is needed if you want to use AppleTalk enabled printers.")
+                      ]
+    for (name, module, helper) in modulestocheck :
+        checkWithPrompt(name, module=module, helper=helper)
+            
+    # checks if some software are there or not.
+    for (name, command, helper) in commandstocheck :
+        checkWithPrompt(name, command=command, helper=helper)
+            
Index: pykota/tags/1.22/contributed/pagecount.pl
===================================================================
--- pykota/tags/1.22/contributed/pagecount.pl (revision 2147)
+++ pykota/tags/1.22/contributed/pagecount.pl (revision 2147)
@@ -0,0 +1,83 @@
+#!/usr/bin/perl -U
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+############################################################
+#                                                          #
+# This script is 100% copyright (c) 2003 Ren�und Jensen  #
+#                                                          #
+# He contributed it to the PyKota project on Dec. 4th 2003 #
+# and licensed it under the terms of the GNU GPL.          #
+#                                                          #
+# MANY THANKS TO HIM                                       #
+#                                                          #
+############################################################
+#
+#
+# $Id$
+#
+#
+
+use Socket;
+use IO::Socket;
+
+if (@ARGV < 2){
+    print "usage: pagecount.pl servername port\n";
+}
+
+$printer = @ARGV[0];
+$port    = @ARGV[1];
+
+$ssh = osocket($printer, $port);
+if ($ssh){
+    $page = pagecount($ssh);
+    print $page."\n";
+    $ssh-close();
+    exit(0);
+}else {
+    exit(1);
+}
+
+sub pagecount {
+    my $sh = @_[0];    # Get sockethandle
+    # send pagequery to sockethandle
+    send($sh, "\033%-12345X\@PJL INFO PAGECOUNT\r\n",0);
+    # Read response from sockethandle
+    recv($sh,$RESPONSE,0xFFFFF,0);
+    (my $junk,$pc) = split (/\r\n/s,$RESPONSE); # Find the pagecount
+    $pc =~ s/(PAGECOUNT=)?([0-9]+)/$2/g;
+    return $pc;                                 # Return pagecount
+}
+
+
+sub osocket {
+
+ # Connecting to @_[0] = @arg[1] = $printer
+ # On port @_[1] = 9100 JetDirect port
+ # Using TCP protocol
+    my $sh= new IO::Socket::INET(PeerAddr => @_[0],
+                                 PeerPort => @_[1], 
+                                 Proto => 'tcp');
+    if (!defined($sh)) {        # Did we open the socket?
+        return undef;           # No! return undef
+    } else {                    # Yes!
+        $sh->sockopt(SO_KEEPALIVE,1);   # Set socket option SO_KEEPALIVE
+        return $sh;             # return sockethandle
+    }
+}
Index: pykota/tags/1.22/contributed/Makefile.am
===================================================================
--- pykota/tags/1.22/contributed/Makefile.am (revision 2146)
+++ pykota/tags/1.22/contributed/Makefile.am (revision 2146)
@@ -0,0 +1,7 @@
+pykotacontribdir = $(datadir)/doc/pykota/contributed
+pykotacontrib_DATA = 	\
+	pagecount.pl		\
+	README
+
+EXTRA_DIST = \
+	$(pykotacontrib_DATA)
Index: pykota/tags/1.22/contributed/README
===================================================================
--- pykota/tags/1.22/contributed/README (revision 2146)
+++ pykota/tags/1.22/contributed/README (revision 2146)
@@ -0,0 +1,28 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains scripts or informations contributed to PyKota.
+See each file's contents for credits and copyrights.
+
+Each file there is copyrighted by its author, and licensed under the
+GNU General Public License.
+
+====================================================================
Index: pykota/tags/1.22/LICENSE
===================================================================
--- pykota/tags/1.22/LICENSE (revision 2146)
+++ pykota/tags/1.22/LICENSE (revision 2146)
@@ -0,0 +1,105 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+Download :
+
+  * PyKota is distributed under the "GNU General Public License":/GPL
+
+  * You can access to PyKota's source code by using SubVersion (aka SVN) :
+  
+      $ svn co svn://svn.librelogiciel.com/pykota/trunk pykota
+
+  * Clients who purchased an **Official PyKota Package** can directly access to "the tarballs HERE":
+http://www.librelogiciel.com/software/PyKota/tarballs .
+               
+Why no tarball is available for free :
+
+  * The SVN version will always be labelled as **unofficial** and the word **unofficial**
+    will appear whenever you run PyKota command line tools with the *--version* command line
+    argument.
+
+  * I ask you to not label or present a version of PyKota downloaded 
+    from SVN as being the 'OFFICIAL' one. 
+
+  * I encourage you to buy an 'OFFICIAL' PyKota package. See below for 
+    the benefits of doing so. 
+
+  * A PyKota version obtained either from SVN (unofficial) or by 
+    purchasing an official package, **IS FREELY REDISTRIBUTABLE AND 
+    MODIFIABLE, AT NO COST, UNDER THE TERMS OF THE GNU GENERAL PUBLIC 
+    LICENSE.** 
+
+  * Version number excepted, **THERE'S NO SOURCE CODE DIFFERENCE 
+    BETWEEN 'OFFICIAL' AND 'UNOFFICIAL' VERSIONS OF PyKota.** However it 
+    should be clear to you that the latest version you can find in SVN 
+    may be somewhat unstable or unfinished, since this software is a 
+    work in progress, and that it's up to you to download working 
+    revisions from the SVN tree. That's why I suggest that you purchase 
+    an **'OFFICIAL'** version, because it will be simpler for you (and 
+    better for me). Also the documentation included in the 
+    **'UNOFFICIAL'** version is only delivered in DocBook XML/SGML 
+    source form, and not in compiled forms like HTML or PDF. 
+
+  * You can obtain an **'OFFICIAL'** version of PyKota in two forms :
+
+    * Electronic form :
+
+      * You pay me any amount of money starting at **20$ (US Dollars)**
+
+      * Then I send you the latest **PyKota 'OFFICIAL'** tarball, 
+        including the latest version of the electronic documentation in 
+        SGML, HTML and PDF formats, by email. 
+
+    * CDROM + Paper documentation *(not yet available, documentation 
+      still under works)* : 
+
+      * You pay me any amount of money starting at **30$ (US Dollars)**
+
+      * Then I send you the latest **PyKota 'OFFICIAL'** tarball, 
+        including the latest version of the electronic documentation in 
+        SGML, HTML and PDF formats, on CDROM, accompanied with the latest 
+        version of the printed documentation. No additionnal shipping costs 
+        will be asked to you, unless you require a specific delivery mode. 
+
+  * The "purchase":/software/PyKota/Purchase of an **'OFFICIAL'** 
+    version also allows you to : 
+
+    * Modify or redistribute the **'OFFICIAL'** version you purchased, 
+      under the terms of the GNU General Public License of the Free 
+      Software Foundation. I just ask you to remove the 'OFFICIAL' word 
+      from the version number if you redistribute a modified official 
+      version. 
+
+    * Obtain free technical support for a year starting at your purchase 
+      date : This includes bug fixes and new official versions, as well as 
+      priority email support. 
+
+    * Obtain half of **your money back** in case you contribute source 
+      code or documentation which I accept in the source tree. If you're a 
+      motivated developper, you've got strong chances to get half of your 
+      money back. *NB : You will have to send me a signed copyright 
+      assignment on paper in order for me to be able to accept your 
+      patches on PyKota.* 
+
+    * By purchasing an official package, your karma will also be better.
+
+I sincerely hope that you will find this proposition as fair as I do 
+think it is. 
+
Index: pykota/tags/1.22/logos/README
===================================================================
--- pykota/tags/1.22/logos/README (revision 2146)
+++ pykota/tags/1.22/logos/README (revision 2146)
@@ -0,0 +1,42 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains the PyKota logo in Gimp's xcf format, as
+well as 4-bit/pixel png big (925x925) and small (100x100) versions.
+
+PyKota's logo was drawn by Jo�Collet, I added the text.
+
+IMPORTANT : I ask you to NOT use any image which displays the 
+"OFFICIAL" word on it unless you use or redistribute a complete and 
+unmodified version of a real "PyKota Official" package. 
+    
+If you redistribute a modified version of a real "PyKota Official", 
+or a work based on a modified version of a real "PyKota Official" 
+package, or a version of PyKota directly obtained from the CVS tree, 
+please use the images which don't display the word "OFFICIAL". 
+
+Both sets of images are included in this directory, please use the 
+one which correctly describes the software you redistribute or base 
+your work on. 
+
+Thanks in advance.
+
+====================================================================
Index: pykota/tags/1.22/configure.in
===================================================================
--- pykota/tags/1.22/configure.in (revision 2146)
+++ pykota/tags/1.22/configure.in (revision 2146)
@@ -0,0 +1,43 @@
+AC_INIT(pykota/tool.py)
+
+AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE(pykota, 1.18alpha14_unofficial)
+
+AM_MAINTAINER_MODE
+
+
+dnl check for python
+dnl AM_PATH_PYTHON(2.2)
+AM_PATH_PYTHON
+
+
+GETTEXT_PACKAGE=pykota
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package])
+AM_GNU_GETTEXT
+AM_GNU_GETTEXT_VERSION(0.12.1)
+AM_PO_SUBDIRS(po)
+
+AC_OUTPUT([
+intl/Makefile 
+Makefile
+pykota/Makefile
+pykota/accounters/Makefile
+pykota/loggers/Makefile
+pykota/reporters/Makefile
+pykota/requesters/Makefile
+pykota/storages/Makefile
+bin/Makefile
+untested/Makefile
+untested/netatalk/Makefile
+untested/parallel/Makefile
+untested/pjl/Makefile
+untested/postscript/Makefile
+conf/Makefile
+man/Makefile
+openoffice/Makefile
+initscripts/Makefile
+initscripts/ldap/Makefile
+initscripts/postgresql/Makefile
+po/Makefile.in
+])
Index: pykota/tags/1.22/setup.py
===================================================================
--- pykota/tags/1.22/setup.py (revision 2175)
+++ pykota/tags/1.22/setup.py (revision 2175)
@@ -0,0 +1,104 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import glob
+import os
+import shutil
+try :
+    from distutils.core import setup
+except ImportError, msg :    
+    sys.stderr.write("%s\n" % msg)
+    sys.stderr.write("You need the DistUtils Python module.\nunder Debian, you may have to install the python-dev package.\nOf course, YMMV.\n")
+    sys.exit(-1)
+
+sys.path.insert(0, "pykota")
+from pykota.version import __version__, __doc__
+
+data_files = []
+mofiles = glob.glob(os.sep.join(["po", "*", "*.mo"]))
+for mofile in mofiles :
+    lang = mofile.split(os.sep)[1]
+    directory = os.sep.join(["share", "locale", lang, "LC_MESSAGES"])
+    data_files.append((directory, [ mofile ]))
+    
+docdir = "share/doc/pykota"    
+docfiles = ["README", "FAQ", "SECURITY", "COPYING", "LICENSE", "CREDITS", "TODO", "NEWS"]
+data_files.append((docdir, docfiles))
+
+docfiles = glob.glob(os.sep.join(["docs", "*.pdf"]))
+docfiles += glob.glob(os.sep.join(["docs", "*.sx?"]))
+data_files.append((docdir, docfiles))
+
+docfiles = glob.glob(os.sep.join(["docs", "spanish", "*.pdf"]))
+docfiles += glob.glob(os.sep.join(["docs", "spanish", "*.sxw"]))
+data_files.append((os.path.join(docdir, "spanish"), docfiles))
+
+docfiles = glob.glob(os.sep.join(["docs", "pykota", "*.html"]))
+data_files.append((os.path.join(docdir, "html"), docfiles))
+
+docfiles = glob.glob(os.sep.join(["openoffice", "*.sx?"]))
+docfiles += glob.glob(os.sep.join(["openoffice", "*.png"]))
+docfiles += glob.glob(os.sep.join(["openoffice", "README"]))
+data_files.append((os.path.join(docdir, "openoffice"), docfiles))
+
+data_files.append((os.path.join(docdir, "postgresql"), ["initscripts/postgresql/README.postgresql"]))
+data_files.append((os.path.join(docdir, "ldap"), ["initscripts/ldap/README.ldap"]))
+
+directory = os.sep.join(["share", "man", "man1"])
+manpages = glob.glob(os.sep.join(["man", "*.1"]))    
+data_files.append((directory, manpages))
+
+modirs = [ os.path.split(os.path.split(mof)[0])[1] for mof in mofiles ]
+for dir in modirs :
+    directory = os.sep.join(["share", "man", dir, "man1"])
+    manpages = glob.glob(os.sep.join(["man", dir, "*.1"]))    
+    data_files.append((directory, manpages))
+
+directory = os.sep.join(["share", "pykota"])
+data_files.append((directory, ["checkdeps.py", "bin/cupspykota", "bin/lprngpykota", "bin/waitprinter.sh", "bin/papwaitprinter.sh", "bin/mailandpopup.sh", "contributed/pagecount.pl", "untested/pjl/pagecount.pjl", "untested/pjl/status.pjl", "untested/netatalk/netatalk.sh", "untested/netatalk/pagecount.ps"]))
+
+data_files.append((os.sep.join([directory, "conf"]), ["conf/README", "conf/pykota.conf.sample", "conf/pykotadmin.conf.sample"]))
+
+data_files.append((os.sep.join([directory, "cgi-bin"]), ["cgi-bin/README", "cgi-bin/printquota.cgi", "cgi-bin/dumpykota.cgi", "cgi-bin/pykotme.cgi"]))
+
+data_files.append((os.sep.join([directory, "logos"]), glob.glob(os.sep.join(["logos", "*.jpeg"])) + glob.glob(os.sep.join(["logos", "*.png"])) + glob.glob(os.sep.join(["logos", "*.xcf"]))))
+
+pgdirectory = os.sep.join([directory, "postgresql"])
+data_files.append((pgdirectory, ["initscripts/postgresql/README.postgresql", "initscripts/postgresql/pykota-postgresql.sql"]))
+
+ldapdirectory = os.sep.join([directory, "ldap"])
+data_files.append((ldapdirectory, ["initscripts/ldap/README.ldap", "initscripts/ldap/pykota.schema", "initscripts/ldap/pykota-sample.ldif"]))
+
+setup(name = "pykota", version = __version__,
+      license = "GNU GPL",
+      description = __doc__,
+      author = "Jerome Alet",
+      author_email = "alet@librelogiciel.com",
+      url = "http://www.librelogiciel.com/software/",
+      packages = [ "pykota", "pykota.storages", "pykota.loggers", "pykota.accounters", "pykota.reporters" ],
+      scripts = [ "bin/pkmail", "bin/pkbanner", "bin/autopykota", "bin/dumpykota", "bin/pkpgcounter", "bin/snmpprinterstatus", "bin/pykosd", "bin/edpykota", "bin/repykota", "bin/warnpykota", "bin/pykotme", "bin/pkprinters", "bin/pkhint" ],
+      data_files = data_files)
Index: pykota/tags/1.22/clean.sh
===================================================================
--- pykota/tags/1.22/clean.sh (revision 2146)
+++ pykota/tags/1.22/clean.sh (revision 2146)
@@ -0,0 +1,36 @@
+#! /bin/sh
+#
+# PyKota
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+# Use this to clean the tree from temporary files
+
+find . -name "*.bak" -exec rm -f {} \;
+find . -name "*~" -exec rm -f {} \;
+find . -name "*.pyc" -exec rm -f {} \;
+find . -name "*.pyo" -exec rm -f {} \;
+find . -name "*.jem" -exec rm -f {} \;
+find docs -name "*.html" -exec rm -f {} \;
+find docs -name "*.pdf" -exec rm -f {} \;
+find docs -name "*.tex" -exec rm -f {} \;
+find docs -name "*.dvi" -exec rm -f {} \;
+rm -fr debian/tmp/
+rm -fr docs/pykota/ docs/pykota.junk/
Index: pykota/tags/1.22/README
===================================================================
--- pykota/tags/1.22/README (revision 2234)
+++ pykota/tags/1.22/README (revision 2234)
@@ -0,0 +1,718 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+READ SPECIAL LICENSING AND REDISTRIBUTION TERMS IN THE FILE 'LICENSE'
+
+====================================================================
+
+PyKota features :
+-----------------
+
+    Free Software :
+    
+        - Licensed under the terms of the GNU General Public License.
+        
+    Commercially Supported :    
+    
+        - Support Contracts are available from http://www.librelogiciel.com/techsupport/
+        
+    Operating systems :
+    
+        - Any Unix-like system as print server.
+            
+        - Any operating system as client.
+            
+    Printing systems :
+    
+        - Supports both CUPS and LPRng as the printing system.
+        
+    Databases :
+    
+        - Supports PostgreSQL as the Quota Storage backend.
+          Complete database creation script in SQL is included.
+        
+        - Supports any LDAP server as the Quota Storage backend.
+          Complete LDAP schema and sample empty tree are included.
+          Plugging PyKota into your existing LDAP infrastructure
+          is really easy thanks to PyKota's great configurability.
+          
+        - The print jobs history can be stored in any database  
+          of your choice (or in plain text files) if needed. 
+            
+    Printers :        
+    
+        - Hardware or Software accounting methods are completely
+          configurable.
+          
+        - Supports any printer which can report its internal
+          page counter. Can ask printers for their internal 
+          page counter via SNMP, Netatalk, PJL, PS, or any 
+          other way.
+          This is completely configurable.
+          
+        - Supports DSC compliant and binary PostScript, PDF, PCL5 (up to), 
+          PCLXL (aka PCL6) and ESC/P2 printers natively for software
+          accounting methods. More formats to come.
+            
+    Quota systems :        
+    
+        - Supports printers and printers groups quotas.
+        
+        - Supports users and users groups quotas.
+        
+        - Supports page quotas.
+          Page quotas can be set differently on a per printer
+          and per user/group basis.
+        
+        - Supports account balance quotas in any currency.
+          Account balance quotas can be set on a per user 
+          basis. The account balance is shared amongst
+          all printers. The history of payments (positive
+          or negative credits to an user account) is kept.
+          
+        - Supports high granularity periodic print quotas : down
+          to one minute intervals if needed.
+        
+        - Page quotas and account balance can be set/reset
+          independantly.
+          
+        - Page quotas can be set on a per user or per group basis
+          for a particular printer.
+          
+        - Price per page and per job can be set differently  
+          on any printer.
+        
+        - Low level of page quota or account balance are
+          configurable.
+          
+        - Both soft and hard limit with configurable grace delay  
+          can be set for page quota.
+          
+        - Possibility to disable quota enforcement for any user
+          or group, while still keeping page accounting.
+          
+        - Each user can have an overcharging (or undercharging) factor,  
+          which is applied whenever PyKota computes the cost of a 
+          print job.
+          
+    Administration :        
+    
+        - Powerful delegation of administrative priviledges.
+        
+        - Powerful administration tools can be used to
+          automate setting or resetting of quotas or
+          account balances at specific intervals.
+          
+        - Administration tools can modify several users,  
+          groups, or printers at once with the use of
+          powerful wildcard characters.
+          
+        - Account balances can be set, incremented, or  
+          decremented. History of payments is kept.
+          
+        - Number of pages used can be set, incremented, or  
+          decremented.
+          
+        - Both printers and users can be automatically added on 
+          first print in a completely configurable way.
+          
+        - Quota report generator available either from the  
+          command line or in any web browser.
+          The web-based quota report generator can be 
+          user/password protected.
+          
+        - Print quote generator can tell users how much  
+          a print job will cost them in advance.
+          
+        - Policy with regard to unregistered users can   
+          be configured for each printer to either deny
+          printing, allow printing, or delegate the
+          decision to any external tool.
+          
+        - Warning and error messages can be automatically  
+          sent via email or via any other mean to the administrator, 
+          the user, both, or none.
+          
+        - Warning and error messages' content is completely 
+          configurable.
+          
+        - Configuration can be changed without needing to  
+          restart the printing system.
+        
+        - Complete print job history is kept. This can be
+          disabled if needed.
+          
+        - Automated low quota or balance remainder can be 
+          scheduled regularly or launched manually.
+          
+        - Starting and Ending personalized dynamic banners can be
+          generated on the fly, and accounted for or not, depending 
+          on some configuration settings.
+          Banners can still be enabled even if the print job is denied.
+          NB : Banners are a CUPS only feature for now.
+          
+        - Duplicate print jobs can be forbidden automatically.  
+          
+        - Powerful data dumper to export datas to other
+          software (spreadsheets for example). Actually
+          supported formats are :
+          
+            - Comma separated values ;
+            
+            - Semicolon separated values ;
+            
+            - Tab separated values ;
+            
+            - XML.
+            
+            - CUPS' page_log format, to easily interface in
+              real time with third party apps like phpPrintAnalyzer
+              and similar tools.
+          
+    User Interface :          
+    
+        - All the command line tools accept the -h | --help 
+          command line option which prints all the available 
+          options and show usage examples.
+          
+        - Completely internationalized. Actually supports the  
+          English, French, Spanish, Portuguese, Brazilian, Swedish,
+          Thai, Greek, German, Italian, Norwegian (Bokm�, Turkish 
+          and traditional Chinese languages. 
+          More to come.
+          
+        - Web enabled print quota monitor, data dumper, and print quote
+          generator.
+        
+        - An On Screen Display X-Window print quota monitor is included.
+        
+        - An email gateway to allow users to retrieve their print quota
+          information by sending an email message to a dedicated address
+          is included.
+        
+        - A cross-platform print quota monitor will soon be available 
+          as an purchaseable add-on.
+          
+        - Third party web based management tools are available.
+
+====================================================================
+        
+Planned features are described in the TODO file.
+
+Actually two (or an infinity of) page accounting methods are
+implemented :
+
+  - The 'hardware' method consists in querying the printer (via SNMP
+    or Netatalk or any other method of your choice) for its total pages 
+    counter.
+    
+    This is done both at the beginning and at the end of a
+    print job. The counters difference is then immediately used to 
+    decrease the user's account balance or increase his quota usage.
+    
+  - The 'software' method consists in delegating the computation of the
+    job's size in number of pages to any external command of your choice.
+    The command can read the job's data from its standard input and MUST
+    output the job's size on its standard output. Changes to the user
+    account are reported immediately. PyKota features an internal
+    software accounting method which handles several Page Description
+    Languages : DSC compliant and binary PostScript, PDF, PCLXL (aka PCL6),
+    PCL3/4/5 and ESC/P2.
+    
+PyKota is known to work fine with most laser printers, either with
+software accounting, or with hardware accounting if the printer
+supports this.
+
+============================================================
+
+SUPPORT CONTRACTS:
+==================
+
+  You can now purchase 8x5x365@NextBusinessDay Technical
+  Support Contracts from us. The yearly fee is computed with  
+  the following formula :
+
+  (100.0 * NbPrintServers) + (2.5 * NbPrinters) + (0.04 * NbUsers) EUROS.
+  
+  This fee includes the VAT, a free subscription to official  
+  PyKota packages, and the latest documentation on paper.
+
+  Please send an email to alet@librelogiciel.com if you're
+  interested in purchasing such a contract.   
+
+  Remember that purchasing a support contract for Free Software like PyKota
+  is a great way to show your appreciation for the work already being done 
+  on this project, and will help to improve this software in the future.
+
+============================================================
+
+INSTALLATION:
+=============
+
+NB :
+====
+
+  You may learn more about PyKota, if it fits your own organization,
+  its internal working, and some potential performance drawbacks and
+  how to avoid them, in a document created by Ryan Suarez at :
+  
+    http://archive.macosxlabs.org/forum/webcrossing_archive/documentation/Pykota_and_CUPS/Pykota_and_CUPS.html
+
+  You may also find the following document interesting :
+  
+    http://es.tldp.org/Tutoriales/doc-openldap-samba-cups-python/
+    
+  This document, written in Spanish by Sergio Gonzalez Gonzalez,  
+  describes the integration of PyKota into an OpenLDAP + Samba
+  + CUPS installation. Even for people who can't read spanish 
+  this document is really interesting, and contains lots of
+  screenshots.
+  
+  Finally, SuSe users may find the following document to best describe
+  how to install PyKota on their favorite distribution. It's a Spanish
+  document written by Dennis Romero :
+  
+    http://www.cvr.espol.edu.ec/people/dennis/Pykota1.19-SuSE9.1.pdf
+  
+  
+Prerequisite : 
+--------------
+   
+  You need to have the following tools installed on the CUPS Server :
+  
+    - CUPS (http://www.cups.org) or LPRng (http://www.lprng.com)
+    - Python v2.1 or above (http://www.python.org)
+    - eGenix' mxDateTime Python extension (http://www.egenix.com)
+    - The JAXML Python module to be able to dump datas in the XML format.
+      (http://www.librelogiciel.com/software/)
+    - The Python-SNMP module to query printers for their page counter.
+      (http://pysnmp.sourceforge.net). 
+      IMPORTANT : version 3.4.3 (or 3.4.2) is REQUIRED. Versions 2.x or
+      4.x won't work for now.
+    - The Python-OSD module to use the graphical print quota reminder.
+      (http://repose.cx/pyosd/)
+    - SNMP tools (specifically the snmpget command) if you prefer to
+      use your own script to request query printers.
+      (http://www.net-snmp.org)
+    - Netatalk (specifically the pap command) if you plan to
+      request your printer's lifetime page counter via AppleTalk.
+      (http://netatalk.sourceforge.net)
+    - The ReportLab Python module (http://www.reportlab.org) if you want  
+      to have PyKota generate nice banners for you.
+    - The Python Imaging Library (aka PIL) module 
+      (http://www.pythonware.com/downloads) if you want to have PyKota 
+      generate nice banners for you.
+    - PostgreSQL's PygreSQL Python extension and the PostgreSQL client
+      libraries if you plan to use PostgreSQL as the Quota Storage
+      backend.
+      (http://www.postgresql.org and http://www.pygreql.org)
+ or     
+    - python-ldap Python module and the OpenLDAP client libraries  
+      if you plan to use an LDAP server as the Quota Storage backend.
+      (http://www.openldap.org and http://python-ldap.sourceforge.net)
+    
+  On Intel i386 architecture, and for performance reasons, it is
+  strongly suggested that you install the Python accelerator Psyco, 
+  available at :
+  
+      http://psyco.sourceforge.net
+      
+  Under Debian :    
+  
+      $ apt-get install python-psyco
+      
+  Other architectures may be supported as well in the future, check    
+  this on Psyco's website.
+  
+  Installing Psyco is not mandatory, but it will speedup PCL5 parsing
+  by almost 3 times. PostScript and PDF parsing can also benefit,
+  but in an almost unnoticeable manner since this part of the code
+  is already optimal. For PCL5 this is a completely different matter,
+  and if you install Psyco you will never regret it !
+  Same remark applies for PCL6 (aka PCLXL) : the parser is completely
+  different, but the performance gain with Psyco is impressive.
+  
+  You may also benefit from having the following tools installed to
+  deal with some printers :
+  
+    - npadmin
+    - netcat
+    - ghostscript
+    
+  You need to have the following tools installed on the Quota Storage  
+  Server :
+  
+    - PostgreSQL (http://www.postgresql.org)
+    
+  or  
+  
+    - OpenLDAP, or any other LDAP server (http://www.openldap.org)
+    
+NB :    
+
+  PygreSQL must be linked with the PostgreSQL client libraries on 
+  the Print Server. The PostgreSQL client libraries' version must 
+  match the PostgreSQL version used on the Quota Storage Server. 
+  
+or  
+
+  python-ldap must be linked with the OpenLDAP client libraries on the 
+  Print Server. The OpenLDAP client libraries' version should match the 
+  OpenLDAP version used on the Quota Storage Server, if applicable.
+  
+  This list of prerequisite software may change in the future, when
+  PyKota will support more functionnalities you will be given 
+  alternatives.
+  
+  Of course the Print Server and the Quota Storage Server can be the 
+  very same machine if you've got a tiny network, or you can have 
+  multiple Print Servers all storing their quotas on the same Quota 
+  Storage Server if you've got a bigger network. 
+  
+Hint :  
+------
+
+  - The Debian GNU/Linux distribution is to our knowledge the 
+    easiest distribution to install PyKota on, because all
+    of PyKota dependencies are already included, excepted
+    for the PySNMP (http://pysnmp.sourceforge.net) module
+    which for now has to be downloaded separately.
+
+Then :   
+------
+ 
+Download the latest PyKota version from the Subversion tree :
+
+    $ svn co svn://svn.librelogiciel.com/pykota/trunk pykota
+
+You can now check if the dependencies are correct by typing :
+
+    $ python checkdeps.py
+    
+    An availability report for all the software needed by PyKota
+    will be displayed : you'll have to install the missing
+    software if you want PyKota to work correctly.
+    
+To install the software, just type :
+
+    $ python setup.py install
+
+You may need to be logged in with sufficient privileges (e.g. root)
+
+Create a system user for PyKota :
+
+    $ adduser --system --group --home /etc/pykota --gecos PyKota pykota
+    
+Put the user your printing system is run as in the pykota system group :
+
+    $ adduser lp pykota
+    
+    NB : on our system, the CUPS printing system runs as system user 'lp'.
+    Please adapt this to your own system.
+
+Go to the initscripts subdirectory of PyKota's sources, and choose
+the appropriate storage backend for your configuration. Read carefully
+the associated README file and execute the initialization script
+to create an empty PyKota Storage. Upgrade scripts may be 
+provided as well.
+
+Copy the conf/pykota.conf.sample and  conf/pykotadmin.conf.sample 
+sample configuration files to /etc/pykota/pykota.conf and 
+/etc/pykota/pykotadmin.conf  
+The installation script usually copies these files into /usr/share/pykota
+
+NB : You can move PyKota's configuration files elsewhere, they will
+be searched first in user pykota's home directory.
+
+You need to adapt these files to your own needs. Especially you may 
+have to create sections named after your own printers, and change 
+the administrator's email address which by default is 
+root@localhost. Read and try to understand these two very well 
+commented files, so that you'll encounter less problems later. 
+
+Also be sure to double check that commands that query printers
+for their internal page counter work from the command line
+before using them in PyKota's configuration.
+
+The rest of the installation depends on your printing system :
+
+  - CUPS Printing System :
+  
+    Once and for all :
+    
+        Create a symbolic link to the cupspykota backend 
+        in CUPS's backend directory :
+        
+          $ cd /usr/lib/cups/backend
+          $ ln -s /usr/share/pykota/cupspykota cupspykota
+          
+        Restart CUPS so that the new backend can be detected.
+        
+          $ /etc/init.d/cupsys restart
+          
+        or :    
+      
+          $ /etc/rc.d/init.d/cupsys restart
+          
+        or any similar command depending on your operating system.  
+          
+    For new printers :
+    
+        Go to CUPS management interface (http://localhost:631) 
+        and choose the appropriate PyKota managed device depending
+        on the type of printer you use. For example, if your
+        printer is waiting on :
+        
+            socket://myprinter.example.com:9100
+            
+        Then choose :    
+        
+            cupspykota:socket://myprinter.example.com:9100
+            
+        Configure your printer as usual.    
+        
+        Now double check /etc/pykota/pykota.conf 
+        
+        You should manually create a section named after the
+        printer you've just added, unless you have set
+        all options globally.
+        
+        The new pkhint command can help you with correct settings 
+        for your printers, but don't rely on it because it is still
+        experimental work. To use pkhint, you have to feed it with
+        CUPS' printers.conf file this way :
+        
+          $ pkhint </etc/cups/printers.conf
+        
+        pkhint will try to tell you what is the best accounting
+        method for each printer and will print some lines you'll
+        just have to copy&paste in the appropriate sections in
+        /etc/pykota/pykota.conf
+        
+        That's all.
+    
+    For existing printers :
+    
+        If you had already installed a version of PyKota earlier 
+        than 1.16alpha7, then remove the *cupsFilter lines in your 
+        PPD files for each already managed printer. Each 
+        line to remove is of the form :
+        
+          *cupsFilter: "application/vnd.cups-postscript 0 /usr/share/pykota/pykota"
+        
+        This means that each time the pstops filter will be executed, it will
+        pass the job's data through the pykota filter which is present in 
+        /usr/share/pykota
+        
+        Don't touch anything else, especially any other *cupsFilter line.
+        Then save each of these files.
+        
+        Then, the easiest is to directly modify the DeviceURI lines 
+        in /etc/cups/printers.conf, you just have to put 
+        'cupspykota:' in front of what is already on these lines. 
+        For example, replace :
+    
+            DeviceURI socket://myprinter.example.com:9100
+        
+        with :    
+    
+            DeviceURI cupspykota:socket://myprinter.example.com:9100
+            
+        or :    
+        
+            DeviceURI cupspykota://socket://myprinter.example.com:9100
+        
+        Save the file and restart CUPS.
+        
+        Here too, you may find it interesting to use the pkhint command as
+        described above to help with manual configuration of the file
+        /etc/pykota/pykota.conf
+
+  - LPRng Printing System :
+  
+    For each printer on which you want to use PyKota :
+    
+        Modify the printer's entry in /etc/printcap : you have to add
+        the three following lines :
+        
+          :achk=true:\
+          :as=/usr/share/pykota/lprngpykota:\
+          :ae=/usr/share/pykota/lprngpykota:\
+          
+        This will tell LPRng to activate accounting, and use the lprngpykota 
+        accounting filter both at the start and at the end of printing. 
+        
+    When all modifications are done, just save the /etc/printcap file and    
+    restart LPRng :
+    
+          $ /etc/init.d/lprng restart
+          
+        or :    
+      
+          $ /etc/rc.d/init.d/lprng restart
+          
+        or any similar command depending on your operating system.  
+        
+    NB : the pkhint command can't be used with LPRng for now, so you    
+         have to modify /etc/pykota/pykota.conf carefully. The comments
+         in this file will help you.
+      
+Now you can begin to populate the PyKota's database with printers,
+users and groups :
+  
+Add printers and users to the quota system and set their quota values : 
+
+Starting from version 1.18alpha2, the preferred command to manage
+printers is named pkprinters
+
+    $ pkprinters --help
+    
+    will tell you how to create, manage or delete printers and
+    printers groups.
+    
+    $ pkprinters --add --charge 0.05 hp2100
+    
+    would add the printer named hp2100 with a price per page
+    of 0.05 unit.
+
+Now set quotas for users on this printer :     
+
+    $ edpykota --add -P hp2100 -S 40 -H 50 user1 ... userN
+        
+    launching edpykota without any argument or with the --help
+    command line option will show you all the possibilities.
+    
+    by default, each user is limited by "quota", this means that on
+    each printer he can have a different soft and hard limit.
+    You may want to limit the user by his account balance value, 
+    in which case, the print quota is shared between all printers
+    instead of being different. To do this, use the following :
+    
+    $ edpykota --add -P hp2100 --limitby balance --balance 10 user1 ... userN
+    
+    This will put 10 $ (or Euros, PyKota doesn't care) on each user's account
+    balance, and tell PyKota to limit them by their account balance value.
+    Whenever they print on any printer, their account balance value is
+    decreased by an amount which depends on the particular price per page
+    and per job that you may have defined on the printer with edpykota's
+    --charge command line option.
+    Soft and Hard limits are not used if "--limitby balance" is used,
+    but you can define a "poorman"'s threshold in /etc/pykota/pykota.conf
+    to obtain a similar result (warning message when quota is low).
+
+Restart CUPS or LPRng, for example under Debian GNU/Linux systems :          
+
+    $ /etc/init.d/cupsys restart
+    
+  or :
+  
+    $ /etc/init.d/lprng restart
+        
+Your users now should be able to print but not exceed their 
+printing quota.
+
+To see printer quota usage on printer hp2100, you can use :
+
+    $ repykota --printer hp2100
+    
+or :
+
+    $ repykota
+    
+    which will print quota usage for all users on all printers,
+    along with totals, if you are a PyKota Administator. If you are
+    a regular user, only your own quota report will be produced.
+    
+Quota reports are also available remotely by using the CGI script
+printquota.cgi provided in the cgi-bin/ subdirectory. You can 
+also use the CSS stylesheet present in the stylesheets/ subdirectory
+and put it at your web server's DocumentRoot, to benefit from a nicer 
+look, especially quota violations will appear in different colors.
+
+For different security concerns, please give a look at the SECURITY
+file which is part of this software.
+
+To diagnose a problem when something doesn't work as expected,
+please read the very first entry in the FAQ document.
+           
+============================================================
+
+Additionnal tools :
+-------------------
+
+Some people have developped tools around PyKota, and make
+them available under the GNU General Public License :
+
+  - Kanakorn Horsiritham developped phpPykotaAdmin which is 
+    a web based database independant administrative GUI,
+    written in PHP.
+  
+      http://opensource.psu.ac.th/~kanakorn/mambo/
+      
+    He was also kind enough to write an installation guide  
+    in english for CUPS and PyKota with phpPykotaAdmin on Fedora
+    Core 3. You'll find this document on the same website.
+    
+    This great software currently at version 0.3 is a wonderful
+    basis for an administrative GUI since it only depends on 
+    PyKota commands to be present to successfully manage
+    PyKota's database. 
+  
+Additionnal software will be listed here when they will be  
+ready.
+
+============================================================
+
+Mailing list :
+--------------
+
+  A mailing list is dedicated to Pykota, you can subscribe to it
+  or consult its archives at :
+  
+    http://cgi.librelogiciel.com/mailman/listinfo/pykota
+    
+  The mailing list is the preferred way to obtain support, because  
+  all members can help and can also benefit from the solutions
+  proposed by other members. 
+  
+  Posts by non-members are usually rejected.
+  
+  The mailing list language is english and only english.
+    
+IRC :    
+-----
+
+  You can also chat with us :
+  
+        /server irc.freenode.net
+        /join #pykota
+        
+  Preferred language on this channel is english, but french      
+  is also accepted. Try to avoid exposing complex problems
+  in french because english speaking people on the channel
+  wouldn't benefit from the solutions.
+  
+  PyKota's main author is known as 'tamere' on IRC.
+    
+============================================================
+    
+Please e-mail bugs to the mailing list at : pykota@librelogiciel.com
+or to the main author at : alet@librelogiciel.com (Jerome Alet)
Index: pykota/tags/1.22/TODO
===================================================================
--- pykota/tags/1.22/TODO (revision 2223)
+++ pykota/tags/1.22/TODO (revision 2223)
@@ -0,0 +1,109 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+TODO, in no particular order :
+
+        - Pass-through mode for printers : history correctly filled (including
+          job size) but no impact on user's page counter or account
+          balance : this is meant to be a temporary situation for
+          a printer to be in pass-through mode, for example during
+          an exam where the faculty pays for the printouts and we
+          don't want our users to complain about their credits being
+          "eaten" for mandatory printouts.
+          
+        - Allow several levels of administrative priviledges by allowing
+          files like ~pykota/pykotadmin.someusername.conf (readonly by
+          user 'someusername'), and have the database server deal
+          with the permissions : no need for additionnal code or data
+          in PyKota's database !
+        
+        - Add a "printing denied" indicator on user print quota entries,  
+          to temporarily forbid an user to print on a particular printer.
+          
+        - Maybe per user "denyduplicates" : my 5 years old daughter 
+          just prints again when the printer is off...
+          
+        - Now that the job size is ALWAYS precomputed, add a 
+          MaxJobSize attribute to users and groups (printers as
+          well, maybe ?) to limit each job's size if needed.
+          
+        - Add precomputed job size (and price) to the history for
+          controlling purpose.
+          
+        - Try to talk to education based distribution coordinators
+          (SambaEdu, SkoleLinux, K12LTSP, ...) to see how to
+          better integrate PyKota with these.
+          
+        - Allow soft and hard limits to be increased/decreased.
+        
+        - Add most configuration directives to the database itself,
+          while still allowing to overwrite them with the configuration
+          files at run time.
+        
+        - Ink accounting ala PrintBill.
+        
+        - Price and statistics per page format.
+        
+        - Add a description field to users/groups.
+        
+        - Allow the admin to choose an action to take when the database
+          is unavailable (server is down or something like that), so
+          introduce two directives :
+          
+            nodb: accept|reject|hold
+            lognodb: /path/to/file/for/later/batch/update/of/database
+        
+        - CUPS accepts the "STATE: ..." message as backchannel
+          data : use this to tell CUPS what action has been taken
+          for current job. I did some testing but wasn't able to
+          make it work...
+          
+        - Think about some possible client <=> PyKota dialog
+          possibilities, like embedding a small web server in
+          PyKota for example, or something like that.
+        
+        - Log something when --add is used with existing entries.
+          Maybe add a new command line option to force/not force
+          modification of existing entries.
+          
+        - Finish implementation of quota-then-balance and 
+          balance-then-quota.
+          
+        - Introduce the pkusers command.
+          pkusers --nogroup
+          pkusers --ingroups gr1,gr2,... --outgroups gr3,gr4,...
+          
+        - Allow the --ingroups command line option to repykota, to
+          report only users members of the specified groups.
+          
+        - Documentation...
+          
+        - Learn more bits of PHP to help with phpPyKotaAdmin, which
+          is a GREAT tool !
+       
+        - Multidatabase support, e.g. store users in LDAP, quota  
+          related datas in PostgreSQL, history in text file,
+          and so on... For 2.0, probably not before.
+        
+        
+============================================================
+
+Please e-mail bugs to: alet@librelogiciel.com (Jerome Alet)
Index: pykota/tags/1.22/acinclude.m4
===================================================================
--- pykota/tags/1.22/acinclude.m4 (revision 2146)
+++ pykota/tags/1.22/acinclude.m4 (revision 2146)
@@ -0,0 +1,26 @@
+dnl From msw.
+dnl
+dnl a macro to check for ability to create python extensions
+dnl  AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
+dnl function also defines PYTHON_INCLUDES
+AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
+[AC_REQUIRE([AM_PATH_PYTHON])
+AC_MSG_CHECKING(for headers required to compile python extensions)
+dnl deduce PYTHON_INCLUDES
+py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
+py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
+PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
+if test "$py_prefix" != "$py_exec_prefix"; then
+  PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
+fi
+AC_SUBST(PYTHON_INCLUDES)
+dnl check if the headers exist:
+save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+AC_TRY_CPP([#include <Python.h>],dnl
+[AC_MSG_RESULT(found)
+$1],dnl
+[AC_MSG_RESULT(not found)
+$2])
+CPPFLAGS="$save_CPPFLAGS"
+])
Index: pykota/tags/1.22/pykota/ipp.py
===================================================================
--- pykota/tags/1.22/pykota/ipp.py (revision 2190)
+++ pykota/tags/1.22/pykota/ipp.py (revision 2190)
@@ -0,0 +1,183 @@
+#! /usr/bin/env python
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+from struct import unpack
+
+OPERATION_ATTRIBUTES_TAG = 0x01
+JOB_ATTRIBUTES_TAG = 0x02
+END_OF_ATTRIBUTES_TAG = 0x03
+PRINTER_ATTRIBUTES_TAG = 0x04
+UNSUPPORTED_ATTRIBUTES_TAG = 0x05
+
+class PyKotaIPPError(Exception):
+    """An exception for PyKota IPP related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+
+class IPPMessage :
+    """A class for IPP message files."""
+    def __init__(self, data) :
+        """Initializes an IPP Message object."""
+        self.data = data
+        self._attributes = {}
+        self.curname = None
+        self.tags = [ None ] * 256      # by default all tags reserved
+        
+        # Delimiter tags
+        self.tags[0x01] = "operation-attributes-tag"
+        self.tags[0x02] = "job-attributes-tag"
+        self.tags[0x03] = "end-of-attributes-tag"
+        self.tags[0x04] = "printer-attributes-tag"
+        self.tags[0x05] = "unsupported-attributes-tag"
+        
+        # out of band values
+        self.tags[0x10] = "unsupported"
+        self.tags[0x11] = "reserved-for-future-default"
+        self.tags[0x12] = "unknown"
+        self.tags[0x13] = "no-value"
+        
+        # integer values
+        self.tags[0x20] = "generic-integer"
+        self.tags[0x21] = "integer"
+        self.tags[0x22] = "boolean"
+        self.tags[0x23] = "enum"
+        
+        # octetString
+        self.tags[0x30] = "octetString-with-an-unspecified-format"
+        self.tags[0x31] = "dateTime"
+        self.tags[0x32] = "resolution"
+        self.tags[0x33] = "rangeOfInteger"
+        self.tags[0x34] = "reserved-for-collection"
+        self.tags[0x35] = "textWithLanguage"
+        self.tags[0x36] = "nameWithLanguage"
+        
+        # character strings
+        self.tags[0x20] = "generic-character-string"
+        self.tags[0x41] = "textWithoutLanguage"
+        self.tags[0x42] = "nameWithoutLanguage"
+        # self.tags[0x43] = "reserved"
+        self.tags[0x44] = "keyword"
+        self.tags[0x45] = "uri"
+        self.tags[0x46] = "uriScheme"
+        self.tags[0x47] = "charset"
+        self.tags[0x48] = "naturalLanguage"
+        self.tags[0x49] = "mimeMediaType"
+        
+        # now parses the IPP message
+        self.parse()
+        
+    def __getattr__(self, attrname) :    
+        """Allows self.attributes to return the attributes names."""
+        if attrname == "attributes" :
+            keys = self._attributes.keys()
+            keys.sort()
+            return keys
+        raise AttributeError, attrname
+            
+    def __getitem__(self, ippattrname) :    
+        """Fakes a dictionnary d['key'] notation."""
+        value = self._attributes.get(ippattrname)
+        if value is not None :
+            if len(value) == 1 :
+                value = value[0]
+        return value        
+    get = __getitem__    
+    
+    def keys(self) :
+        """Fakes a dictionnary .keys() method."""
+        return self._attributes.keys()
+        
+    def parseTag(self) :    
+        """Extracts information from an IPP tag."""
+        pos = self.position
+        valuetag = self.tags[ord(self.data[pos])]
+        # print valuetag.get("name")
+        pos += 1
+        posend = pos2 = pos + 2
+        namelength = unpack(">H", self.data[pos:pos2])[0]
+        if not namelength :
+            name = self.curname
+        else :    
+            posend += namelength
+            self.curname = name = self.data[pos2:posend]
+        pos2 = posend + 2
+        valuelength = unpack(">H", self.data[posend:pos2])[0]
+        posend = pos2 + valuelength
+        value = self.data[pos2:posend]
+        oldval = self._attributes.setdefault(name, [])
+        oldval.append(value)
+        return posend - self.position
+        
+    def operation_attributes_tag(self) : 
+        """Indicates that the parser enters into an operation-attributes-tag group."""
+        return self.parseTag()
+        
+    def job_attributes_tag(self) : 
+        """Indicates that the parser enters into an operation-attributes-tag group."""
+        return self.parseTag()
+        
+    def printer_attributes_tag(self) : 
+        """Indicates that the parser enters into an operation-attributes-tag group."""
+        return self.parseTag()
+        
+    def parse(self) :
+        """Parses an IPP Message.
+        
+           NB : Only a subset of RFC2910 is implemented.
+           We are only interested in textual informations for now anyway.
+        """
+        self.version = "%s.%s" % (ord(self.data[0]), ord(self.data[1]))
+        self.operation_id = "0x%04x" % unpack(">H", self.data[2:4])[0]
+        self.request_id = "0x%08x" % unpack(">I", self.data[4:8])[0]
+        self.position = 8
+        try :
+            tag = ord(self.data[self.position])
+            while tag != END_OF_ATTRIBUTES_TAG :
+                self.position += 1
+                name = self.tags[tag]
+                if name is not None :
+                    func = getattr(self, name.replace("-", "_"), None)
+                    if func is not None :
+                        self.position += func()
+                        if ord(self.data[self.position]) > UNSUPPORTED_ATTRIBUTES_TAG :
+                            self.position -= 1
+                            continue
+                tag = ord(self.data[self.position])
+        except IndexError :
+            raise PyKotaIPPError, "Unexpected end of IPP message."
+            
+if __name__ == "__main__" :            
+    if len(sys.argv) < 2 :
+        print "usage : python ipp.py /var/spool/cups/c00005 (for example)\n"
+    else :    
+        infile = open(sys.argv[1])
+        message = IPPMessage(infile.read())
+        infile.close()
+        for key in message.keys() :
+            print "%s : %s" % (key, message[key])
Index: pykota/tags/1.22/pykota/dumper.py
===================================================================
--- pykota/tags/1.22/pykota/dumper.py (revision 2219)
+++ pykota/tags/1.22/pykota/dumper.py (revision 2219)
@@ -0,0 +1,176 @@
+# PyKota Print Quota Data Dumper
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+from mx import DateTime
+
+try :
+    import jaxml
+except ImportError :    
+    sys.stderr.write("The jaxml Python module is not installed. XML output is disabled.\n")
+    sys.stderr.write("Download jaxml from http://www.librelogiciel.com/software/ or from your Debian archive of choice\n")
+    hasJAXML = 0
+else :    
+    hasJAXML = 1
+
+from pykota import version
+from pykota.tool import PyKotaTool, PyKotaToolError, N_
+
+class DumPyKota(PyKotaTool) :        
+    """A class for dumpykota."""
+    validdatatypes = { "history" : N_("History"),
+                       "users" : N_("Users"),
+                       "groups" : N_("Groups"),
+                       "printers" : N_("Printers"),
+                       "upquotas" : N_("Users Print Quotas"),
+                       "gpquotas" : N_("Users Groups Print Quotas"),
+                       "payments" : N_("History of Payments"),
+                       "pmembers" : N_("Printers Groups Membership"), 
+                       "umembers" : N_("Users Groups Membership"),
+                     }
+    validformats = { "csv" : N_("Comma Separated Values"),
+                     "ssv" : N_("Semicolon Separated Values"),
+                     "tsv" : N_("Tabulation Separated Values"),
+                     "xml" : N_("eXtensible Markup Language"),
+                     "cups" : N_("CUPS' page_log"),
+                   }  
+    validfilterkeys = [ "username",
+                        "groupname",
+                        "printername",
+                        "pgroupname",
+                        "hostname",
+                        "billingcode",
+                      ]
+    def main(self, arguments, options, restricted=1) :
+        """Print Quota Data Dumper."""
+        if restricted and not self.config.isAdmin :
+            raise PyKotaToolError, "%s : %s" % (pwd.getpwuid(os.geteuid())[0], _("You're not allowed to use this command."))
+            
+        extractonly = {}
+        for filterexp in arguments :
+            if filterexp.strip() :
+                try :
+                    (filterkey, filtervalue) = [part.strip() for part in filterexp.split("=")]
+                    if filterkey not in self.validfilterkeys :
+                        raise ValueError                
+                except ValueError :    
+                    raise PyKotaToolError, _("Invalid filter value [%s], see help.") % filterexp
+                else :    
+                    extractonly.update({ filterkey : filtervalue })
+            
+        datatype = options["data"]
+        if datatype not in self.validdatatypes.keys() :
+            raise PyKotaToolError, _("Invalid modifier [%s] for --data command line option, see help.") % datatype
+                    
+        format = options["format"]
+        if (format not in self.validformats.keys()) \
+              or ((format == "cups") and (datatype != "history")) :
+            raise PyKotaToolError, _("Invalid modifier [%s] for --format command line option, see help.") % format
+            
+        if (format == "xml") and not hasJAXML :
+            raise PyKotaToolError, _("XML output is disabled because the jaxml module is not available.")
+            
+        entries = getattr(self.storage, "extract%s" % datatype.title())(extractonly)
+        if entries :
+            mustclose = 0    
+            if options["output"].strip() == "-" :    
+                self.outfile = sys.stdout
+            else :    
+                self.outfile = open(options["output"], "w")
+                mustclose = 1
+                
+            retcode = getattr(self, "dump%s" % format.title())(entries, datatype)
+            
+            if mustclose :
+                self.outfile.close()
+                
+            return retcode    
+        return 0
+        
+    def dumpWithSeparator(self, separator, entries) :    
+        """Dumps datas with a separator."""
+        for entry in entries :
+            line = separator.join([ '"%s"' % field for field in entry ])
+            try :
+                self.outfile.write("%s\n" % line)
+            except IOError, msg :    
+                sys.stderr.write("%s : %s\n" % (_("PyKota data dumper failed : I/O error"), msg))
+                return -1
+        return 0        
+        
+    def dumpCsv(self, entries, dummy) :    
+        """Dumps datas with a comma as the separator."""
+        return self.dumpWithSeparator(",", entries)
+                           
+    def dumpSsv(self, entries, dummy) :    
+        """Dumps datas with a comma as the separator."""
+        return self.dumpWithSeparator(";", entries)
+                           
+    def dumpTsv(self, entries, dummy) :    
+        """Dumps datas with a comma as the separator."""
+        return self.dumpWithSeparator("\t", entries)
+        
+    def dumpCups(self, entries, dummy) :    
+        """Dumps history datas as CUPS' page_log format."""
+        fieldnames = entries[0]
+        fields = {}
+        for i in range(len(fieldnames)) :
+            fields[fieldnames[i]] = i
+        sortindex = fields["jobdate"]    
+        entries = entries[1:]
+        entries.sort(lambda m,n,si=sortindex : cmp(m[si], n[si]))
+        for entry in entries :    
+            printername = entry[fields["printername"]]
+            username = entry[fields["username"]]
+            jobid = entry[fields["jobid"]]
+            jobdate = DateTime.ISO.ParseDateTime(entry[fields["jobdate"]])
+            gmtoffset = jobdate.gmtoffset()
+            jobdate = "%s %+03i00" % (jobdate.strftime("%d/%b/%Y:%H:%M:%S"), gmtoffset.hour)
+            jobsize = entry[fields["jobsize"]] or 0
+            copies = entry[fields["copies"]] or 1
+            hostname = entry[fields["hostname"]] or ""
+            billingcode = entry[fields["billingcode"]] or "-"
+            for pagenum in range(1, jobsize+1) :
+                self.outfile.write("%s %s %s [%s] %s %s %s %s\n" % (printername, username, jobid, jobdate, pagenum, copies, billingcode, hostname))
+        
+    def dumpXml(self, entries, datatype) :    
+        """Dumps datas as XML."""
+        x = jaxml.XML_document(encoding="UTF-8")
+        x.pykota(version=version.__version__, author=version.__author__)
+        x.dump(storage=self.config.getStorageBackend()["storagebackend"], type=datatype)
+        headers = entries[0]
+        for entry in entries[1:] :
+            x._push()
+            x.entry()
+            for i in range(len(entry)) :
+                value = str(entry[i])
+                typval = type(entry[i]).__name__
+                try :
+                    value = unicode(value, self.getCharset()).encode("UTF-8")
+                except UnicodeError :    
+                    pass
+                x.attribute(value, type=typval, name=headers[i])
+            x._pop()    
+        x._output(self.outfile)
Index: pykota/tags/1.22/pykota/reporters/__init__.py
===================================================================
--- pykota/tags/1.22/pykota/reporters/__init__.py (revision 2146)
+++ pykota/tags/1.22/pykota/reporters/__init__.py (revision 2146)
@@ -0,0 +1,22 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
Index: pykota/tags/1.22/pykota/reporters/Makefile.am
===================================================================
--- pykota/tags/1.22/pykota/reporters/Makefile.am (revision 2146)
+++ pykota/tags/1.22/pykota/reporters/Makefile.am (revision 2146)
@@ -0,0 +1,7 @@
+pykota_reportersdir = $(pythondir)/pykota/reporters
+
+pykota_reporters_PYTHON = 	\
+	html.py					\
+	__init__.py				\
+	text.py
+
Index: pykota/tags/1.22/pykota/reporters/html.py
===================================================================
--- pykota/tags/1.22/pykota/reporters/html.py (revision 2147)
+++ pykota/tags/1.22/pykota/reporters/html.py (revision 2147)
@@ -0,0 +1,80 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+import urllib
+from mx import DateTime
+
+from pykota.reporter import BaseReporter, PyKotaReporterError
+    
+class Reporter(BaseReporter) :    
+    """HTML reporter."""
+    def generateReport(self) :
+        """Produces a simple HTML report."""
+        self.report = []
+        if self.isgroup :
+            prefix = "Group"
+        else :    
+            prefix = "User"
+        for printer in self.printers :
+            phistoryurl = { "printername" : printer.Name, "history" : 1 }
+            self.report.append('<a href="%s?%s"><h2 class="printername">%s</h2></a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode(phistoryurl), self.getPrinterTitle(printer)))
+            self.report.append('<h3 class="printergracedelay">%s</h3>' % self.getPrinterGraceDelay(printer))
+            (pjob, ppage) = self.getPrinterPrices(printer)
+            self.report.append('<h4 class="priceperjob">%s</h4>' % pjob)
+            self.report.append('<h4 class="priceperpage">%s</h4>' % ppage)
+            total = 0
+            totalmoney = 0.0
+            self.report.append('<table class="pykotatable" border="1">')
+            headers = self.getReportHeader().split()
+            headers.insert(1, "LimitBy")
+            self.report.append('<tr class="pykotacolsheader">%s</tr>' % "".join(["<th>%s</th>" % h for h in headers]))
+            oddeven = 0
+            for (entry, entrypquota) in getattr(self.tool.storage, "getPrinter%ssAndQuotas" % prefix)(printer, self.ugnames) :
+                oddeven += 1
+                if oddeven % 2 :
+                    oddevenclass = "odd"
+                else :    
+                    oddevenclass = "even"
+                (pages, money, name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid, overcharge, warncount) = self.getQuota(entry, entrypquota)
+                if datelimit :
+                    if datelimit == "DENY" :
+                        oddevenclass = "deny"
+                    else :    
+                        oddevenclass = "warn"
+                if (not self.tool.config.getDisableHistory()) and (not self.isgroup) :
+                    name = '<a href="%s?username=%s&printername=%s&history=1">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), name, printer.Name, name)
+                self.report.append('<tr class="%s">%s</tr>' % (oddevenclass, "".join(["<td>%s</td>" % h for h in (name, reached, overcharge, pagecounter, soft, hard, balance, datelimit or "&nbsp;", lifepagecounter, lifetimepaid, warncount)])))
+                total += pages
+                totalmoney += money
+                
+            if total or totalmoney :        
+                (tpage, tmoney) = self.getTotals(total, totalmoney)
+                self.report.append('<tr class="totals"><td colspan="8">&nbsp;</td><td align="right">%s</td><td align="right">%s</td><td>&nbsp;</td></tr>' % (tpage, tmoney))
+            self.report.append('<tr class="realpagecounter"><td colspan="8">&nbsp;</td><td align="right">%s</td><td>&nbsp;</td></tr>' % self.getPrinterRealPageCounter(printer))
+            self.report.append('</table>')
+        if self.isgroup :    
+            self.report.append('<p class="warning">%s</p>' % _("Totals may be inaccurate if some users are members of several groups."))
+        return "\n".join(self.report)    
+                        
Index: pykota/tags/1.22/pykota/reporters/text.py
===================================================================
--- pykota/tags/1.22/pykota/reporters/text.py (revision 2149)
+++ pykota/tags/1.22/pykota/reporters/text.py (revision 2149)
@@ -0,0 +1,62 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+from pykota.reporter import BaseReporter, PyKotaReporterError
+    
+class Reporter(BaseReporter) :    
+    """Text reporter."""
+    def generateReport(self) :
+        """Produces a simple text report."""
+        self.report = []
+        if self.isgroup :
+            prefix = "Group"
+        else :    
+            prefix = "User"
+        for printer in self.printers :
+            self.report.append(self.getPrinterTitle(printer))
+            self.report.append(self.getPrinterGraceDelay(printer))
+            (pjob, ppage) = self.getPrinterPrices(printer)
+            self.report.append(pjob)
+            self.report.append(ppage)
+            
+            total = 0
+            totalmoney = 0.0
+            header = self.getReportHeader()
+            self.report.append(header)
+            self.report.append('-' * len(header))
+            for (entry, entrypquota) in getattr(self.tool.storage, "getPrinter%ssAndQuotas" % prefix)(printer, self.ugnames) :
+                (pages, money, name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid, overcharge, warncount) = self.getQuota(entry, entrypquota)
+                self.report.append("%-15.15s %s %5s %7i %7s %7s %10s %-10.10s %8i %10s %4s" % (name, reached, overcharge, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid, warncount))
+                total += pages
+                totalmoney += money
+                
+            if total or totalmoney :        
+                (tpage, tmoney) = self.getTotals(total, totalmoney)
+                self.report.append((" " * 62) + tpage + tmoney)
+            self.report.append((" " * 63) + self.getPrinterRealPageCounter(printer))
+            self.report.append("")        
+        if self.isgroup :    
+            self.report.append(_("Totals may be inaccurate if some users are members of several groups."))
+        return "\n".join(self.report)    
+                        
Index: pykota/tags/1.22/pykota/__init__.py
===================================================================
--- pykota/tags/1.22/pykota/__init__.py (revision 2146)
+++ pykota/tags/1.22/pykota/__init__.py (revision 2146)
@@ -0,0 +1,22 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
Index: pykota/tags/1.22/pykota/storages/pgstorage.py
===================================================================
--- pykota/tags/1.22/pykota/storages/pgstorage.py (revision 2210)
+++ pykota/tags/1.22/pykota/storages/pgstorage.py (revision 2210)
@@ -0,0 +1,118 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+from pykota.storage import PyKotaStorageError,BaseStorage,StorageObject,StorageUser,StorageGroup,StoragePrinter,StorageJob,StorageLastJob,StorageUserPQuota,StorageGroupPQuota
+from pykota.storages.sql import SQLStorage
+
+try :
+    import pg
+except ImportError :    
+    import sys
+    # TODO : to translate or not to translate ?
+    raise PyKotaStorageError, "This python version (%s) doesn't seem to have the PygreSQL module installed correctly." % sys.version.split()[0]
+else :    
+    try :
+        PGError = pg.Error
+    except AttributeError :    
+        PGError = pg.error
+
+class Storage(BaseStorage, SQLStorage) :
+    def __init__(self, pykotatool, host, dbname, user, passwd) :
+        """Opens the PostgreSQL database connection."""
+        BaseStorage.__init__(self, pykotatool)
+        try :
+            (host, port) = host.split(":")
+            port = int(port)
+        except ValueError :    
+            port = -1         # Use PostgreSQL's default tcp/ip port (5432).
+        
+        self.database = pg.connect(host=host, port=port, dbname=dbname, user=user, passwd=passwd)
+        self.closed = 0
+        self.tool.logdebug("Database opened (host=%s, port=%s, dbname=%s, user=%s)" % (host, port, dbname, user))
+            
+    def close(self) :    
+        """Closes the database connection."""
+        if not self.closed :
+            self.database.close()
+            self.closed = 1
+            self.tool.logdebug("Database closed.")
+        
+    def beginTransaction(self) :    
+        """Starts a transaction."""
+        self.database.query("BEGIN;")
+        self.tool.logdebug("Transaction begins...")
+        
+    def commitTransaction(self) :    
+        """Commits a transaction."""
+        self.database.query("COMMIT;")
+        self.tool.logdebug("Transaction committed.")
+        
+    def rollbackTransaction(self) :     
+        """Rollbacks a transaction."""
+        self.database.query("ROLLBACK;")
+        self.tool.logdebug("Transaction aborted.")
+        
+    def doRawSearch(self, query) :
+        """Does a raw search query."""
+        query = query.strip()    
+        if not query.endswith(';') :    
+            query += ';'
+        try :
+            self.tool.logdebug("QUERY : %s" % query)
+            result = self.database.query(query)
+        except PGError, msg :    
+            raise PyKotaStorageError, str(msg)
+        else :    
+            return result
+            
+    def doSearch(self, query) :        
+        """Does a search query."""
+        result = self.doRawSearch(query)
+        if (result is not None) and (result.ntuples() > 0) : 
+            return result.dictresult()
+        
+    def doModify(self, query) :
+        """Does a (possibly multiple) modify query."""
+        query = query.strip()    
+        if not query.endswith(';') :    
+            query += ';'
+        try :
+            self.tool.logdebug("QUERY : %s" % query)
+            result = self.database.query(query)
+        except PGError, msg :    
+            raise PyKotaStorageError, str(msg)
+        else :    
+            return result
+            
+    def doQuote(self, field) :
+        """Quotes a field for use as a string in SQL queries."""
+        if type(field) == type(0.0) : 
+            typ = "decimal"
+        elif type(field) == type(0) :    
+            typ = "int"
+        elif type(field) == type(0L) :    
+            typ = "int"
+        else :    
+            typ = "text"
+        return pg._quote(field, typ)
Index: pykota/tags/1.22/pykota/storages/__init__.py
===================================================================
--- pykota/tags/1.22/pykota/storages/__init__.py (revision 2146)
+++ pykota/tags/1.22/pykota/storages/__init__.py (revision 2146)
@@ -0,0 +1,22 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
Index: pykota/tags/1.22/pykota/storages/sql.py
===================================================================
--- pykota/tags/1.22/pykota/storages/sql.py (revision 2222)
+++ pykota/tags/1.22/pykota/storages/sql.py (revision 2222)
@@ -0,0 +1,579 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+from types import StringType
+from pykota.storage import PyKotaStorageError,BaseStorage,StorageObject,StorageUser,StorageGroup,StoragePrinter,StorageJob,StorageLastJob,StorageUserPQuota,StorageGroupPQuota
+
+class SQLStorage :
+    def prepareRawResult(self, result) :
+        """Prepares a raw result by including the headers."""
+        if result.ntuples() > 0 :
+            entries = [result.listfields()]
+            entries.extend(result.getresult())
+            nbfields = len(entries[0])
+            for i in range(1, len(entries)) :
+                fields = list(entries[i])
+                for j in range(nbfields) :
+                    field = fields[j]
+                    if type(field) == StringType :
+                        fields[j] = self.databaseToUserCharset(field) 
+                entries[i] = tuple(fields)    
+            return entries
+        
+    def createFilter(self, only) :    
+        """Returns the appropriate SQL filter."""
+        if only :
+            expressions = []
+            for (k, v) in only.items() :
+                expressions.append("%s=%s" % (k, self.doQuote(self.userCharsetToDatabase(v))))
+            return " AND ".join(expressions)     
+        return ""        
+        
+    def extractPrinters(self, extractonly={}) :
+        """Extracts all printer records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "WHERE %s" % thefilter
+        result = self.doRawSearch("SELECT * FROM printers %s ORDER BY id ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractUsers(self, extractonly={}) :
+        """Extracts all user records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "WHERE %s" % thefilter
+        result = self.doRawSearch("SELECT * FROM users %s ORDER BY id ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractGroups(self, extractonly={}) :
+        """Extracts all group records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "WHERE %s" % thefilter
+        result = self.doRawSearch("SELECT groups.*,COALESCE(SUM(balance), 0) AS balance, COALESCE(SUM(lifetimepaid), 0) as lifetimepaid FROM groups LEFT OUTER JOIN users ON users.id IN (SELECT userid FROM groupsmembers WHERE groupid=groups.id) %s GROUP BY groups.id,groups.groupname,groups.limitby ORDER BY groups.id ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractPayments(self, extractonly={}) :
+        """Extracts all payment records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "AND %s" % thefilter
+        result = self.doRawSearch("SELECT username,payments.* FROM users,payments WHERE users.id=payments.userid %s ORDER BY payments.id ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractUpquotas(self, extractonly={}) :
+        """Extracts all userpquota records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "AND %s" % thefilter
+        result = self.doRawSearch("SELECT users.username,printers.printername,userpquota.* FROM users,printers,userpquota WHERE users.id=userpquota.userid AND printers.id=userpquota.printerid %s ORDER BY userpquota.id ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractGpquotas(self, extractonly={}) :
+        """Extracts all grouppquota records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "AND %s" % thefilter
+        result = self.doRawSearch("SELECT groups.groupname,printers.printername,grouppquota.*,coalesce(sum(pagecounter), 0) AS pagecounter,coalesce(sum(lifepagecounter), 0) AS lifepagecounter FROM groups,printers,grouppquota,userpquota WHERE groups.id=grouppquota.groupid AND printers.id=grouppquota.printerid AND userpquota.printerid=grouppquota.printerid AND userpquota.userid IN (SELECT userid FROM groupsmembers WHERE groupsmembers.groupid=grouppquota.groupid) %s GROUP BY grouppquota.id,grouppquota.groupid,grouppquota.printerid,grouppquota.softlimit,grouppquota.hardlimit,grouppquota.datelimit,groups.groupname,printers.printername ORDER BY grouppquota.id" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractUmembers(self, extractonly={}) :
+        """Extracts all user groups members."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "AND %s" % thefilter
+        result = self.doRawSearch("SELECT groups.groupname, users.username, groupsmembers.* FROM groups,users,groupsmembers WHERE users.id=groupsmembers.userid AND groups.id=groupsmembers.groupid %s ORDER BY groupsmembers.groupid, groupsmembers.userid ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractPmembers(self, extractonly={}) :
+        """Extracts all printer groups members."""
+        for (k, v) in extractonly.items() :
+            if k == "pgroupname" :
+                del extractonly[k]
+                extractonly["p1.printername"] = v
+            elif k == "printername" :
+                del extractonly[k]
+                extractonly["p2.printername"] = v
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "AND %s" % thefilter
+        result = self.doRawSearch("SELECT p1.printername as pgroupname, p2.printername as printername, printergroupsmembers.* FROM printers p1, printers p2, printergroupsmembers WHERE p1.id=printergroupsmembers.groupid AND p2.id=printergroupsmembers.printerid %s ORDER BY printergroupsmembers.groupid, printergroupsmembers.printerid ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def extractHistory(self, extractonly={}) :
+        """Extracts all jobhistory records."""
+        thefilter = self.createFilter(extractonly)
+        if thefilter :
+            thefilter = "AND %s" % thefilter
+        result = self.doRawSearch("SELECT users.username,printers.printername,jobhistory.* FROM users,printers,jobhistory WHERE users.id=jobhistory.userid AND printers.id=jobhistory.printerid %s ORDER BY jobhistory.id ASC" % thefilter)
+        return self.prepareRawResult(result)
+        
+    def getAllUsersNames(self) :    
+        """Extracts all user names."""
+        usernames = []
+        result = self.doSearch("SELECT username FROM users")
+        if result :
+            usernames = [record["username"] for record in result]
+        return usernames
+        
+    def getAllGroupsNames(self) :    
+        """Extracts all group names."""
+        groupnames = []
+        result = self.doSearch("SELECT groupname FROM groups")
+        if result :
+            groupnames = [record["groupname"] for record in result]
+        return groupnames
+        
+    def getUserNbJobsFromHistory(self, user) :
+        """Returns the number of jobs the user has in history."""
+        result = self.doSearch("SELECT COUNT(*) FROM jobhistory WHERE userid=%s" % self.doQuote(user.ident))
+        if result :
+            return result[0]["count"]
+        return 0
+        
+    def getUserFromBackend(self, username) :    
+        """Extracts user information given its name."""
+        user = StorageUser(self, username)
+        result = self.doSearch("SELECT * FROM users WHERE username=%s LIMIT 1" % self.doQuote(username))
+        if result :
+            fields = result[0]
+            user.ident = fields.get("id")
+            user.Name = fields.get("username", username)
+            user.LimitBy = fields.get("limitby") or "quota"
+            user.AccountBalance = fields.get("balance")
+            user.LifeTimePaid = fields.get("lifetimepaid")
+            user.Email = fields.get("email")
+            user.OverCharge = fields.get("overcharge", 1.0)
+            user.Exists = 1
+        return user
+       
+    def getGroupFromBackend(self, groupname) :    
+        """Extracts group information given its name."""
+        group = StorageGroup(self, groupname)
+        result = self.doSearch("SELECT groups.*,COALESCE(SUM(balance), 0.0) AS balance, COALESCE(SUM(lifetimepaid), 0.0) AS lifetimepaid FROM groups LEFT OUTER JOIN users ON users.id IN (SELECT userid FROM groupsmembers WHERE groupid=groups.id) WHERE groupname=%s GROUP BY groups.id,groups.groupname,groups.limitby LIMIT 1" % self.doQuote(groupname))
+        if result :
+            fields = result[0]
+            group.ident = fields.get("id")
+            group.Name = fields.get("groupname", groupname)
+            group.LimitBy = fields.get("limitby") or "quota"
+            group.AccountBalance = fields.get("balance")
+            group.LifeTimePaid = fields.get("lifetimepaid")
+            group.Exists = 1
+        return group
+       
+    def getPrinterFromBackend(self, printername) :        
+        """Extracts printer information given its name."""
+        printer = StoragePrinter(self, printername)
+        result = self.doSearch("SELECT * FROM printers WHERE printername=%s LIMIT 1" % self.doQuote(printername))
+        if result :
+            fields = result[0]
+            printer.ident = fields.get("id")
+            printer.Name = fields.get("printername", printername)
+            printer.PricePerJob = fields.get("priceperjob") or 0.0
+            printer.PricePerPage = fields.get("priceperpage") or 0.0
+            printer.Description = self.databaseToUserCharset(fields.get("description") or "")
+            printer.Exists = 1
+        return printer    
+        
+    def getUserPQuotaFromBackend(self, user, printer) :        
+        """Extracts a user print quota."""
+        userpquota = StorageUserPQuota(self, user, printer)
+        if printer.Exists and user.Exists :
+            result = self.doSearch("SELECT * FROM userpquota WHERE userid=%s AND printerid=%s" % (self.doQuote(user.ident), self.doQuote(printer.ident)))
+            if result :
+                fields = result[0]
+                userpquota.ident = fields.get("id")
+                userpquota.PageCounter = fields.get("pagecounter")
+                userpquota.LifePageCounter = fields.get("lifepagecounter")
+                userpquota.SoftLimit = fields.get("softlimit")
+                userpquota.HardLimit = fields.get("hardlimit")
+                userpquota.DateLimit = fields.get("datelimit")
+                userpquota.WarnCount = fields.get("warncount")
+                userpquota.Exists = 1
+        return userpquota
+        
+    def getGroupPQuotaFromBackend(self, group, printer) :        
+        """Extracts a group print quota."""
+        grouppquota = StorageGroupPQuota(self, group, printer)
+        if group.Exists :
+            result = self.doSearch("SELECT * FROM grouppquota WHERE groupid=%s AND printerid=%s" % (self.doQuote(group.ident), self.doQuote(printer.ident)))
+            if result :
+                fields = result[0]
+                grouppquota.ident = fields.get("id")
+                grouppquota.SoftLimit = fields.get("softlimit")
+                grouppquota.HardLimit = fields.get("hardlimit")
+                grouppquota.DateLimit = fields.get("datelimit")
+                result = self.doSearch("SELECT SUM(lifepagecounter) AS lifepagecounter, SUM(pagecounter) AS pagecounter FROM userpquota WHERE printerid=%s AND userid IN (SELECT userid FROM groupsmembers WHERE groupid=%s)" % (self.doQuote(printer.ident), self.doQuote(group.ident)))
+                if result :
+                    fields = result[0]
+                    grouppquota.PageCounter = fields.get("pagecounter") or 0
+                    grouppquota.LifePageCounter = fields.get("lifepagecounter") or 0
+                grouppquota.Exists = 1
+        return grouppquota
+        
+    def getPrinterLastJobFromBackend(self, printer) :        
+        """Extracts a printer's last job information."""
+        lastjob = StorageLastJob(self, printer)
+        result = self.doSearch("SELECT jobhistory.id, jobid, userid, username, pagecounter, jobsize, jobprice, filename, title, copies, options, hostname, jobdate, md5sum, pages, billingcode FROM jobhistory, users WHERE printerid=%s AND userid=users.id ORDER BY jobdate DESC LIMIT 1" % self.doQuote(printer.ident))
+        if result :
+            fields = result[0]
+            lastjob.ident = fields.get("id")
+            lastjob.JobId = fields.get("jobid")
+            lastjob.UserName = fields.get("username")
+            lastjob.PrinterPageCounter = fields.get("pagecounter")
+            lastjob.JobSize = fields.get("jobsize")
+            lastjob.JobPrice = fields.get("jobprice")
+            lastjob.JobAction = fields.get("action")
+            lastjob.JobFileName = self.databaseToUserCharset(fields.get("filename") or "") 
+            lastjob.JobTitle = self.databaseToUserCharset(fields.get("title") or "") 
+            lastjob.JobCopies = fields.get("copies")
+            lastjob.JobOptions = self.databaseToUserCharset(fields.get("options") or "") 
+            lastjob.JobDate = fields.get("jobdate")
+            lastjob.JobHostName = fields.get("hostname")
+            lastjob.JobSizeBytes = fields.get("jobsizebytes")
+            lastjob.JobMD5Sum = fields.get("md5sum")
+            lastjob.JobPages = fields.get("pages")
+            lastjob.JobBillingCode = self.databaseToUserCharset(fields.get("billingcode"))
+            lastjob.Exists = 1
+        return lastjob
+            
+    def getGroupMembersFromBackend(self, group) :        
+        """Returns the group's members list."""
+        groupmembers = []
+        result = self.doSearch("SELECT * FROM groupsmembers JOIN users ON groupsmembers.userid=users.id WHERE groupid=%s" % self.doQuote(group.ident))
+        if result :
+            for record in result :
+                user = StorageUser(self, record.get("username"))
+                user.ident = record.get("userid")
+                user.LimitBy = record.get("limitby") or "quota"
+                user.AccountBalance = record.get("balance")
+                user.LifeTimePaid = record.get("lifetimepaid")
+                user.Email = record.get("email")
+                user.OverCharge = record.get("overcharge")
+                user.Exists = 1
+                groupmembers.append(user)
+                self.cacheEntry("USERS", user.Name, user)
+        return groupmembers        
+        
+    def getUserGroupsFromBackend(self, user) :        
+        """Returns the user's groups list."""
+        groups = []
+        result = self.doSearch("SELECT groupname FROM groupsmembers JOIN groups ON groupsmembers.groupid=groups.id WHERE userid=%s" % self.doQuote(user.ident))
+        if result :
+            for record in result :
+                groups.append(self.getGroup(record.get("groupname")))
+        return groups        
+        
+    def getParentPrintersFromBackend(self, printer) :    
+        """Get all the printer groups this printer is a member of."""
+        pgroups = []
+        result = self.doSearch("SELECT groupid,printername FROM printergroupsmembers JOIN printers ON groupid=id WHERE printerid=%s" % self.doQuote(printer.ident))
+        if result :
+            for record in result :
+                if record["groupid"] != printer.ident : # in case of integrity violation
+                    parentprinter = self.getPrinter(record.get("printername"))
+                    if parentprinter.Exists :
+                        pgroups.append(parentprinter)
+        return pgroups
+        
+    def getMatchingPrinters(self, printerpattern) :
+        """Returns the list of all printers for which name matches a certain pattern."""
+        printers = []
+        # We 'could' do a SELECT printername FROM printers WHERE printername LIKE ...
+        # but we don't because other storages semantics may be different, so every
+        # storage should use fnmatch to match patterns and be storage agnostic
+        result = self.doSearch("SELECT * FROM printers")
+        if result :
+            for record in result :
+                if self.tool.matchString(record["printername"], printerpattern.split(",")) :
+                    printer = StoragePrinter(self, record["printername"])
+                    printer.ident = record.get("id")
+                    printer.PricePerJob = record.get("priceperjob") or 0.0
+                    printer.PricePerPage = record.get("priceperpage") or 0.0
+                    printer.Description = self.databaseToUserCharset(record.get("description") or "") 
+                    printer.Exists = 1
+                    printers.append(printer)
+                    self.cacheEntry("PRINTERS", printer.Name, printer)
+        return printers        
+        
+    def getPrinterUsersAndQuotas(self, printer, names=["*"]) :        
+        """Returns the list of users who uses a given printer, along with their quotas."""
+        usersandquotas = []
+        result = self.doSearch("SELECT users.id as uid,username,balance,lifetimepaid,limitby,email,overcharge,userpquota.id,lifepagecounter,pagecounter,softlimit,hardlimit,datelimit,warncount FROM users JOIN userpquota ON users.id=userpquota.userid AND printerid=%s ORDER BY username ASC" % self.doQuote(printer.ident))
+        if result :
+            for record in result :
+                if self.tool.matchString(record.get("username"), names) :
+                    user = StorageUser(self, record.get("username"))
+                    user.ident = record.get("uid")
+                    user.LimitBy = record.get("limitby") or "quota"
+                    user.AccountBalance = record.get("balance")
+                    user.LifeTimePaid = record.get("lifetimepaid")
+                    user.Email = record.get("email") 
+                    user.OverCharge = record.get("overcharge")
+                    user.Exists = 1
+                    userpquota = StorageUserPQuota(self, user, printer)
+                    userpquota.ident = record.get("id")
+                    userpquota.PageCounter = record.get("pagecounter")
+                    userpquota.LifePageCounter = record.get("lifepagecounter")
+                    userpquota.SoftLimit = record.get("softlimit")
+                    userpquota.HardLimit = record.get("hardlimit")
+                    userpquota.DateLimit = record.get("datelimit")
+                    userpquota.WarnCount = record.get("warncount")
+                    userpquota.Exists = 1
+                    usersandquotas.append((user, userpquota))
+                    self.cacheEntry("USERS", user.Name, user)
+                    self.cacheEntry("USERPQUOTAS", "%s@%s" % (user.Name, printer.Name), userpquota)
+        return usersandquotas
+                
+    def getPrinterGroupsAndQuotas(self, printer, names=["*"]) :        
+        """Returns the list of groups which uses a given printer, along with their quotas."""
+        groupsandquotas = []
+        result = self.doSearch("SELECT groupname FROM groups JOIN grouppquota ON groups.id=grouppquota.groupid AND printerid=%s ORDER BY groupname ASC" % self.doQuote(printer.ident))
+        if result :
+            for record in result :
+                if self.tool.matchString(record.get("groupname"), names) :
+                    group = self.getGroup(record.get("groupname"))
+                    grouppquota = self.getGroupPQuota(group, printer)
+                    groupsandquotas.append((group, grouppquota))
+        return groupsandquotas
+        
+    def addPrinter(self, printername) :        
+        """Adds a printer to the quota storage, returns it."""
+        self.doModify("INSERT INTO printers (printername) VALUES (%s)" % self.doQuote(printername))
+        return self.getPrinter(printername)
+        
+    def addUser(self, user) :        
+        """Adds a user to the quota storage, returns its id."""
+        self.doModify("INSERT INTO users (username, limitby, balance, lifetimepaid, email, overcharge) VALUES (%s, %s, %s, %s, %s, %s)" % (self.doQuote(user.Name), self.doQuote(user.LimitBy or 'quota'), self.doQuote(user.AccountBalance or 0.0), self.doQuote(user.LifeTimePaid or 0.0), self.doQuote(user.Email), self.doQuote(user.OverCharge)))
+        return self.getUser(user.Name)
+        
+    def addGroup(self, group) :        
+        """Adds a group to the quota storage, returns its id."""
+        self.doModify("INSERT INTO groups (groupname, limitby) VALUES (%s, %s)" % (self.doQuote(group.Name), self.doQuote(group.LimitBy or "quota")))
+        return self.getGroup(group.Name)
+
+    def addUserToGroup(self, user, group) :    
+        """Adds an user to a group."""
+        result = self.doSearch("SELECT COUNT(*) AS mexists FROM groupsmembers WHERE groupid=%s AND userid=%s" % (self.doQuote(group.ident), self.doQuote(user.ident)))
+        try :
+            mexists = int(result[0].get("mexists"))
+        except (IndexError, TypeError) :    
+            mexists = 0
+        if not mexists :    
+            self.doModify("INSERT INTO groupsmembers (groupid, userid) VALUES (%s, %s)" % (self.doQuote(group.ident), self.doQuote(user.ident)))
+            
+    def addUserPQuota(self, user, printer) :
+        """Initializes a user print quota on a printer."""
+        self.doModify("INSERT INTO userpquota (userid, printerid) VALUES (%s, %s)" % (self.doQuote(user.ident), self.doQuote(printer.ident)))
+        return self.getUserPQuota(user, printer)
+        
+    def addGroupPQuota(self, group, printer) :
+        """Initializes a group print quota on a printer."""
+        self.doModify("INSERT INTO grouppquota (groupid, printerid) VALUES (%s, %s)" % (self.doQuote(group.ident), self.doQuote(printer.ident)))
+        return self.getGroupPQuota(group, printer)
+        
+    def writePrinterPrices(self, printer) :    
+        """Write the printer's prices back into the storage."""
+        self.doModify("UPDATE printers SET priceperpage=%s, priceperjob=%s WHERE id=%s" % (self.doQuote(printer.PricePerPage), self.doQuote(printer.PricePerJob), self.doQuote(printer.ident)))
+        
+    def writePrinterDescription(self, printer) :    
+        """Write the printer's description back into the storage."""
+        description = self.userCharsetToDatabase(printer.Description)
+        self.doModify("UPDATE printers SET description=%s WHERE id=%s" % (self.doQuote(description), self.doQuote(printer.ident)))
+        
+    def writeUserOverCharge(self, user, factor) :
+        """Sets the user's overcharging coefficient."""
+        self.doModify("UPDATE users SET overcharge=%s WHERE id=%s" % (self.doQuote(factor), self.doQuote(user.ident)))
+        
+    def writeUserLimitBy(self, user, limitby) :    
+        """Sets the user's limiting factor."""
+        self.doModify("UPDATE users SET limitby=%s WHERE id=%s" % (self.doQuote(limitby), self.doQuote(user.ident)))
+        
+    def writeGroupLimitBy(self, group, limitby) :    
+        """Sets the group's limiting factor."""
+        self.doModify("UPDATE groups SET limitby=%s WHERE id=%s" % (self.doQuote(limitby), self.doQuote(group.ident)))
+        
+    def writeUserPQuotaDateLimit(self, userpquota, datelimit) :    
+        """Sets the date limit permanently for a user print quota."""
+        self.doModify("UPDATE userpquota SET datelimit=%s WHERE id=%s" % (self.doQuote(datelimit), self.doQuote(userpquota.ident)))
+            
+    def writeGroupPQuotaDateLimit(self, grouppquota, datelimit) :    
+        """Sets the date limit permanently for a group print quota."""
+        self.doModify("UPDATE grouppquota SET datelimit=%s WHERE id=%s" % (self.doQuote(datelimit), self.doQuote(grouppquota.ident)))
+        
+    def increaseUserPQuotaPagesCounters(self, userpquota, nbpages) :    
+        """Increase page counters for a user print quota."""
+        self.doModify("UPDATE userpquota SET pagecounter=pagecounter + %s,lifepagecounter=lifepagecounter + %s WHERE id=%s" % (self.doQuote(nbpages), self.doQuote(nbpages), self.doQuote(userpquota.ident)))
+       
+    def writeUserPQuotaPagesCounters(self, userpquota, newpagecounter, newlifepagecounter) :    
+        """Sets the new page counters permanently for a user print quota."""
+        self.doModify("UPDATE userpquota SET pagecounter=%s, lifepagecounter=%s, warncount=0, datelimit=NULL WHERE id=%s" % (self.doQuote(newpagecounter), self.doQuote(newlifepagecounter), self.doQuote(userpquota.ident)))
+       
+    def decreaseUserAccountBalance(self, user, amount) :    
+        """Decreases user's account balance from an amount."""
+        self.doModify("UPDATE users SET balance=balance - %s WHERE id=%s" % (self.doQuote(amount), self.doQuote(user.ident)))
+       
+    def writeUserAccountBalance(self, user, newbalance, newlifetimepaid=None) :    
+        """Sets the new account balance and eventually new lifetime paid."""
+        if newlifetimepaid is not None :
+            self.doModify("UPDATE users SET balance=%s, lifetimepaid=%s WHERE id=%s" % (self.doQuote(newbalance), self.doQuote(newlifetimepaid), self.doQuote(user.ident)))
+        else :    
+            self.doModify("UPDATE users SET balance=%s WHERE id=%s" % (self.doQuote(newbalance), self.doQuote(user.ident)))
+            
+    def writeNewPayment(self, user, amount) :        
+        """Adds a new payment to the payments history."""
+        self.doModify("INSERT INTO payments (userid, amount) VALUES (%s, %s)" % (self.doQuote(user.ident), self.doQuote(amount)))
+        
+    def writeLastJobSize(self, lastjob, jobsize, jobprice) :        
+        """Sets the last job's size permanently."""
+        self.doModify("UPDATE jobhistory SET jobsize=%s, jobprice=%s WHERE id=%s" % (self.doQuote(jobsize), self.doQuote(jobprice), self.doQuote(lastjob.ident)))
+        
+    def writeJobNew(self, printer, user, jobid, pagecounter, action, jobsize=None, jobprice=None, filename=None, title=None, copies=None, options=None, clienthost=None, jobsizebytes=None, jobmd5sum=None, jobpages=None, jobbilling=None) :
+        """Adds a job in a printer's history."""
+        if self.privacy :    
+            # For legal reasons, we want to hide the title, filename and options
+            title = filename = options = _("Hidden because of privacy concerns")
+        filename = self.userCharsetToDatabase(filename)
+        title = self.userCharsetToDatabase(title)
+        options = self.userCharsetToDatabase(options)
+        jobbilling = self.userCharsetToDatabase(jobbilling)
+        if (not self.disablehistory) or (not printer.LastJob.Exists) :
+            if jobsize is not None :
+                self.doModify("INSERT INTO jobhistory (userid, printerid, jobid, pagecounter, action, jobsize, jobprice, filename, title, copies, options, hostname, jobsizebytes, md5sum, pages, billingcode) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.doQuote(user.ident), self.doQuote(printer.ident), self.doQuote(jobid), self.doQuote(pagecounter), self.doQuote(action), self.doQuote(jobsize), self.doQuote(jobprice), self.doQuote(filename), self.doQuote(title), self.doQuote(copies), self.doQuote(options), self.doQuote(clienthost), self.doQuote(jobsizebytes), self.doQuote(jobmd5sum), self.doQuote(jobpages), self.doQuote(jobbilling)))
+            else :    
+                self.doModify("INSERT INTO jobhistory (userid, printerid, jobid, pagecounter, action, filename, title, copies, options, hostname, jobsizebytes, md5sum, pages, billingcode) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.doQuote(user.ident), self.doQuote(printer.ident), self.doQuote(jobid), self.doQuote(pagecounter), self.doQuote(action), self.doQuote(filename), self.doQuote(title), self.doQuote(copies), self.doQuote(options), self.doQuote(clienthost), self.doQuote(jobsizebytes), self.doQuote(jobmd5sum), self.doQuote(jobpages), self.doQuote(jobbilling)))
+        else :        
+            # here we explicitly want to reset jobsize to NULL if needed
+            self.doModify("UPDATE jobhistory SET userid=%s, jobid=%s, pagecounter=%s, action=%s, jobsize=%s, jobprice=%s, filename=%s, title=%s, copies=%s, options=%s, hostname=%s, jobsizebytes=%s, md5sum=%s, pages=%s, billingcode=%s, jobdate=now() WHERE id=%s" % (self.doQuote(user.ident), self.doQuote(jobid), self.doQuote(pagecounter), self.doQuote(action), self.doQuote(jobsize), self.doQuote(jobprice), self.doQuote(filename), self.doQuote(title), self.doQuote(copies), self.doQuote(options), self.doQuote(clienthost), self.doQuote(jobsizebytes), self.doQuote(jobmd5sum), self.doQuote(jobpages), self.doQuote(jobbilling), self.doQuote(printer.LastJob.ident)))
+            
+    def writeUserPQuotaLimits(self, userpquota, softlimit, hardlimit) :
+        """Sets soft and hard limits for a user quota."""
+        self.doModify("UPDATE userpquota SET softlimit=%s, hardlimit=%s, warncount=0, datelimit=NULL WHERE id=%s" % (self.doQuote(softlimit), self.doQuote(hardlimit), self.doQuote(userpquota.ident)))
+        
+    def writeUserPQuotaWarnCount(self, userpquota, warncount) :
+        """Sets the warn counter value for a user quota."""
+        self.doModify("UPDATE userpquota SET warncount=%s WHERE id=%s" % (self.doQuote(warncount), self.doQuote(userpquota.ident)))
+        
+    def increaseUserPQuotaWarnCount(self, userpquota) :
+        """Increases the warn counter value for a user quota."""
+        self.doModify("UPDATE userpquota SET warncount=warncount+1 WHERE id=%s" % self.doQuote(userpquota.ident))
+        
+    def writeGroupPQuotaLimits(self, grouppquota, softlimit, hardlimit) :
+        """Sets soft and hard limits for a group quota on a specific printer."""
+        self.doModify("UPDATE grouppquota SET softlimit=%s, hardlimit=%s, datelimit=NULL WHERE id=%s" % (self.doQuote(softlimit), self.doQuote(hardlimit), self.doQuote(grouppquota.ident)))
+
+    def writePrinterToGroup(self, pgroup, printer) :
+        """Puts a printer into a printer group."""
+        children = []
+        result = self.doSearch("SELECT printerid FROM printergroupsmembers WHERE groupid=%s" % self.doQuote(pgroup.ident))
+        if result :
+            for record in result :
+                children.append(record.get("printerid")) # TODO : put this into the database integrity rules
+        if printer.ident not in children :        
+            self.doModify("INSERT INTO printergroupsmembers (groupid, printerid) VALUES (%s, %s)" % (self.doQuote(pgroup.ident), self.doQuote(printer.ident)))
+        
+    def removePrinterFromGroup(self, pgroup, printer) :
+        """Removes a printer from a printer group."""
+        self.doModify("DELETE FROM printergroupsmembers WHERE groupid=%s AND printerid=%s" % (self.doQuote(pgroup.ident), self.doQuote(printer.ident)))
+        
+    def retrieveHistory(self, user=None, printer=None, datelimit=None, hostname=None, billingcode=None, limit=100) :
+        """Retrieves all print jobs for user on printer (or all) before date, limited to first 100 results."""
+        query = "SELECT jobhistory.*,username,printername FROM jobhistory,users,printers WHERE users.id=userid AND printers.id=printerid"
+        where = []
+        if user is not None : # user.ident is None anyway if user doesn't exist
+            where.append("userid=%s" % self.doQuote(user.ident))
+        if printer is not None : # printer.ident is None anyway if printer doesn't exist
+            where.append("printerid=%s" % self.doQuote(printer.ident))
+        if hostname is not None :    
+            where.append("hostname=%s" % self.doQuote(hostname))
+        if billingcode is not None :    
+            where.append("billingcode=%s" % self.doQuote(self.userCharsetToDatabase(billingcode)))
+        if datelimit is not None :    
+            where.append("jobdate<=%s" % self.doQuote(datelimit))
+        if where :    
+            query += " AND %s" % " AND ".join(where)
+        query += " ORDER BY id DESC"
+        if limit :
+            query += " LIMIT %s" % self.doQuote(int(limit))
+        jobs = []    
+        result = self.doSearch(query)    
+        if result :
+            for fields in result :
+                job = StorageJob(self)
+                job.ident = fields.get("id")
+                job.JobId = fields.get("jobid")
+                job.PrinterPageCounter = fields.get("pagecounter")
+                job.JobSize = fields.get("jobsize")
+                job.JobPrice = fields.get("jobprice")
+                job.JobAction = fields.get("action")
+                job.JobFileName = self.databaseToUserCharset(fields.get("filename") or "") 
+                job.JobTitle = self.databaseToUserCharset(fields.get("title") or "") 
+                job.JobCopies = fields.get("copies")
+                job.JobOptions = self.databaseToUserCharset(fields.get("options") or "") 
+                job.JobDate = fields.get("jobdate")
+                job.JobHostName = fields.get("hostname")
+                job.JobSizeBytes = fields.get("jobsizebytes")
+                job.JobMD5Sum = fields.get("md5sum")
+                job.JobPages = fields.get("pages")
+                job.JobBillingCode = self.databaseToUserCharset(fields.get("billingcode"))
+                job.UserName = fields.get("username")
+                job.PrinterName = fields.get("printername")
+                job.Exists = 1
+                jobs.append(job)
+        return jobs
+        
+    def deleteUser(self, user) :    
+        """Completely deletes an user from the Quota Storage."""
+        # TODO : What should we do if we delete the last person who used a given printer ?
+        # TODO : we can't reassign the last job to the previous one, because next user would be
+        # TODO : incorrectly charged (overcharged).
+        for q in [ 
+                    "DELETE FROM payments WHERE userid=%s" % self.doQuote(user.ident),
+                    "DELETE FROM groupsmembers WHERE userid=%s" % self.doQuote(user.ident),
+                    "DELETE FROM jobhistory WHERE userid=%s" % self.doQuote(user.ident),
+                    "DELETE FROM userpquota WHERE userid=%s" % self.doQuote(user.ident),
+                    "DELETE FROM users WHERE id=%s" % self.doQuote(user.ident),
+                  ] :
+            self.doModify(q)
+        
+    def deleteGroup(self, group) :    
+        """Completely deletes a group from the Quota Storage."""
+        for q in [
+                   "DELETE FROM groupsmembers WHERE groupid=%s" % self.doQuote(group.ident),
+                   "DELETE FROM grouppquota WHERE groupid=%s" % self.doQuote(group.ident),
+                   "DELETE FROM groups WHERE id=%s" % self.doQuote(group.ident),
+                 ] :  
+            self.doModify(q)
+            
+    def deletePrinter(self, printer) :    
+        """Completely deletes a printer from the Quota Storage."""
+        for q in [ 
+                    "DELETE FROM printergroupsmembers WHERE groupid=%s OR printerid=%s" % (self.doQuote(printer.ident), self.doQuote(printer.ident)),
+                    "DELETE FROM jobhistory WHERE printerid=%s" % self.doQuote(printer.ident),
+                    "DELETE FROM grouppquota WHERE printerid=%s" % self.doQuote(printer.ident),
+                    "DELETE FROM userpquota WHERE printerid=%s" % self.doQuote(printer.ident),
+                    "DELETE FROM printers WHERE id=%s" % self.doQuote(printer.ident),
+                  ] :
+            self.doModify(q)
+        
Index: pykota/tags/1.22/pykota/storages/Makefile.am
===================================================================
--- pykota/tags/1.22/pykota/storages/Makefile.am (revision 2146)
+++ pykota/tags/1.22/pykota/storages/Makefile.am (revision 2146)
@@ -0,0 +1,9 @@
+pykota_storagesdir = $(pythondir)/pykota/storages
+
+pykota_storages_PYTHON = 	\
+	dbistorage.py			\
+	__init__.py				\
+	ldapstorage.py			\
+	pgstorage.py			\
+	sql.py
+
Index: pykota/tags/1.22/pykota/storages/dbistorage.py
===================================================================
--- pykota/tags/1.22/pykota/storages/dbistorage.py (revision 2147)
+++ pykota/tags/1.22/pykota/storages/dbistorage.py (revision 2147)
@@ -0,0 +1,129 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+########################################################################
+##                                                                    ##
+## THIS FILE IS HIGHLY EXPERIMENTAL.                                  ##
+##                                                                    ##
+## IT WILL PROVIDE DATABASE INDEPENDANCE IN THE FUTURE.               ##
+##                                                                    ##
+## FOR NOW IT ONLY RECOGNIZES THE POSTGRESQL DBI MODULE.              ##
+##                                                                    ##
+## DON'T USE THIS UNTIL YOU ARE TOLD TO DO SO.                        ##
+##                                                                    ##
+##                                      THANKS !                      ##
+##                                                                    ##
+########################################################################
+
+from pykota.storage import PyKotaStorageError,BaseStorage,StorageObject,StorageUser,StorageGroup,StoragePrinter,StorageJob,StorageLastJob,StorageUserPQuota,StorageGroupPQuota
+from pykota.storages.sql import SQLStorage
+
+try :
+    import _pg
+    import pgdb
+except ImportError :    
+    import sys
+    # TODO : to translate or not to translate ?
+    raise PyKotaStorageError, "This python version (%s) doesn't seem to have the PygreSQL module installed correctly." % sys.version.split()[0]
+
+class Storage(BaseStorage, SQLStorage) :
+    def __init__(self, pykotatool, host, dbname, user, passwd) :
+        """Opens the Database Independant connection."""
+        BaseStorage.__init__(self, pykotatool)
+        try :
+            (host, port) = host.split(":")
+            port = int(port)
+        except ValueError :    
+            port = -1         # Use PostgreSQL's default tcp/ip port (5432).
+        
+        try :
+            self.database = pgdb.connect(host=host, database=dbname, user=user, password=passwd)
+            self.cursor = self.database.cursor()
+        except _pg.error, msg :
+            raise PyKotaStorageError, msg
+        else :    
+            self.closed = 0
+            self.tool.logdebug("Database opened (host=%s, port=%s, dbname=%s, user=%s)" % (host, port, dbname, user))
+            
+    def close(self) :    
+        """Closes the database connection."""
+        if not self.closed :
+            self.cursor.close()
+            self.database.close()
+            self.closed = 1
+            self.tool.logdebug("Database closed.")
+        
+    def beginTransaction(self) :    
+        """Starts a transaction."""
+        # No need for this since transactions begin automatically
+        # self.database.query("BEGIN;")
+        self.tool.logdebug("Transaction begins...")
+        
+    def commitTransaction(self) :    
+        """Commits a transaction."""
+        self.database.commit()
+        self.tool.logdebug("Transaction committed.")
+        
+    def rollbackTransaction(self) :     
+        """Rollbacks a transaction."""
+        self.database.rollback()
+        self.tool.logdebug("Transaction aborted.")
+        
+    def doSearch(self, query) :
+        """Does a search query."""
+        query = query.strip()    
+        if not query.endswith(';') :    
+            query += ';'
+        try :
+            self.tool.logdebug("QUERY : %s" % query)
+            self.cursor.execute(query)
+            result = self.cursor.fetchall()
+        except pgdb.DatabaseError, msg :    
+            raise PyKotaStorageError, msg
+        else :    
+            newresult = []
+            fieldsnames = [desc[0] for desc in self.cursor.description]
+            for record in result :
+                dico = {}
+                for fnumber in range(len(record)) :
+                    dico.update({fieldsnames[fnumber] : record[fnumber]})
+                newresult.append(dico)    
+            return newresult
+            
+    def doModify(self, query) :
+        """Does a (possibly multiple) modify query."""
+        query = query.strip()    
+        if not query.endswith(';') :    
+            query += ';'
+        try :
+            self.tool.logdebug("QUERY : %s" % query)
+            result = self.database.query(query)
+        except pg.error, msg :    
+            raise PyKotaStorageError, msg
+        else :    
+            return result
+            
+    def doQuote(self, field) :
+        """Quotes a field for use as a string in SQL queries."""
+        return pgdb._quote(field)
Index: pykota/tags/1.22/pykota/storages/ldapstorage.py
===================================================================
--- pykota/tags/1.22/pykota/storages/ldapstorage.py (revision 2222)
+++ pykota/tags/1.22/pykota/storages/ldapstorage.py (revision 2222)
@@ -0,0 +1,1342 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+#
+# My IANA assigned number, for 
+# "Conseil Internet & Logiciels Libres, J�me Alet" 
+# is 16868. Use this as a base to create the LDAP schema.
+#
+
+import sys
+import os
+import types
+import time
+import md5
+from mx import DateTime
+
+from pykota.storage import PyKotaStorageError, BaseStorage, StorageObject, StorageUser, StorageGroup, StoragePrinter, StorageJob, StorageLastJob, StorageUserPQuota, StorageGroupPQuota
+
+try :
+    import ldap
+    import ldap.modlist
+except ImportError :    
+    raise PyKotaStorageError, "This python version (%s) doesn't seem to have the python-ldap module installed correctly." % sys.version.split()[0]
+else :    
+    try :
+        from ldap.cidict import cidict
+    except ImportError :    
+        import UserDict
+        sys.stderr.write("ERROR: PyKota requires a newer version of python-ldap. Workaround activated. Please upgrade python-ldap !\n")
+        class cidict(UserDict.UserDict) :
+            pass # Fake it all, and don't care for case insensitivity : users who need it will have to upgrade.
+    
+class Storage(BaseStorage) :
+    def __init__(self, pykotatool, host, dbname, user, passwd) :
+        """Opens the LDAP connection."""
+        self.savedtool = pykotatool
+        self.savedhost = host
+        self.saveddbname = dbname
+        self.saveduser = user
+        self.savedpasswd = passwd
+        self.secondStageInit()
+        
+    def secondStageInit(self) :    
+        """Second stage initialisation."""
+        BaseStorage.__init__(self, self.savedtool)
+        self.info = self.tool.config.getLDAPInfo()
+        message = ""
+        for tryit in range(3) :
+            try :
+                self.database = ldap.initialize(self.savedhost) 
+                if self.info["ldaptls"] :
+                    # we want TLS
+                    ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, self.info["cacert"])
+                    self.database.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_DEMAND)
+                    self.database.start_tls_s()
+                self.database.simple_bind_s(self.saveduser, self.savedpasswd)
+                self.basedn = self.saveddbname
+            except ldap.SERVER_DOWN :    
+                message = "LDAP backend for PyKota seems to be down !"
+                self.tool.printInfo("%s" % message, "error")
+                self.tool.printInfo("Trying again in 2 seconds...", "warn")
+                time.sleep(2)
+            except ldap.LDAPError :    
+                message = "Unable to connect to LDAP server %s as %s." % (self.savedhost, self.saveduser)
+                self.tool.printInfo("%s" % message, "error")
+                self.tool.printInfo("Trying again in 2 seconds...", "warn")
+                time.sleep(2)
+            else :    
+                self.useldapcache = self.tool.config.getLDAPCache()
+                if self.useldapcache :
+                    self.tool.logdebug("Low-Level LDAP Caching enabled.")
+                    self.ldapcache = {} # low-level cache specific to LDAP backend
+                self.closed = 0
+                self.tool.logdebug("Database opened (host=%s, dbname=%s, user=%s)" % (self.savedhost, self.saveddbname, self.saveduser))
+                return # All is fine here.
+        raise PyKotaStorageError, message         
+            
+    def close(self) :    
+        """Closes the database connection."""
+        if not self.closed :
+            self.database.unbind_s()
+            self.closed = 1
+            self.tool.logdebug("Database closed.")
+        
+    def genUUID(self) :    
+        """Generates an unique identifier.
+        
+           TODO : this one is not unique accross several print servers, but should be sufficient for testing.
+        """
+        return md5.md5("%s" % time.time()).hexdigest()
+        
+    def normalizeFields(self, fields) :    
+        """Ensure all items are lists."""
+        for (k, v) in fields.items() :
+            if type(v) not in (types.TupleType, types.ListType) :
+                if not v :
+                    del fields[k]
+                else :    
+                    fields[k] = [ v ]
+        return fields        
+        
+    def beginTransaction(self) :    
+        """Starts a transaction."""
+        self.tool.logdebug("Transaction begins... WARNING : No transactions in LDAP !")
+        
+    def commitTransaction(self) :    
+        """Commits a transaction."""
+        self.tool.logdebug("Transaction committed. WARNING : No transactions in LDAP !")
+        
+    def rollbackTransaction(self) :     
+        """Rollbacks a transaction."""
+        self.tool.logdebug("Transaction aborted. WARNING : No transaction in LDAP !")
+        
+    def doSearch(self, key, fields=None, base="", scope=ldap.SCOPE_SUBTREE, flushcache=0) :
+        """Does an LDAP search query."""
+        message = ""
+        for tryit in range(3) :
+            try :
+                base = base or self.basedn
+                if self.useldapcache :
+                    # Here we overwrite the fields the app want, to try and
+                    # retrieve ALL user defined attributes ("*")
+                    # + the createTimestamp attribute, needed by job history
+                    # 
+                    # This may not work with all LDAP servers
+                    # but works at least in OpenLDAP (2.1.25) 
+                    # and iPlanet Directory Server (5.1 SP3)
+                    fields = ["*", "createTimestamp"]         
+                    
+                if self.useldapcache and (not flushcache) and (scope == ldap.SCOPE_BASE) and self.ldapcache.has_key(base) :
+                    entry = self.ldapcache[base]
+                    self.tool.logdebug("LDAP cache hit %s => %s" % (base, entry))
+                    result = [(base, entry)]
+                else :
+                    self.tool.logdebug("QUERY : Filter : %s, BaseDN : %s, Scope : %s, Attributes : %s" % (key, base, scope, fields))
+                    result = self.database.search_s(base, scope, key, fields)
+            except ldap.NO_SUCH_OBJECT, msg :        
+                raise PyKotaStorageError, (_("Search base %s doesn't seem to exist. Probable misconfiguration. Please double check /etc/pykota/pykota.conf : %s") % (base, msg))
+            except ldap.LDAPError, msg :    
+                message = (_("Search for %s(%s) from %s(scope=%s) returned no answer.") % (key, fields, base, scope)) + " : %s" % str(msg)
+                self.tool.printInfo("LDAP error : %s" % message, "error")
+                self.tool.printInfo("LDAP connection will be closed and reopened.", "warn")
+                self.close()
+                self.secondStageInit()
+            else :     
+                self.tool.logdebug("QUERY : Result : %s" % result)
+                result = [ (dn, cidict(attrs)) for (dn, attrs) in result ]
+                if self.useldapcache :
+                    for (dn, attributes) in result :
+                        self.tool.logdebug("LDAP cache store %s => %s" % (dn, attributes))
+                        self.ldapcache[dn] = attributes
+                return result
+        raise PyKotaStorageError, message
+            
+    def doAdd(self, dn, fields) :
+        """Adds an entry in the LDAP directory."""
+        fields = self.normalizeFields(cidict(fields))
+        message = ""
+        for tryit in range(3) :
+            try :
+                self.tool.logdebug("QUERY : ADD(%s, %s)" % (dn, str(fields)))
+                entry = ldap.modlist.addModlist(fields)
+                self.tool.logdebug("%s" % entry)
+                self.database.add_s(dn, entry)
+            except ldap.LDAPError, msg :
+                message = (_("Problem adding LDAP entry (%s, %s)") % (dn, str(fields))) + " : %s" % str(msg)
+                self.tool.printInfo("LDAP error : %s" % message, "error")
+                self.tool.printInfo("LDAP connection will be closed and reopened.", "warn")
+                self.close()
+                self.secondStageInit()
+            else :
+                if self.useldapcache :
+                    self.tool.logdebug("LDAP cache add %s => %s" % (dn, fields))
+                    self.ldapcache[dn] = fields
+                return dn
+        raise PyKotaStorageError, message
+            
+    def doDelete(self, dn) :
+        """Deletes an entry from the LDAP directory."""
+        message = ""
+        for tryit in range(3) :
+            try :
+                self.tool.logdebug("QUERY : Delete(%s)" % dn)
+                self.database.delete_s(dn)
+            except ldap.LDAPError, msg :
+                message = (_("Problem deleting LDAP entry (%s)") % dn) + " : %s" % str(msg)
+                self.tool.printInfo("LDAP error : %s" % message, "error")
+                self.tool.printInfo("LDAP connection will be closed and reopened.", "warn")
+                self.close()
+                self.secondStageInit()
+            else :    
+                if self.useldapcache :
+                    try :
+                        self.tool.logdebug("LDAP cache del %s" % dn)
+                        del self.ldapcache[dn]
+                    except KeyError :    
+                        pass
+                return        
+        raise PyKotaStorageError, message
+            
+    def doModify(self, dn, fields, ignoreold=1, flushcache=0) :
+        """Modifies an entry in the LDAP directory."""
+        fields = cidict(fields)
+        for tryit in range(3) :
+            try :
+                # TODO : take care of, and update LDAP specific cache
+                if self.useldapcache and not flushcache :
+                    if self.ldapcache.has_key(dn) :
+                        old = self.ldapcache[dn]
+                        self.tool.logdebug("LDAP cache hit %s => %s" % (dn, old))
+                        oldentry = {}
+                        for (k, v) in old.items() :
+                            if k != "createTimestamp" :
+                                oldentry[k] = v
+                    else :    
+                        self.tool.logdebug("LDAP cache miss %s" % dn)
+                        oldentry = self.doSearch("objectClass=*", base=dn, scope=ldap.SCOPE_BASE)[0][1]
+                else :        
+                    oldentry = self.doSearch("objectClass=*", base=dn, scope=ldap.SCOPE_BASE, flushcache=flushcache)[0][1]
+                for (k, v) in fields.items() :
+                    if type(v) == type({}) :
+                        try :
+                            oldvalue = v["convert"](oldentry.get(k, [0])[0])
+                        except ValueError :    
+                            self.tool.logdebug("Error converting %s with %s(%s)" % (oldentry.get(k), k, v))
+                            oldvalue = 0
+                        if v["operator"] == '+' :
+                            newvalue = oldvalue + v["value"]
+                        else :    
+                            newvalue = oldvalue - v["value"]
+                        fields[k] = str(newvalue)
+                fields = self.normalizeFields(fields)
+                self.tool.logdebug("QUERY : Modify(%s, %s ==> %s)" % (dn, oldentry, fields))
+                entry = ldap.modlist.modifyModlist(oldentry, fields, ignore_oldexistent=ignoreold)
+                modentry = []
+                for (mop, mtyp, mval) in entry :
+                    if mtyp and (mtyp.lower() != "createtimestamp") :
+                        modentry.append((mop, mtyp, mval))
+                self.tool.logdebug("MODIFY : %s ==> %s ==> %s" % (fields, entry, modentry))
+                if modentry :
+                    self.database.modify_s(dn, modentry)
+            except ldap.LDAPError, msg :
+                message = (_("Problem modifying LDAP entry (%s, %s)") % (dn, fields)) + " : %s" % str(msg)
+                self.tool.printInfo("LDAP error : %s" % message, "error")
+                self.tool.printInfo("LDAP connection will be closed and reopened.", "warn")
+                self.close()
+                self.secondStageInit()
+            else :
+                if self.useldapcache :
+                    cachedentry = self.ldapcache[dn]
+                    for (mop, mtyp, mval) in entry :
+                        if mop in (ldap.MOD_ADD, ldap.MOD_REPLACE) :
+                            cachedentry[mtyp] = mval
+                        else :
+                            try :
+                                del cachedentry[mtyp]
+                            except KeyError :    
+                                pass
+                    self.tool.logdebug("LDAP cache update %s => %s" % (dn, cachedentry))
+                return dn
+        raise PyKotaStorageError, message
+            
+    def filterNames(self, records, attribute) :        
+        """Returns a list of 'attribute' from a list of records.
+        
+           Logs any missing attribute.
+        """   
+        result = []
+        for (dn, record) in records :
+            attrval = record.get(attribute, [None])[0]
+            if attrval is None :
+                self.tool.printInfo("Object %s has no %s attribute !" % (dn, attribute), "error")
+            else :    
+                result.append(attrval)
+        return result        
+                
+    def getAllPrintersNames(self, printername=None) :    
+        """Extracts all printer names or only the printers' names matching the optional parameter."""
+        printernames = []
+        ldapfilter = "objectClass=pykotaPrinter"
+        if printername :
+            ldapfilter = "(&(%s)(pykotaPrinterName=%s))" % (ldapfilter, printername)
+        result = self.doSearch(ldapfilter, ["pykotaPrinterName"], base=self.info["printerbase"])
+        if result :
+            printernames = self.filterNames(result, "pykotaPrinterName")
+        return printernames
+        
+    def getAllUsersNames(self, username=None) :    
+        """Extracts all user names or only the users' names matching the optional parameter."""
+        usernames = []
+        ldapfilter = "objectClass=pykotaAccount"
+        if username :
+            ldapfilter = "(&(%s)(pykotaUserName=%s))" % (ldapfilter, username)
+        result = self.doSearch(ldapfilter, ["pykotaUserName"], base=self.info["userbase"])
+        if result :
+            usernames = self.filterNames(result, "pykotaUserName")
+        return usernames
+        
+    def getAllGroupsNames(self, groupname=None) :    
+        """Extracts all group names or only the groups' names matching the optional parameter."""
+        groupnames = []
+        ldapfilter = "objectClass=pykotaGroup"
+        if groupname :
+            ldapfilter = "(&(%s)(pykotaGroupName=%s))" % (ldapfilter, groupname)
+        result = self.doSearch(ldapfilter, ["pykotaGroupName"], base=self.info["groupbase"])
+        if result :
+            groupnames = self.filterNames(result, "pykotaGroupName")
+        return groupnames
+        
+    def getUserNbJobsFromHistory(self, user) :
+        """Returns the number of jobs the user has in history."""
+        result = self.doSearch("(&(pykotaUserName=%s)(objectClass=pykotaJob))" % user.Name, None, base=self.info["jobbase"])
+        return len(result)
+        
+    def getUserFromBackend(self, username) :    
+        """Extracts user information given its name."""
+        user = StorageUser(self, username)
+        result = self.doSearch("(&(objectClass=pykotaAccount)(|(pykotaUserName=%s)(%s=%s)))" % (username, self.info["userrdn"], username), ["pykotaUserName", "pykotaLimitBy", self.info["usermail"], "pykotaOverCharge"], base=self.info["userbase"])
+        if result :
+            fields = result[0][1]
+            user.ident = result[0][0]
+            user.Name = fields.get("pykotaUserName", [username])[0] 
+            user.Email = fields.get(self.info["usermail"], [None])[0]
+            user.LimitBy = fields.get("pykotaLimitBy", ["quota"])[0]
+            user.OverCharge = float(fields.get("pykotaOverCharge", [1.0])[0])
+            result = self.doSearch("(&(objectClass=pykotaAccountBalance)(|(pykotaUserName=%s)(%s=%s)))" % (username, self.info["balancerdn"], username), ["pykotaBalance", "pykotaLifeTimePaid", "pykotaPayments"], base=self.info["balancebase"])
+            if not result :
+                raise PyKotaStorageError, _("No pykotaAccountBalance object found for user %s. Did you create LDAP entries manually ?") % username
+            else :
+                fields = result[0][1]
+                user.idbalance = result[0][0]
+                user.AccountBalance = fields.get("pykotaBalance")
+                if user.AccountBalance is not None :
+                    if user.AccountBalance[0].upper() == "NONE" :
+                        user.AccountBalance = None
+                    else :    
+                        user.AccountBalance = float(user.AccountBalance[0])
+                user.AccountBalance = user.AccountBalance or 0.0        
+                user.LifeTimePaid = fields.get("pykotaLifeTimePaid")
+                if user.LifeTimePaid is not None :
+                    if user.LifeTimePaid[0].upper() == "NONE" :
+                        user.LifeTimePaid = None
+                    else :    
+                        user.LifeTimePaid = float(user.LifeTimePaid[0])
+                user.LifeTimePaid = user.LifeTimePaid or 0.0        
+                user.Payments = []
+                for payment in fields.get("pykotaPayments", []) :
+                    (date, amount) = payment.split(" # ")
+                    user.Payments.append((date, amount))
+            user.Exists = 1
+        return user
+       
+    def getGroupFromBackend(self, groupname) :    
+        """Extracts group information given its name."""
+        group = StorageGroup(self, groupname)
+        result = self.doSearch("(&(objectClass=pykotaGroup)(|(pykotaGroupName=%s)(%s=%s)))" % (groupname, self.info["grouprdn"], groupname), ["pykotaGroupName", "pykotaLimitBy"], base=self.info["groupbase"])
+        if result :
+            fields = result[0][1]
+            group.ident = result[0][0]
+            group.Name = fields.get("pykotaGroupName", [groupname])[0] 
+            group.LimitBy = fields.get("pykotaLimitBy", ["quota"])[0]
+            group.AccountBalance = 0.0
+            group.LifeTimePaid = 0.0
+            for member in self.getGroupMembers(group) :
+                if member.Exists :
+                    group.AccountBalance += member.AccountBalance
+                    group.LifeTimePaid += member.LifeTimePaid
+            group.Exists = 1
+        return group
+       
+    def getPrinterFromBackend(self, printername) :        
+        """Extracts printer information given its name : returns first matching printer."""
+        printer = StoragePrinter(self, printername)
+        result = self.doSearch("(&(objectClass=pykotaPrinter)(|(pykotaPrinterName=%s)(%s=%s)))" % (printername, self.info["printerrdn"], printername), ["pykotaPrinterName", "pykotaPricePerPage", "pykotaPricePerJob", "uniqueMember", "description"], base=self.info["printerbase"])
+        if result :
+            fields = result[0][1]       # take only first matching printer, ignore the rest
+            printer.ident = result[0][0]
+            printer.Name = fields.get("pykotaPrinterName", [printername])[0] 
+            printer.PricePerJob = float(fields.get("pykotaPricePerJob", [0.0])[0])
+            printer.PricePerPage = float(fields.get("pykotaPricePerPage", [0.0])[0])
+            printer.uniqueMember = fields.get("uniqueMember", [])
+            printer.Description = self.databaseToUserCharset(fields.get("description", [""])[0]) 
+            printer.Exists = 1
+        return printer    
+        
+    def getUserPQuotaFromBackend(self, user, printer) :        
+        """Extracts a user print quota."""
+        userpquota = StorageUserPQuota(self, user, printer)
+        if printer.Exists and user.Exists :
+            if self.info["userquotabase"].lower() == "user" :
+                base = user.ident
+            else :    
+                base = self.info["userquotabase"]
+            result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaUserName=%s)(pykotaPrinterName=%s))" % (user.Name, printer.Name), ["pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit", "pykotaWarnCount"], base=base)
+            if result :
+                fields = result[0][1]
+                userpquota.ident = result[0][0]
+                userpquota.PageCounter = int(fields.get("pykotaPageCounter", [0])[0])
+                userpquota.LifePageCounter = int(fields.get("pykotaLifePageCounter", [0])[0])
+                userpquota.WarnCount = int(fields.get("pykotaWarnCount", [0])[0])
+                userpquota.SoftLimit = fields.get("pykotaSoftLimit")
+                if userpquota.SoftLimit is not None :
+                    if userpquota.SoftLimit[0].upper() == "NONE" :
+                        userpquota.SoftLimit = None
+                    else :    
+                        userpquota.SoftLimit = int(userpquota.SoftLimit[0])
+                userpquota.HardLimit = fields.get("pykotaHardLimit")
+                if userpquota.HardLimit is not None :
+                    if userpquota.HardLimit[0].upper() == "NONE" :
+                        userpquota.HardLimit = None
+                    elif userpquota.HardLimit is not None :    
+                        userpquota.HardLimit = int(userpquota.HardLimit[0])
+                userpquota.DateLimit = fields.get("pykotaDateLimit")
+                if userpquota.DateLimit is not None :
+                    if userpquota.DateLimit[0].upper() == "NONE" : 
+                        userpquota.DateLimit = None
+                    else :    
+                        userpquota.DateLimit = userpquota.DateLimit[0]
+                userpquota.Exists = 1
+        return userpquota
+        
+    def getGroupPQuotaFromBackend(self, group, printer) :        
+        """Extracts a group print quota."""
+        grouppquota = StorageGroupPQuota(self, group, printer)
+        if group.Exists :
+            if self.info["groupquotabase"].lower() == "group" :
+                base = group.ident
+            else :    
+                base = self.info["groupquotabase"]
+            result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(pykotaGroupName=%s)(pykotaPrinterName=%s))" % (group.Name, printer.Name), ["pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=base)
+            if result :
+                fields = result[0][1]
+                grouppquota.ident = result[0][0]
+                grouppquota.SoftLimit = fields.get("pykotaSoftLimit")
+                if grouppquota.SoftLimit is not None :
+                    if grouppquota.SoftLimit[0].upper() == "NONE" :
+                        grouppquota.SoftLimit = None
+                    else :    
+                        grouppquota.SoftLimit = int(grouppquota.SoftLimit[0])
+                grouppquota.HardLimit = fields.get("pykotaHardLimit")
+                if grouppquota.HardLimit is not None :
+                    if grouppquota.HardLimit[0].upper() == "NONE" :
+                        grouppquota.HardLimit = None
+                    else :    
+                        grouppquota.HardLimit = int(grouppquota.HardLimit[0])
+                grouppquota.DateLimit = fields.get("pykotaDateLimit")
+                if grouppquota.DateLimit is not None :
+                    if grouppquota.DateLimit[0].upper() == "NONE" : 
+                        grouppquota.DateLimit = None
+                    else :    
+                        grouppquota.DateLimit = grouppquota.DateLimit[0]
+                grouppquota.PageCounter = 0
+                grouppquota.LifePageCounter = 0
+                usernamesfilter = "".join(["(pykotaUserName=%s)" % member.Name for member in self.getGroupMembers(group)])
+                if usernamesfilter :
+                    usernamesfilter = "(|%s)" % usernamesfilter
+                if self.info["userquotabase"].lower() == "user" :
+                    base = self.info["userbase"]
+                else :
+                    base = self.info["userquotabase"]
+                result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaPrinterName=%s)%s)" % (printer.Name, usernamesfilter), ["pykotaPageCounter", "pykotaLifePageCounter"], base=base)
+                if result :
+                    for userpquota in result :    
+                        grouppquota.PageCounter += int(userpquota[1].get("pykotaPageCounter", [0])[0] or 0)
+                        grouppquota.LifePageCounter += int(userpquota[1].get("pykotaLifePageCounter", [0])[0] or 0)
+                grouppquota.Exists = 1
+        return grouppquota
+        
+    def getPrinterLastJobFromBackend(self, printer) :        
+        """Extracts a printer's last job information."""
+        lastjob = StorageLastJob(self, printer)
+        result = self.doSearch("(&(objectClass=pykotaLastjob)(|(pykotaPrinterName=%s)(%s=%s)))" % (printer.Name, self.info["printerrdn"], printer.Name), ["pykotaLastJobIdent"], base=self.info["lastjobbase"])
+        if result :
+            lastjob.lastjobident = result[0][0]
+            lastjobident = result[0][1]["pykotaLastJobIdent"][0]
+            result = None
+            try :
+                result = self.doSearch("objectClass=pykotaJob", [ "pykotaJobSizeBytes", 
+                                                                  "pykotaHostName", 
+                                                                  "pykotaUserName", 
+                                                                  "pykotaPrinterName", 
+                                                                  "pykotaJobId", 
+                                                                  "pykotaPrinterPageCounter", 
+                                                                  "pykotaJobSize", 
+                                                                  "pykotaAction", 
+                                                                  "pykotaJobPrice", 
+                                                                  "pykotaFileName", 
+                                                                  "pykotaTitle", 
+                                                                  "pykotaCopies", 
+                                                                  "pykotaOptions", 
+                                                                  "pykotaBillingCode", 
+                                                                  "pykotaPages", 
+                                                                  "pykotaMD5Sum", 
+                                                                  "createTimestamp" ], 
+                                                                base="cn=%s,%s" % (lastjobident, self.info["jobbase"]), scope=ldap.SCOPE_BASE)
+            except PyKotaStorageError :    
+                pass # Last job entry exists, but job probably doesn't exist anymore. 
+            if result :
+                fields = result[0][1]
+                lastjob.ident = result[0][0]
+                lastjob.JobId = fields.get("pykotaJobId")[0]
+                lastjob.UserName = fields.get("pykotaUserName")[0]
+                lastjob.PrinterPageCounter = int(fields.get("pykotaPrinterPageCounter", [0])[0])
+                try :
+                    lastjob.JobSize = int(fields.get("pykotaJobSize", [0])[0])
+                except ValueError :    
+                    lastjob.JobSize = None
+                try :    
+                    lastjob.JobPrice = float(fields.get("pykotaJobPrice", [0.0])[0])
+                except ValueError :    
+                    lastjob.JobPrice = None
+                lastjob.JobAction = fields.get("pykotaAction", [""])[0]
+                lastjob.JobFileName = self.databaseToUserCharset(fields.get("pykotaFileName", [""])[0]) 
+                lastjob.JobTitle = self.databaseToUserCharset(fields.get("pykotaTitle", [""])[0]) 
+                lastjob.JobCopies = int(fields.get("pykotaCopies", [0])[0])
+                lastjob.JobOptions = self.databaseToUserCharset(fields.get("pykotaOptions", [""])[0]) 
+                lastjob.JobHostName = fields.get("pykotaHostName", [""])[0]
+                lastjob.JobSizeBytes = fields.get("pykotaJobSizeBytes", [0L])[0]
+                lastjob.JobBillingCode = self.databaseToUserCharset(fields.get("pykotaBillingCode", [None])[0])
+                lastjob.JobMD5Sum = fields.get("pykotaMD5Sum", [None])[0]
+                lastjob.JobPages = fields.get("pykotaPages", [""])[0]
+                date = fields.get("createTimestamp", ["19700101000000"])[0]
+                year = int(date[:4])
+                month = int(date[4:6])
+                day = int(date[6:8])
+                hour = int(date[8:10])
+                minute = int(date[10:12])
+                second = int(date[12:14])
+                lastjob.JobDate = "%04i-%02i-%02i %02i:%02i:%02i" % (year, month, day, hour, minute, second)
+                lastjob.Exists = 1
+        return lastjob
+        
+    def getGroupMembersFromBackend(self, group) :        
+        """Returns the group's members list."""
+        groupmembers = []
+        result = self.doSearch("(&(objectClass=pykotaGroup)(|(pykotaGroupName=%s)(%s=%s)))" % (group.Name, self.info["grouprdn"], group.Name), [self.info["groupmembers"]], base=self.info["groupbase"])
+        if result :
+            for username in result[0][1].get(self.info["groupmembers"], []) :
+                groupmembers.append(self.getUser(username))
+        return groupmembers        
+        
+    def getUserGroupsFromBackend(self, user) :        
+        """Returns the user's groups list."""
+        groups = []
+        result = self.doSearch("(&(objectClass=pykotaGroup)(%s=%s))" % (self.info["groupmembers"], user.Name), [self.info["grouprdn"], "pykotaGroupName", "pykotaLimitBy"], base=self.info["groupbase"])
+        if result :
+            for (groupid, fields) in result :
+                groupname = (fields.get("pykotaGroupName", [None]) or fields.get(self.info["grouprdn"], [None]))[0]
+                group = self.getFromCache("GROUPS", groupname)
+                if group is None :
+                    group = StorageGroup(self, groupname)
+                    group.ident = groupid
+                    group.LimitBy = fields.get("pykotaLimitBy")
+                    if group.LimitBy is not None :
+                        group.LimitBy = group.LimitBy[0]
+                    else :    
+                        group.LimitBy = "quota"
+                    group.AccountBalance = 0.0
+                    group.LifeTimePaid = 0.0
+                    for member in self.getGroupMembers(group) :
+                        if member.Exists :
+                            group.AccountBalance += member.AccountBalance
+                            group.LifeTimePaid += member.LifeTimePaid
+                    group.Exists = 1
+                    self.cacheEntry("GROUPS", group.Name, group)
+                groups.append(group)
+        return groups        
+        
+    def getParentPrintersFromBackend(self, printer) :    
+        """Get all the printer groups this printer is a member of."""
+        pgroups = []
+        result = self.doSearch("(&(objectClass=pykotaPrinter)(uniqueMember=%s))" % printer.ident, ["pykotaPrinterName"], base=self.info["printerbase"])
+        if result :
+            for (printerid, fields) in result :
+                if printerid != printer.ident : # In case of integrity violation.
+                    parentprinter = self.getPrinter(fields.get("pykotaPrinterName")[0])
+                    if parentprinter.Exists :
+                        pgroups.append(parentprinter)
+        return pgroups
+        
+    def getMatchingPrinters(self, printerpattern) :
+        """Returns the list of all printers for which name matches a certain pattern."""
+        printers = []
+        # see comment at the same place in pgstorage.py
+        result = self.doSearch("(&(objectClass=pykotaPrinter)(|%s))" % "".join(["(pykotaPrinterName=%s)(%s=%s)" % (pname, self.info["printerrdn"], pname) for pname in printerpattern.split(",")]), ["pykotaPrinterName", "pykotaPricePerPage", "pykotaPricePerJob", "uniqueMember", "description"], base=self.info["printerbase"])
+        if result :
+            for (printerid, fields) in result :
+                printername = fields.get("pykotaPrinterName", [""])[0] or fields.get(self.info["printerrdn"], [""])[0]
+                printer = StoragePrinter(self, printername)
+                printer.ident = printerid
+                printer.PricePerJob = float(fields.get("pykotaPricePerJob", [0.0])[0] or 0.0)
+                printer.PricePerPage = float(fields.get("pykotaPricePerPage", [0.0])[0] or 0.0)
+                printer.uniqueMember = fields.get("uniqueMember", [])
+                printer.Description = self.databaseToUserCharset(fields.get("description", [""])[0]) 
+                printer.Exists = 1
+                printers.append(printer)
+                self.cacheEntry("PRINTERS", printer.Name, printer)
+        return printers        
+        
+    def getPrinterUsersAndQuotas(self, printer, names=["*"]) :        
+        """Returns the list of users who uses a given printer, along with their quotas."""
+        usersandquotas = []
+        if self.info["userquotabase"].lower() == "user" :
+           base = self.info["userbase"]
+        else :
+           base = self.info["userquotabase"]
+        result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaPrinterName=%s)(|%s))" % (printer.Name, "".join(["(pykotaUserName=%s)" % uname for uname in names])), ["pykotaUserName", "pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit", "pykotaWarnCount"], base=base)
+        if result :
+            for (userquotaid, fields) in result :
+                user = self.getUser(fields.get("pykotaUserName")[0])
+                userpquota = StorageUserPQuota(self, user, printer)
+                userpquota.ident = userquotaid
+                userpquota.PageCounter = int(fields.get("pykotaPageCounter", [0])[0])
+                userpquota.LifePageCounter = int(fields.get("pykotaLifePageCounter", [0])[0])
+                userpquota.WarnCount = int(fields.get("pykotaWarnCount", [0])[0])
+                userpquota.SoftLimit = fields.get("pykotaSoftLimit")
+                if userpquota.SoftLimit is not None :
+                    if userpquota.SoftLimit[0].upper() == "NONE" :
+                        userpquota.SoftLimit = None
+                    else :    
+                        userpquota.SoftLimit = int(userpquota.SoftLimit[0])
+                userpquota.HardLimit = fields.get("pykotaHardLimit")
+                if userpquota.HardLimit is not None :
+                    if userpquota.HardLimit[0].upper() == "NONE" :
+                        userpquota.HardLimit = None
+                    elif userpquota.HardLimit is not None :    
+                        userpquota.HardLimit = int(userpquota.HardLimit[0])
+                userpquota.DateLimit = fields.get("pykotaDateLimit")
+                if userpquota.DateLimit is not None :
+                    if userpquota.DateLimit[0].upper() == "NONE" : 
+                        userpquota.DateLimit = None
+                    else :    
+                        userpquota.DateLimit = userpquota.DateLimit[0]
+                userpquota.Exists = 1
+                usersandquotas.append((user, userpquota))
+                self.cacheEntry("USERPQUOTAS", "%s@%s" % (user.Name, printer.Name), userpquota)
+        usersandquotas.sort(lambda x, y : cmp(x[0].Name, y[0].Name))            
+        return usersandquotas
+                
+    def getPrinterGroupsAndQuotas(self, printer, names=["*"]) :        
+        """Returns the list of groups which uses a given printer, along with their quotas."""
+        groupsandquotas = []
+        if self.info["groupquotabase"].lower() == "group" :
+           base = self.info["groupbase"]
+        else :
+           base = self.info["groupquotabase"]
+        result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(pykotaPrinterName=%s)(|%s))" % (printer.Name, "".join(["(pykotaGroupName=%s)" % gname for gname in names])), ["pykotaGroupName"], base=base)
+        if result :
+            for (groupquotaid, fields) in result :
+                group = self.getGroup(fields.get("pykotaGroupName")[0])
+                grouppquota = self.getGroupPQuota(group, printer)
+                groupsandquotas.append((group, grouppquota))
+        groupsandquotas.sort(lambda x, y : cmp(x[0].Name, y[0].Name))            
+        return groupsandquotas
+        
+    def addPrinter(self, printername) :        
+        """Adds a printer to the quota storage, returns it."""
+        fields = { self.info["printerrdn"] : printername,
+                   "objectClass" : ["pykotaObject", "pykotaPrinter"],
+                   "cn" : printername,
+                   "pykotaPrinterName" : printername,
+                   "pykotaPricePerPage" : "0.0",
+                   "pykotaPricePerJob" : "0.0",
+                 } 
+        dn = "%s=%s,%s" % (self.info["printerrdn"], printername, self.info["printerbase"])
+        self.doAdd(dn, fields)
+        return self.getPrinter(printername)
+        
+    def addUser(self, user) :        
+        """Adds a user to the quota storage, returns it."""
+        newfields = {
+                       "pykotaUserName" : user.Name,
+                       "pykotaLimitBy" : (user.LimitBy or "quota"),
+                       "pykotaOverCharge" : str(user.OverCharge),
+                    }   
+                       
+        if user.Email :
+            newfields.update({self.info["usermail"]: user.Email})
+        mustadd = 1
+        if self.info["newuser"].lower() != 'below' :
+            try :
+                (where, action) = [s.strip() for s in self.info["newuser"].split(",")]
+            except ValueError :
+                (where, action) = (self.info["newuser"].strip(), "fail")
+            result = self.doSearch("(&(objectClass=%s)(%s=%s))" % (where, self.info["userrdn"], user.Name), None, base=self.info["userbase"])
+            if result :
+                (dn, fields) = result[0]
+                oc = fields.get("objectClass", fields.get("objectclass", []))
+                oc.extend(["pykotaAccount", "pykotaAccountBalance"])
+                fields.update(newfields)
+                fields.update({ "pykotaBalance" : str(user.AccountBalance or 0.0),
+                                "pykotaLifeTimePaid" : str(user.LifeTimePaid or 0.0), })   
+                self.doModify(dn, fields)
+                mustadd = 0
+            else :
+                message = _("Unable to find an existing objectClass %s entry with %s=%s to attach pykotaAccount objectClass") % (where, self.info["userrdn"], user.Name)
+                if action.lower() == "warn" :    
+                    self.tool.printInfo(_("%s. A new entry will be created instead.") % message, "warn")
+                else : # 'fail' or incorrect setting
+                    raise PyKotaStorageError, "%s. Action aborted. Please check your configuration." % message
+                
+        if mustadd :
+            if self.info["userbase"] == self.info["balancebase"] :            
+                fields = { self.info["userrdn"] : user.Name,
+                           "objectClass" : ["pykotaObject", "pykotaAccount", "pykotaAccountBalance"],
+                           "cn" : user.Name,
+                           "pykotaBalance" : str(user.AccountBalance or 0.0),
+                           "pykotaLifeTimePaid" : str(user.LifeTimePaid or 0.0), 
+                         } 
+            else :             
+                fields = { self.info["userrdn"] : user.Name,
+                           "objectClass" : ["pykotaObject", "pykotaAccount"],
+                           "cn" : user.Name,
+                         } 
+            fields.update(newfields)         
+            dn = "%s=%s,%s" % (self.info["userrdn"], user.Name, self.info["userbase"])
+            self.doAdd(dn, fields)
+            if self.info["userbase"] != self.info["balancebase"] :            
+                fields = { self.info["balancerdn"] : user.Name,
+                           "objectClass" : ["pykotaObject", "pykotaAccountBalance"],
+                           "cn" : user.Name,
+                           "pykotaBalance" : str(user.AccountBalance or 0.0),
+                           "pykotaLifeTimePaid" : str(user.LifeTimePaid or 0.0),  
+                         } 
+                dn = "%s=%s,%s" % (self.info["balancerdn"], user.Name, self.info["balancebase"])
+                self.doAdd(dn, fields)
+            
+        return self.getUser(user.Name)
+        
+    def addGroup(self, group) :        
+        """Adds a group to the quota storage, returns it."""
+        newfields = { 
+                      "pykotaGroupName" : group.Name,
+                      "pykotaLimitBy" : (group.LimitBy or "quota"),
+                    } 
+        mustadd = 1
+        if self.info["newgroup"].lower() != 'below' :
+            try :
+                (where, action) = [s.strip() for s in self.info["newgroup"].split(",")]
+            except ValueError :
+                (where, action) = (self.info["newgroup"].strip(), "fail")
+            result = self.doSearch("(&(objectClass=%s)(%s=%s))" % (where, self.info["grouprdn"], group.Name), None, base=self.info["groupbase"])
+            if result :
+                (dn, fields) = result[0]
+                oc = fields.get("objectClass", fields.get("objectclass", []))
+                oc.extend(["pykotaGroup"])
+                fields.update(newfields)
+                self.doModify(dn, fields)
+                mustadd = 0
+            else :
+                message = _("Unable to find an existing entry to attach pykotaGroup objectclass %s") % group.Name
+                if action.lower() == "warn" :    
+                    self.tool.printInfo("%s. A new entry will be created instead." % message, "warn")
+                else : # 'fail' or incorrect setting
+                    raise PyKotaStorageError, "%s. Action aborted. Please check your configuration." % message
+                
+        if mustadd :
+            fields = { self.info["grouprdn"] : group.Name,
+                       "objectClass" : ["pykotaObject", "pykotaGroup"],
+                       "cn" : group.Name,
+                     } 
+            fields.update(newfields)         
+            dn = "%s=%s,%s" % (self.info["grouprdn"], group.Name, self.info["groupbase"])
+            self.doAdd(dn, fields)
+        return self.getGroup(group.Name)
+        
+    def addUserToGroup(self, user, group) :    
+        """Adds an user to a group."""
+        if user.Name not in [u.Name for u in self.getGroupMembers(group)] :
+            result = self.doSearch("objectClass=pykotaGroup", None, base=group.ident, scope=ldap.SCOPE_BASE)    
+            if result :
+                fields = result[0][1]
+                if not fields.has_key(self.info["groupmembers"]) :
+                    fields[self.info["groupmembers"]] = []
+                fields[self.info["groupmembers"]].append(user.Name)
+                self.doModify(group.ident, fields)
+                group.Members.append(user)
+                
+    def addUserPQuota(self, user, printer) :
+        """Initializes a user print quota on a printer."""
+        uuid = self.genUUID()
+        fields = { "cn" : uuid,
+                   "objectClass" : ["pykotaObject", "pykotaUserPQuota"],
+                   "pykotaUserName" : user.Name,
+                   "pykotaPrinterName" : printer.Name,
+                   "pykotaDateLimit" : "None",
+                   "pykotaPageCounter" : "0",
+                   "pykotaLifePageCounter" : "0",
+                   "pykotaWarnCount" : "0",
+                 } 
+        if self.info["userquotabase"].lower() == "user" :
+            dn = "cn=%s,%s" % (uuid, user.ident)
+        else :    
+            dn = "cn=%s,%s" % (uuid, self.info["userquotabase"])
+        self.doAdd(dn, fields)
+        return self.getUserPQuota(user, printer)
+        
+    def addGroupPQuota(self, group, printer) :
+        """Initializes a group print quota on a printer."""
+        uuid = self.genUUID()
+        fields = { "cn" : uuid,
+                   "objectClass" : ["pykotaObject", "pykotaGroupPQuota"],
+                   "pykotaGroupName" : group.Name,
+                   "pykotaPrinterName" : printer.Name,
+                   "pykotaDateLimit" : "None",
+                 } 
+        if self.info["groupquotabase"].lower() == "group" :
+            dn = "cn=%s,%s" % (uuid, group.ident)
+        else :    
+            dn = "cn=%s,%s" % (uuid, self.info["groupquotabase"])
+        self.doAdd(dn, fields)
+        return self.getGroupPQuota(group, printer)
+        
+    def writePrinterPrices(self, printer) :    
+        """Write the printer's prices back into the storage."""
+        fields = {
+                   "pykotaPricePerPage" : str(printer.PricePerPage),
+                   "pykotaPricePerJob" : str(printer.PricePerJob),
+                 }
+        self.doModify(printer.ident, fields)
+        
+    def writePrinterDescription(self, printer) :    
+        """Write the printer's description back into the storage."""
+        fields = {
+                   "description" : self.userCharsetToDatabase(str(printer.Description)), 
+                 }
+        self.doModify(printer.ident, fields)
+        
+    def writeUserOverCharge(self, user, factor) :
+        """Sets the user's overcharging coefficient."""
+        fields = {
+                   "pykotaOverCharge" : str(factor),
+                 }
+        self.doModify(user.ident, fields)
+        
+    def writeUserLimitBy(self, user, limitby) :    
+        """Sets the user's limiting factor."""
+        fields = {
+                   "pykotaLimitBy" : limitby,
+                 }
+        self.doModify(user.ident, fields)         
+        
+    def writeGroupLimitBy(self, group, limitby) :    
+        """Sets the group's limiting factor."""
+        fields = {
+                   "pykotaLimitBy" : limitby,
+                 }
+        self.doModify(group.ident, fields)         
+        
+    def writeUserPQuotaDateLimit(self, userpquota, datelimit) :    
+        """Sets the date limit permanently for a user print quota."""
+        fields = {
+                   "pykotaDateLimit" : datelimit,
+                 }
+        return self.doModify(userpquota.ident, fields)
+            
+    def writeGroupPQuotaDateLimit(self, grouppquota, datelimit) :    
+        """Sets the date limit permanently for a group print quota."""
+        fields = {
+                   "pykotaDateLimit" : datelimit,
+                 }
+        return self.doModify(grouppquota.ident, fields)
+        
+    def increaseUserPQuotaPagesCounters(self, userpquota, nbpages) :    
+        """Increase page counters for a user print quota."""
+        fields = {
+                   "pykotaPageCounter" : { "operator" : "+", "value" : nbpages, "convert" : int },
+                   "pykotaLifePageCounter" : { "operator" : "+", "value" : nbpages, "convert" : int },
+                 }
+        return self.doModify(userpquota.ident, fields)         
+        
+    def writeUserPQuotaPagesCounters(self, userpquota, newpagecounter, newlifepagecounter) :    
+        """Sets the new page counters permanently for a user print quota."""
+        fields = {
+                   "pykotaPageCounter" : str(newpagecounter),
+                   "pykotaLifePageCounter" : str(newlifepagecounter),
+                   "pykotaDateLimit" : None,
+                   "pykotaWarnCount" : "0",
+                 }  
+        return self.doModify(userpquota.ident, fields)         
+       
+    def decreaseUserAccountBalance(self, user, amount) :    
+        """Decreases user's account balance from an amount."""
+        fields = {
+                   "pykotaBalance" : { "operator" : "-", "value" : amount, "convert" : float },
+                 }
+        return self.doModify(user.idbalance, fields, flushcache=1)         
+       
+    def writeUserAccountBalance(self, user, newbalance, newlifetimepaid=None) :    
+        """Sets the new account balance and eventually new lifetime paid."""
+        fields = {
+                   "pykotaBalance" : str(newbalance),
+                 }
+        if newlifetimepaid is not None :
+            fields.update({ "pykotaLifeTimePaid" : str(newlifetimepaid) })
+        return self.doModify(user.idbalance, fields)         
+            
+    def writeNewPayment(self, user, amount) :        
+        """Adds a new payment to the payments history."""
+        payments = []
+        for payment in user.Payments :
+            payments.append("%s # %s" % (payment[0], str(payment[1])))
+        payments.append("%s # %s" % (str(DateTime.now()), str(amount)))
+        fields = {
+                   "pykotaPayments" : payments,
+                 }
+        return self.doModify(user.idbalance, fields)         
+        
+    def writeLastJobSize(self, lastjob, jobsize, jobprice) :        
+        """Sets the last job's size permanently."""
+        fields = {
+                   "pykotaJobSize" : str(jobsize),
+                   "pykotaJobPrice" : str(jobprice),
+                 }
+        self.doModify(lastjob.ident, fields)         
+        
+    def writeJobNew(self, printer, user, jobid, pagecounter, action, jobsize=None, jobprice=None, filename=None, title=None, copies=None, options=None, clienthost=None, jobsizebytes=None, jobmd5sum=None, jobpages=None, jobbilling=None) :
+        """Adds a job in a printer's history."""
+        if (not self.disablehistory) or (not printer.LastJob.Exists) :
+            uuid = self.genUUID()
+            dn = "cn=%s,%s" % (uuid, self.info["jobbase"])
+        else :    
+            uuid = printer.LastJob.ident[3:].split(",")[0]
+            dn = printer.LastJob.ident
+        if self.privacy :    
+            # For legal reasons, we want to hide the title, filename and options
+            title = filename = options = _("Hidden because of privacy concerns")
+        fields = {
+                   "objectClass" : ["pykotaObject", "pykotaJob"],
+                   "cn" : uuid,
+                   "pykotaUserName" : user.Name,
+                   "pykotaPrinterName" : printer.Name,
+                   "pykotaJobId" : jobid,
+                   "pykotaPrinterPageCounter" : str(pagecounter),
+                   "pykotaAction" : action,
+                   "pykotaFileName" : ((filename is None) and "None") or self.userCharsetToDatabase(filename), 
+                   "pykotaTitle" : ((title is None) and "None") or self.userCharsetToDatabase(title), 
+                   "pykotaCopies" : str(copies), 
+                   "pykotaOptions" : ((options is None) and "None") or self.userCharsetToDatabase(options), 
+                   "pykotaHostName" : str(clienthost), 
+                   "pykotaJobSizeBytes" : str(jobsizebytes),
+                   "pykotaMD5Sum" : str(jobmd5sum),
+                   "pykotaPages" : jobpages,            # don't add this attribute if it is not set, so no string conversion
+                   "pykotaBillingCode" : self.userCharsetToDatabase(jobbilling), # don't add this attribute if it is not set, so no string conversion
+                 }
+        if (not self.disablehistory) or (not printer.LastJob.Exists) :
+            if jobsize is not None :         
+                fields.update({ "pykotaJobSize" : str(jobsize), "pykotaJobPrice" : str(jobprice) })
+            self.doAdd(dn, fields)
+        else :    
+            # here we explicitly want to reset jobsize to 'None' if needed
+            fields.update({ "pykotaJobSize" : str(jobsize), "pykotaJobPrice" : str(jobprice) })
+            self.doModify(dn, fields)
+            
+        if printer.LastJob.Exists :
+            fields = {
+                       "pykotaLastJobIdent" : uuid,
+                     }
+            self.doModify(printer.LastJob.lastjobident, fields)         
+        else :    
+            lastjuuid = self.genUUID()
+            lastjdn = "cn=%s,%s" % (lastjuuid, self.info["lastjobbase"])
+            fields = {
+                       "objectClass" : ["pykotaObject", "pykotaLastJob"],
+                       "cn" : lastjuuid,
+                       "pykotaPrinterName" : printer.Name,
+                       "pykotaLastJobIdent" : uuid,
+                     }  
+            self.doAdd(lastjdn, fields)          
+            
+    def writeUserPQuotaLimits(self, userpquota, softlimit, hardlimit) :
+        """Sets soft and hard limits for a user quota."""
+        fields = { 
+                   "pykotaSoftLimit" : str(softlimit),
+                   "pykotaHardLimit" : str(hardlimit),
+                   "pykotaDateLimit" : "None",
+                   "pykotaWarnCount" : "0",
+                 }
+        self.doModify(userpquota.ident, fields)
+        
+    def writeUserPQuotaWarnCount(self, userpquota, warncount) :
+        """Sets the warn counter value for a user quota."""
+        fields = { 
+                   "pykotaWarnCount" : str(warncount or 0),
+                 }
+        self.doModify(userpquota.ident, fields)
+        
+    def increaseUserPQuotaWarnCount(self, userpquota) :
+        """Increases the warn counter value for a user quota."""
+        fields = {
+                   "pykotaWarnCount" : { "operator" : "+", "value" : 1, "convert" : int },
+                 }
+        return self.doModify(userpquota.ident, fields)         
+        
+    def writeGroupPQuotaLimits(self, grouppquota, softlimit, hardlimit) :
+        """Sets soft and hard limits for a group quota on a specific printer."""
+        fields = { 
+                   "pykotaSoftLimit" : str(softlimit),
+                   "pykotaHardLimit" : str(hardlimit),
+                   "pykotaDateLimit" : "None",
+                 }
+        self.doModify(grouppquota.ident, fields)
+            
+    def writePrinterToGroup(self, pgroup, printer) :
+        """Puts a printer into a printer group."""
+        if printer.ident not in pgroup.uniqueMember :
+            pgroup.uniqueMember.append(printer.ident)
+            fields = {
+                       "uniqueMember" : pgroup.uniqueMember
+                     }  
+            self.doModify(pgroup.ident, fields)         
+            
+    def removePrinterFromGroup(self, pgroup, printer) :
+        """Removes a printer from a printer group."""
+        try :
+            pgroup.uniqueMember.remove(printer.ident)
+        except ValueError :    
+            pass
+        else :    
+            fields = {
+                       "uniqueMember" : pgroup.uniqueMember,
+                     }  
+            self.doModify(pgroup.ident, fields)         
+            
+    def retrieveHistory(self, user=None, printer=None, datelimit=None, hostname=None, billingcode=None, limit=100) :
+        """Retrieves all print jobs for user on printer (or all) before date, limited to first 100 results."""
+        precond = "(objectClass=pykotaJob)"
+        where = []
+        if user is not None :
+            where.append("(pykotaUserName=%s)" % user.Name)
+        if printer is not None :
+            where.append("(pykotaPrinterName=%s)" % printer.Name)
+        if hostname is not None :
+            where.append("(pykotaHostName=%s)" % hostname)
+        if billingcode is not None :
+            where.append("(pykotaBillingCode=%s)" % self.userCharsetToDatabase(billingcode))
+        if where :    
+            where = "(&%s)" % "".join([precond] + where)
+        else :    
+            where = precond
+        jobs = []    
+        result = self.doSearch(where, fields=[ "pykotaJobSizeBytes", 
+                                               "pykotaHostName", 
+                                               "pykotaUserName", 
+                                               "pykotaPrinterName", 
+                                               "pykotaJobId", 
+                                               "pykotaPrinterPageCounter", 
+                                               "pykotaAction", 
+                                               "pykotaJobSize", 
+                                               "pykotaJobPrice", 
+                                               "pykotaFileName", 
+                                               "pykotaTitle", 
+                                               "pykotaCopies", 
+                                               "pykotaOptions", 
+                                               "pykotaBillingCode", 
+                                               "pykotaPages", 
+                                               "pykotaMD5Sum", 
+                                               "createTimestamp" ], 
+                                      base=self.info["jobbase"])
+        if result :
+            for (ident, fields) in result :
+                job = StorageJob(self)
+                job.ident = ident
+                job.JobId = fields.get("pykotaJobId")[0]
+                job.PrinterPageCounter = int(fields.get("pykotaPrinterPageCounter", [0])[0] or 0)
+                try :
+                    job.JobSize = int(fields.get("pykotaJobSize", [0])[0])
+                except ValueError :    
+                    job.JobSize = None
+                try :    
+                    job.JobPrice = float(fields.get("pykotaJobPrice", [0.0])[0])
+                except ValueError :
+                    job.JobPrice = None
+                job.JobAction = fields.get("pykotaAction", [""])[0]
+                job.JobFileName = self.databaseToUserCharset(fields.get("pykotaFileName", [""])[0]) 
+                job.JobTitle = self.databaseToUserCharset(fields.get("pykotaTitle", [""])[0]) 
+                job.JobCopies = int(fields.get("pykotaCopies", [0])[0])
+                job.JobOptions = self.databaseToUserCharset(fields.get("pykotaOptions", [""])[0]) 
+                job.JobHostName = fields.get("pykotaHostName", [""])[0]
+                job.JobSizeBytes = fields.get("pykotaJobSizeBytes", [0L])[0]
+                job.JobBillingCode = self.databaseToUserCharset(fields.get("pykotaBillingCode", [None])[0])
+                job.JobMD5Sum = fields.get("pykotaMD5Sum", [None])[0]
+                job.JobPages = fields.get("pykotaPages", [""])[0]
+                date = fields.get("createTimestamp", ["19700101000000"])[0]
+                year = int(date[:4])
+                month = int(date[4:6])
+                day = int(date[6:8])
+                hour = int(date[8:10])
+                minute = int(date[10:12])
+                second = int(date[12:14])
+                job.JobDate = "%04i-%02i-%02i %02i:%02i:%02i" % (year, month, day, hour, minute, second)
+                if (datelimit is None) or (job.JobDate <= datelimit) :
+                    job.UserName = fields.get("pykotaUserName")[0]
+                    job.PrinterName = fields.get("pykotaPrinterName")[0]
+                    job.Exists = 1
+                    jobs.append(job)
+            jobs.sort(lambda x, y : cmp(y.JobDate, x.JobDate))        
+            if limit :    
+                jobs = jobs[:int(limit)]
+        return jobs
+        
+    def deleteUser(self, user) :    
+        """Completely deletes an user from the Quota Storage."""
+        todelete = []    
+        result = self.doSearch("(&(objectClass=pykotaJob)(pykotaUserName=%s))" % user.Name, base=self.info["jobbase"])
+        for (ident, fields) in result :
+            todelete.append(ident)
+        if self.info["userquotabase"].lower() == "user" :
+            base = self.info["userbase"]
+        else :
+            base = self.info["userquotabase"]
+        result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaUserName=%s))" % user.Name, ["pykotaPrinterName", "pykotaUserName"], base=base)
+        for (ident, fields) in result :
+            # ensure the user print quota entry will be deleted
+            todelete.append(ident)
+            
+            # if last job of current printer was printed by the user
+            # to delete, we also need to delete the printer's last job entry.
+            printername = fields["pykotaPrinterName"][0]
+            printer = self.getPrinter(printername)
+            if printer.LastJob.UserName == user.Name :
+                todelete.append(printer.LastJob.lastjobident)
+            
+        for ident in todelete :    
+            self.doDelete(ident)
+            
+        result = self.doSearch("objectClass=pykotaAccount", None, base=user.ident, scope=ldap.SCOPE_BASE)    
+        if result :
+            fields = result[0][1]
+            for k in fields.keys() :
+                if k.startswith("pykota") :
+                    del fields[k]
+                elif k.lower() == "objectclass" :    
+                    todelete = []
+                    for i in range(len(fields[k])) :
+                        if fields[k][i].startswith("pykota") : 
+                            todelete.append(i)
+                    todelete.sort()        
+                    todelete.reverse()
+                    for i in todelete :
+                        del fields[k][i]
+            if fields.get("objectClass") or fields.get("objectclass") :
+                self.doModify(user.ident, fields, ignoreold=0)        
+            else :    
+                self.doDelete(user.ident)
+        result = self.doSearch("(&(objectClass=pykotaAccountBalance)(pykotaUserName=%s))" % user.Name, ["pykotaUserName"], base=self.info["balancebase"])
+        for (ident, fields) in result :
+            self.doDelete(ident)
+        
+    def deleteGroup(self, group) :    
+        """Completely deletes a group from the Quota Storage."""
+        if self.info["groupquotabase"].lower() == "group" :
+            base = self.info["groupbase"]
+        else :
+            base = self.info["groupquotabase"]
+        result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(pykotaGroupName=%s))" % group.Name, ["pykotaGroupName"], base=base)
+        for (ident, fields) in result :
+            self.doDelete(ident)
+        result = self.doSearch("objectClass=pykotaGroup", None, base=group.ident, scope=ldap.SCOPE_BASE)    
+        if result :
+            fields = result[0][1]
+            for k in fields.keys() :
+                if k.startswith("pykota") :
+                    del fields[k]
+                elif k.lower() == "objectclass" :    
+                    todelete = []
+                    for i in range(len(fields[k])) :
+                        if fields[k][i].startswith("pykota") : 
+                            todelete.append(i)
+                    todelete.sort()        
+                    todelete.reverse()
+                    for i in todelete :
+                        del fields[k][i]
+            if fields.get("objectClass") or fields.get("objectclass") :
+                self.doModify(group.ident, fields, ignoreold=0)        
+            else :    
+                self.doDelete(group.ident)
+                
+    def deletePrinter(self, printer) :    
+        """Completely deletes an user from the Quota Storage."""
+        result = self.doSearch("(&(objectClass=pykotaLastJob)(pykotaPrinterName=%s))" % printer.Name, base=self.info["lastjobbase"])
+        for (ident, fields) in result :
+            self.doDelete(ident)
+        result = self.doSearch("(&(objectClass=pykotaJob)(pykotaPrinterName=%s))" % printer.Name, base=self.info["jobbase"])
+        for (ident, fields) in result :
+            self.doDelete(ident)
+        if self.info["groupquotabase"].lower() == "group" :
+            base = self.info["groupbase"]
+        else :
+            base = self.info["groupquotabase"]
+        result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(pykotaPrinterName=%s))" % printer.Name, base=base)
+        for (ident, fields) in result :
+            self.doDelete(ident)
+        if self.info["userquotabase"].lower() == "user" :
+            base = self.info["userbase"]
+        else :
+            base = self.info["userquotabase"]
+        result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaPrinterName=%s))" % printer.Name, base=base)
+        for (ident, fields) in result :
+            self.doDelete(ident)
+        for parent in self.getParentPrinters(printer) :  
+            try :
+                parent.uniqueMember.remove(printer.ident)
+            except ValueError :    
+                pass
+            else :    
+                fields = {
+                           "uniqueMember" : parent.uniqueMember,
+                         }  
+                self.doModify(parent.ident, fields)         
+        self.doDelete(printer.ident)    
+        
+    def extractPrinters(self, extractonly={}) :
+        """Extracts all printer records."""
+        pname = extractonly.get("printername")
+        entries = [p for p in [self.getPrinter(name) for name in self.getAllPrintersNames(pname)] if p.Exists]
+        if entries :
+            result = [ ("dn", "printername", "priceperpage", "priceperjob", "description") ]
+            for entry in entries :
+                result.append((entry.ident, entry.Name, entry.PricePerPage, entry.PricePerJob, entry.Description))
+            return result 
+        
+    def extractUsers(self, extractonly={}) :
+        """Extracts all user records."""
+        uname = extractonly.get("username")
+        entries = [u for u in [self.getUser(name) for name in self.getAllUsersNames(uname)] if u.Exists]
+        if entries :
+            result = [ ("dn", "username", "balance", "lifetimepaid", "limitby", "email") ]
+            for entry in entries :
+                result.append((entry.ident, entry.Name, entry.AccountBalance, entry.LifeTimePaid, entry.LimitBy, entry.Email))
+            return result 
+        
+    def extractGroups(self, extractonly={}) :
+        """Extracts all group records."""
+        gname = extractonly.get("groupname")
+        entries = [g for g in [self.getGroup(name) for name in self.getAllGroupsNames(gname)] if g.Exists]
+        if entries :
+            result = [ ("dn", "groupname", "limitby", "balance", "lifetimepaid") ]
+            for entry in entries :
+                result.append((entry.ident, entry.Name, entry.LimitBy, entry.AccountBalance, entry.LifeTimePaid))
+            return result 
+        
+    def extractPayments(self, extractonly={}) :
+        """Extracts all payment records."""
+        uname = extractonly.get("username")
+        entries = [u for u in [self.getUser(name) for name in self.getAllUsersNames(uname)] if u.Exists]
+        if entries :
+            result = [ ("username", "amount", "date") ]
+            for entry in entries :
+                for (date, amount) in entry.Payments :
+                    result.append((entry.Name, amount, date))
+            return result        
+        
+    def extractUpquotas(self, extractonly={}) :
+        """Extracts all userpquota records."""
+        pname = extractonly.get("printername")
+        entries = [p for p in [self.getPrinter(name) for name in self.getAllPrintersNames(pname)] if p.Exists]
+        if entries :
+            result = [ ("username", "printername", "dn", "userdn", "printerdn", "lifepagecounter", "pagecounter", "softlimit", "hardlimit", "datelimit") ]
+            uname = extractonly.get("username")
+            for entry in entries :
+                for (user, userpquota) in self.getPrinterUsersAndQuotas(entry, names=[uname or "*"]) :
+                    result.append((user.Name, entry.Name, userpquota.ident, user.ident, entry.ident, userpquota.LifePageCounter, userpquota.PageCounter, userpquota.SoftLimit, userpquota.HardLimit, userpquota.DateLimit))
+            return result
+        
+    def extractGpquotas(self, extractonly={}) :
+        """Extracts all grouppquota records."""
+        pname = extractonly.get("printername")
+        entries = [p for p in [self.getPrinter(name) for name in self.getAllPrintersNames(pname)] if p.Exists]
+        if entries :
+            result = [ ("groupname", "printername", "dn", "groupdn", "printerdn", "lifepagecounter", "pagecounter", "softlimit", "hardlimit", "datelimit") ]
+            gname = extractonly.get("groupname")
+            for entry in entries :
+                for (group, grouppquota) in self.getPrinterGroupsAndQuotas(entry, names=[gname or "*"]) :
+                    result.append((group.Name, entry.Name, grouppquota.ident, group.ident, entry.ident, grouppquota.LifePageCounter, grouppquota.PageCounter, grouppquota.SoftLimit, grouppquota.HardLimit, grouppquota.DateLimit))
+            return result
+        
+    def extractUmembers(self, extractonly={}) :
+        """Extracts all user groups members."""
+        gname = extractonly.get("groupname")
+        entries = [g for g in [self.getGroup(name) for name in self.getAllGroupsNames(gname)] if g.Exists]
+        if entries :
+            result = [ ("groupname", "username", "groupdn", "userdn") ]
+            uname = extractonly.get("username")
+            for entry in entries :
+                for member in entry.Members :
+                    if (uname is None) or (member.Name == uname) :
+                        result.append((entry.Name, member.Name, entry.ident, member.ident))
+            return result        
+                
+    def extractPmembers(self, extractonly={}) :
+        """Extracts all printer groups members."""
+        pname = extractonly.get("printername")
+        entries = [p for p in [self.getPrinter(name) for name in self.getAllPrintersNames(pname)] if p.Exists]
+        if entries :
+            result = [ ("pgroupname", "printername", "pgroupdn", "printerdn") ]
+            pgname = extractonly.get("pgroupname")
+            for entry in entries :
+                for parent in self.getParentPrinters(entry) :
+                    if (pgname is None) or (parent.Name == pgname) :
+                        result.append((parent.Name, entry.Name, parent.ident, entry.ident))
+            return result        
+        
+    def extractHistory(self, extractonly={}) :
+        """Extracts all jobhistory records."""
+        uname = extractonly.get("username")
+        if uname :
+            user = self.getUser(uname)
+        else :    
+            user = None
+        pname = extractonly.get("printername")
+        if pname :
+            printer = self.getPrinter(pname)
+        else :    
+            printer = None
+        entries = self.retrieveHistory(user, printer, hostname=extractonly.get("hostname"), billingcode=extractonly.get("billingcode"), limit=None)
+        if entries :
+            result = [ ("username", "printername", "dn", "jobid", "pagecounter", "jobsize", "action", "jobdate", "filename", "title", "copies", "options", "jobprice", "hostname", "jobsizebytes", "md5sum", "pages", "billingcode") ] 
+            for entry in entries :
+                result.append((entry.UserName, entry.PrinterName, entry.ident, entry.JobId, entry.PrinterPageCounter, entry.JobSize, entry.JobAction, entry.JobDate, entry.JobFileName, entry.JobTitle, entry.JobCopies, entry.JobOptions, entry.JobPrice, entry.JobHostName, entry.JobSizeBytes, entry.JobMD5Sum, entry.JobPages, entry.JobBillingCode)) 
+            return result    
Index: pykota/tags/1.22/pykota/cgifuncs.py
===================================================================
--- pykota/tags/1.22/pykota/cgifuncs.py (revision 2147)
+++ pykota/tags/1.22/pykota/cgifuncs.py (revision 2147)
@@ -0,0 +1,34 @@
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+
+def getLanguagePreference() :
+    """Returns the preferred language."""
+    languages = os.environ.get("HTTP_ACCEPT_LANGUAGE", "")
+    langs = [l.strip().split(';')[0] for l in languages.split(",")]
+    return "%s_%s" % (langs[0], langs[0].upper())
+    
+def getCharsetPreference() :
+    """Returns the preferred charset."""
+    charsets = os.environ.get("HTTP_ACCEPT_CHARSET", "UTF-8")
+    charsets = [l.strip().split(';')[0] for l in charsets.split(",")]
+    return charsets[0]
Index: pykota/tags/1.22/pykota/reporter.py
===================================================================
--- pykota/tags/1.22/pykota/reporter.py (revision 2147)
+++ pykota/tags/1.22/pykota/reporter.py (revision 2147)
@@ -0,0 +1,199 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+from mx import DateTime
+
+class PyKotaReporterError(Exception):
+    """An exception for Reporter related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+    
+class BaseReporter :    
+    """Base class for all reports."""
+    def __init__(self, tool, printers, ugnames, isgroup) :
+        """Initialize local datas."""
+        self.tool = tool
+        self.printers = printers
+        self.ugnames = ugnames
+        self.isgroup = isgroup
+        
+    def getPrinterTitle(self, printer) :     
+        return (_("Report for %s quota on printer %s") % ((self.isgroup and "group") or "user", printer.Name)) + (" (%s)" % printer.Description)
+        
+    def getPrinterGraceDelay(self, printer) :    
+        return _("Pages grace time: %i days") % self.tool.config.getGraceDelay(printer.Name)
+        
+    def getPrinterPrices(self, printer) :    
+        return (_("Price per job: %.3f") % (printer.PricePerJob or 0.0), _("Price per page: %.3f") % (printer.PricePerPage or 0.0))
+            
+    def getReportHeader(self) :        
+        if self.isgroup :
+            return _("Group          overcharge   used    soft    hard    balance grace         total       paid warn")
+        else :    
+            return _("User           overcharge   used    soft    hard    balance grace         total       paid warn")
+            
+    def getPrinterRealPageCounter(self, printer) :        
+        msg = _("unknown")
+        if printer.LastJob.Exists :
+            try :
+                msg = "%9i" % printer.LastJob.PrinterPageCounter
+            except TypeError :     
+                pass
+        return _("Real : %s") % msg
+                
+    def getTotals(self, total, totalmoney) :            
+        return (_("Total : %9i") % (total or 0.0), ("%11s" % ("%7.2f" % (totalmoney or 0.0))[:11]))
+            
+    def getQuota(self, entry, quota) :
+        """Prints the quota information."""
+        lifepagecounter = int(quota.LifePageCounter or 0)
+        pagecounter = int(quota.PageCounter or 0)
+        balance = float(entry.AccountBalance or 0.0)
+        lifetimepaid = float(entry.LifeTimePaid or 0.0)
+        if not hasattr(entry, "OverCharge") :
+            overcharge = _("N/A")       # Not available for groups
+        else :    
+            overcharge = float(entry.OverCharge or 0.0)
+        if not hasattr(quota, "WarnCount") :    
+            warncount = _("N/A")        # Not available for groups
+        else :    
+            warncount = int(quota.WarnCount or 0)
+        
+        #balance
+        if entry.LimitBy and (entry.LimitBy.lower() == "balance") :    
+            if balance == 0.0 :
+                if entry.OverCharge > 0 :
+                    datelimit = "DENY"
+                    reached = "+B"
+                else :    
+                    # overcharging by a negative or nul factor means user is always allowed to print
+                    # TODO : do something when printer prices are negative as well !
+                    datelimit = ""
+                    reached = "-B"
+            elif balance < 0 :
+                datelimit = "DENY"
+                reached = "+B"
+            elif balance <= self.tool.config.getPoorMan() :
+                datelimit = "WARNING"
+                reached = "?B"
+            else :    
+                datelimit = ""
+                reached = "-B"
+
+        #balance-then-quota
+        elif entry.LimitBy and (entry.LimitBy.lower() == "balance-then-quota") :
+            if balance <= 0 :
+                if (quota.HardLimit is not None) and (pagecounter >= quota.HardLimit) :
+                    datelimit = "DENY"
+                elif (quota.HardLimit is None) and (quota.SoftLimit is not None) and (pagecounter >= quota.SoftLimit) :
+                    datelimit = "DENY"
+                elif quota.DateLimit is not None :
+                    now = DateTime.now()
+                    datelimit = DateTime.ISO.ParseDateTime(quota.DateLimit)
+                    if now >= datelimit :
+                        datelimit = "QUOTA_DENY"
+                else :
+                    datelimit = ""
+                reached = ( ((datelimit == "DENY" ) and "+B") or "-Q")
+                datelimit = ( ((datelimit == "QUOTA_DENY") and "DENY") or datelimit)
+            elif balance <= self.tool.config.getPoorMan() :
+                if (quota.HardLimit is not None) and (pagecounter >= quota.HardLimit) :
+                    datelimit = "WARNING"
+                elif (quota.HardLimit is None) and (quota.SoftLimit is not None) and (pagecounter >= quota.SoftLimit) :
+                    datelimit = "WARNING"
+                elif quota.DateLimit is not None :
+                    now = DateTime.now()
+                    datelimit = DateTime.ISO.ParseDateTime(quota.DateLimit)
+                    if now >= datelimit :
+                        datelimit = "QUOTA_DENY"
+                else :
+                    datelimit = ""
+                reached = ( ((datelimit == "WARNING" ) and "?B") or "+Q")
+                datelimit = ( ((datelimit == "QUOTA_DENY") and "WARNING") or datelimit)
+            else :
+                datelimit = ""
+                reached = "-B"
+
+        #Quota-then-balance
+        elif entry.LimitBy and (entry.LimitBy.lower() == "quota-then-balance") :
+            if (quota.HardLimit is not None) and (pagecounter >= quota.HardLimit) :
+                datelimit = "DENY"
+            elif (quota.HardLimit is None) and (quota.SoftLimit is not None) and (pagecounter >= quota.SoftLimit) :
+                datelimit = "DENY"
+            elif quota.DateLimit is not None :
+                now = DateTime.now()
+                datelimit = DateTime.ISO.ParseDateTime(quota.DateLimit)
+                if now >= datelimit :
+                    datelimit = "DENY"
+            else :
+                datelimit = ""
+                
+            reached = (((quota.SoftLimit is not None) and (pagecounter >= quota.SoftLimit) and "+") or "-") + "Q"
+
+            if (datelimit == "DENY") and (reached == "-Q") and (balance > self.tool.config.getPoorMan()) :
+                datelimit = ""
+                reached = "-B"
+            else :
+                reached = (((datelimit == "DENY") and (self.tool.config.getPoorMan() < balance ) and "-B") or reached)
+                if (datelimit == "DENY") and (self.tool.config.getPoorMan() < balance) :
+                    datelimit = ""
+                reached = (((datelimit == "DENY") and (0.0 < balance <= self.tool.config.getPoorMan()) and "?B") or reached)
+                datelimit = (((datelimit == "DENY") and (0.0 < balance <= self.tool.config.getPoorMan()) and "WARNING") or datelimit)
+
+        #Quota
+        else :
+            if (quota.HardLimit is not None) and (pagecounter >= quota.HardLimit) :    
+                datelimit = "DENY"
+            elif (quota.HardLimit is None) and (quota.SoftLimit is not None) and (pagecounter >= quota.SoftLimit) :
+                datelimit = "DENY"
+            elif quota.DateLimit is not None :
+                now = DateTime.now()
+                datelimit = DateTime.ISO.ParseDateTime(quota.DateLimit)
+                if now >= datelimit :
+                    datelimit = "DENY"
+            else :    
+                datelimit = ""
+            reached = (((quota.SoftLimit is not None) and (pagecounter >= quota.SoftLimit) and "+") or "-") + "Q"
+            
+        strbalance = ("%5.2f" % balance)[:10]
+        strlifetimepaid = ("%6.2f" % lifetimepaid)[:10]
+        strovercharge = ("%5s" % overcharge)[:5]
+        strwarncount = ("%4s" % warncount)[:4]
+        return (lifepagecounter, lifetimepaid, entry.Name, reached, \
+                pagecounter, str(quota.SoftLimit), str(quota.HardLimit), \
+                strbalance, str(datelimit)[:10], lifepagecounter, \
+                strlifetimepaid, strovercharge, strwarncount)
+        
+def openReporter(tool, reporttype, printers, ugnames, isgroup) :
+    """Returns a reporter instance of the proper reporter."""
+    try :
+        exec "from pykota.reporters import %s as reporterbackend" % reporttype.lower()
+    except ImportError :
+        raise PyKotaReporterError, _("Unsupported reporter backend %s") % reporttype
+    else :    
+        return reporterbackend.Reporter(tool, printers, ugnames, isgroup)
Index: pykota/tags/1.22/pykota/storage.py
===================================================================
--- pykota/tags/1.22/pykota/storage.py (revision 2217)
+++ pykota/tags/1.22/pykota/storage.py (revision 2217)
@@ -0,0 +1,604 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+class PyKotaStorageError(Exception):
+    """An exception for Quota Storage related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+        
+class StorageObject :
+    """Object present in the Quota Storage."""
+    def __init__(self, parent) :
+        "Initialize minimal data."""
+        self.parent = parent
+        self.ident = None
+        self.Exists = 0
+        
+class StorageUser(StorageObject) :        
+    """User class."""
+    def __init__(self, parent, name) :
+        StorageObject.__init__(self, parent)
+        self.Name = name
+        self.LimitBy = None
+        self.AccountBalance = None
+        self.LifeTimePaid = None
+        self.Email = None
+        self.OverCharge = 1.0
+        self.Payments = [] # TODO : maybe handle this smartly for SQL, for now just don't retrieve them
+        
+    def consumeAccountBalance(self, amount) :     
+        """Consumes an amount of money from the user's account balance."""
+        self.parent.decreaseUserAccountBalance(self, amount)
+        self.AccountBalance = float(self.AccountBalance or 0.0) - amount
+        
+    def setAccountBalance(self, balance, lifetimepaid) :    
+        """Sets the user's account balance in case he pays more money."""
+        diff = float(lifetimepaid or 0.0) - float(self.LifeTimePaid or 0.0)
+        self.parent.beginTransaction()
+        try :
+            self.parent.writeUserAccountBalance(self, balance, lifetimepaid)
+            self.parent.writeNewPayment(self, diff)
+        except PyKotaStorageError, msg :    
+            self.parent.rollbackTransaction()
+            raise PyKotaStorageError, msg
+        else :    
+            self.parent.commitTransaction()
+            self.AccountBalance = balance
+            self.LifeTimePaid = lifetimepaid
+        
+    def setLimitBy(self, limitby) :    
+        """Sets the user's limiting factor."""
+        try :
+            limitby = limitby.lower()
+        except AttributeError :    
+            limitby = "quota"
+        if limitby in ["quota", "balance", "quota-then-balance", "balance-then-quota"] :
+            self.parent.writeUserLimitBy(self, limitby)
+            self.LimitBy = limitby
+        
+    def setOverChargeFactor(self, factor) :    
+        """Sets the user's overcharging coefficient."""
+        self.parent.writeUserOverCharge(self, factor)
+        self.OverCharge = factor
+        
+    def delete(self) :    
+        """Deletes an user from the Quota Storage."""
+        self.parent.beginTransaction()
+        try :
+            self.parent.deleteUser(self)
+        except PyKotaStorageError, msg :    
+            self.parent.rollbackTransaction()
+            raise PyKotaStorageError, msg
+        else :    
+            self.parent.commitTransaction()
+        
+class StorageGroup(StorageObject) :        
+    """User class."""
+    def __init__(self, parent, name) :
+        StorageObject.__init__(self, parent)
+        self.Name = name
+        self.LimitBy = None
+        self.AccountBalance = None
+        self.LifeTimePaid = None
+        
+    def setLimitBy(self, limitby) :    
+        """Sets the user's limiting factor."""
+        try :
+            limitby = limitby.lower()
+        except AttributeError :    
+            limitby = "quota"
+        if limitby in ["quota", "balance"] :
+            self.parent.writeGroupLimitBy(self, limitby)
+            self.LimitBy = limitby
+        
+    def delete(self) :    
+        """Deletes a group from the Quota Storage."""
+        self.parent.beginTransaction()
+        try :
+            self.parent.deleteGroup(self)
+        except PyKotaStorageError, msg :    
+            self.parent.rollbackTransaction()
+            raise PyKotaStorageError, msg
+        else :    
+            self.parent.commitTransaction()
+        
+class StoragePrinter(StorageObject) :
+    """Printer class."""
+    def __init__(self, parent, name) :
+        StorageObject.__init__(self, parent)
+        self.Name = name
+        self.PricePerPage = None
+        self.PricePerJob = None
+        self.Description = None
+        self.Coefficients = None
+        
+    def __getattr__(self, name) :    
+        """Delays data retrieval until it's really needed."""
+        if name == "LastJob" : 
+            self.LastJob = self.parent.getPrinterLastJob(self)
+            return self.LastJob
+        else :
+            raise AttributeError, name
+            
+    def addJobToHistory(self, jobid, user, pagecounter, action, jobsize=None, jobprice=None, filename=None, title=None, copies=None, options=None, clienthost=None, jobsizebytes=None, jobmd5sum=None, jobpages=None, jobbilling=None) :
+        """Adds a job to the printer's history."""
+        self.parent.writeJobNew(self, user, jobid, pagecounter, action, jobsize, jobprice, filename, title, copies, options, clienthost, jobsizebytes, jobmd5sum, jobpages, jobbilling)
+        # TODO : update LastJob object ? Probably not needed.
+        
+    def addPrinterToGroup(self, printer) :    
+        """Adds a printer to a printer group."""
+        if (printer not in self.parent.getParentPrinters(self)) and (printer.ident != self.ident) :
+            self.parent.writePrinterToGroup(self, printer)
+            # TODO : reset cached value for printer parents, or add new parent to cached value
+            
+    def delPrinterFromGroup(self, printer) :    
+        """Deletes a printer from a printer group."""
+        self.parent.removePrinterFromGroup(self, printer)
+        # TODO : reset cached value for printer parents, or add new parent to cached value
+        
+    def setPrices(self, priceperpage = None, priceperjob = None) :    
+        """Sets the printer's prices."""
+        if priceperpage is None :
+            priceperpage = self.PricePerPage or 0.0
+        else :    
+            self.PricePerPage = float(priceperpage)
+        if priceperjob is None :    
+            priceperjob = self.PricePerJob or 0.0
+        else :    
+            self.PricePerJob = float(priceperjob)
+        self.parent.writePrinterPrices(self)
+        
+    def setDescription(self, description = None) :    
+        """Sets the printer's prices."""
+        if description is None :
+            description = self.Description
+        else :    
+            self.Description = str(description)
+        self.parent.writePrinterDescription(self)
+        
+    def delete(self) :    
+        """Deletes a printer from the Quota Storage."""
+        self.parent.beginTransaction()
+        try :
+            self.parent.deletePrinter(self)
+        except PyKotaStorageError, msg :    
+            self.parent.rollbackTransaction()
+            raise PyKotaStorageError, msg
+        else :    
+            self.parent.commitTransaction()
+        
+class StorageUserPQuota(StorageObject) :
+    """User Print Quota class."""
+    def __init__(self, parent, user, printer) :
+        StorageObject.__init__(self, parent)
+        self.User = user
+        self.Printer = printer
+        self.PageCounter = None
+        self.LifePageCounter = None
+        self.SoftLimit = None
+        self.HardLimit = None
+        self.DateLimit = None
+        self.WarnCount = None
+        
+    def __getattr__(self, name) :    
+        """Delays data retrieval until it's really needed."""
+        if name == "ParentPrintersUserPQuota" : 
+            self.ParentPrintersUserPQuota = (self.User.Exists and self.Printer.Exists and self.parent.getParentPrintersUserPQuota(self)) or []
+            return self.ParentPrintersUserPQuota
+        else :
+            raise AttributeError, name
+        
+    def setDateLimit(self, datelimit) :    
+        """Sets the date limit for this quota."""
+        date = "%04i-%02i-%02i %02i:%02i:%02i" % (datelimit.year, datelimit.month, datelimit.day, datelimit.hour, datelimit.minute, datelimit.second)
+        self.parent.writeUserPQuotaDateLimit(self, date)
+        self.DateLimit = date
+        
+    def setLimits(self, softlimit, hardlimit) :    
+        """Sets the soft and hard limit for this quota."""
+        self.parent.writeUserPQuotaLimits(self, softlimit, hardlimit)
+        self.SoftLimit = softlimit
+        self.HardLimit = hardlimit
+        self.DateLimit = None
+        self.WarnCount = 0
+        
+    def setUsage(self, used) :
+        """Sets the PageCounter and LifePageCounter to used, or if used is + or - prefixed, changes the values of {Life,}PageCounter by that amount."""
+        vused = int(used)
+        if used.startswith("+") or used.startswith("-") :
+            self.parent.beginTransaction()
+            try :
+                self.parent.increaseUserPQuotaPagesCounters(self, vused)
+                self.parent.writeUserPQuotaDateLimit(self, None)
+                self.parent.writeUserPQuotaWarnCount(self, 0)
+            except PyKotaStorageError, msg :    
+                self.parent.rollbackTransaction()
+                raise PyKotaStorageError, msg
+            else :
+                self.parent.commitTransaction()
+            self.PageCounter += vused
+            self.LifePageCounter += vused
+        else :
+            self.parent.writeUserPQuotaPagesCounters(self, vused, vused)
+            self.PageCounter = self.LifePageCounter = vused
+        self.DateLimit = None
+        self.WarnCount = 0
+
+    def incDenyBannerCounter(self) :
+        """Increment the deny banner counter for this user quota."""
+        self.parent.increaseUserPQuotaWarnCount(self)
+        self.WarnCount = (self.WarnCount or 0) + 1
+        
+    def resetDenyBannerCounter(self) :
+        """Resets the deny banner counter for this user quota."""
+        self.parent.writeUserPQuotaWarnCount(self, 0)
+        self.WarnCount = 0
+        
+    def reset(self) :    
+        """Resets page counter to 0."""
+        self.parent.writeUserPQuotaPagesCounters(self, 0, int(self.LifePageCounter or 0))
+        self.PageCounter = 0
+        self.DateLimit = None
+        
+    def hardreset(self) :    
+        """Resets actual and life time page counters to 0."""
+        self.parent.writeUserPQuotaPagesCounters(self, 0, 0)
+        self.PageCounter = self.LifePageCounter = 0
+        self.DateLimit = None
+        
+    def computeJobPrice(self, jobsize) :    
+        """Computes the job price as the sum of all parent printers' prices + current printer's ones."""
+        totalprice = 0.0    
+        if jobsize :
+            if self.User.OverCharge != 0.0 :    # optimization, but TODO : beware of rounding errors
+                for upq in [ self ] + self.ParentPrintersUserPQuota :
+                    price = (float(upq.Printer.PricePerPage or 0.0) * jobsize) + float(upq.Printer.PricePerJob or 0.0)
+                    totalprice += price
+        if self.User.OverCharge != 1.0 : # TODO : beware of rounding errors
+            overcharged = totalprice * self.User.OverCharge        
+            self.parent.tool.printInfo("Overcharging %s by a factor of %s ===> User %s will be charged for %s units." % (totalprice, self.User.OverCharge, self.User.Name, overcharged))
+            return overcharged
+        else :    
+            return totalprice
+            
+    def increasePagesUsage(self, jobsize) :
+        """Increase the value of used pages and money."""
+        jobprice = self.computeJobPrice(jobsize)
+        if jobsize :
+            self.parent.beginTransaction()
+            try :
+                if jobprice :
+                    self.User.consumeAccountBalance(jobprice)
+                for upq in [ self ] + self.ParentPrintersUserPQuota :
+                    self.parent.increaseUserPQuotaPagesCounters(upq, jobsize)
+                    upq.PageCounter = int(upq.PageCounter or 0) + jobsize
+                    upq.LifePageCounter = int(upq.LifePageCounter or 0) + jobsize
+            except PyKotaStorageError, msg :    
+                self.parent.rollbackTransaction()
+                raise PyKotaStorageError, msg
+            else :    
+                self.parent.commitTransaction()
+        return jobprice
+        
+class StorageGroupPQuota(StorageObject) :
+    """Group Print Quota class."""
+    def __init__(self, parent, group, printer) :
+        StorageObject.__init__(self, parent)
+        self.Group = group
+        self.Printer = printer
+        self.PageCounter = None
+        self.LifePageCounter = None
+        self.SoftLimit = None
+        self.HardLimit = None
+        self.DateLimit = None
+        
+    def __getattr__(self, name) :    
+        """Delays data retrieval until it's really needed."""
+        if name == "ParentPrintersGroupPQuota" : 
+            self.ParentPrintersGroupPQuota = (self.Group.Exists and self.Printer.Exists and self.parent.getParentPrintersGroupPQuota(self)) or []
+            return self.ParentPrintersGroupPQuota
+        else :
+            raise AttributeError, name
+        
+    def reset(self) :    
+        """Resets page counter to 0."""
+        self.parent.beginTransaction()
+        try :
+            for user in self.parent.getGroupMembers(self.Group) :
+                uq = self.parent.getUserPQuota(user, self.Printer)
+                uq.reset()
+            self.parent.writeGroupPQuotaDateLimit(self, None)
+        except PyKotaStorageError, msg :    
+            self.parent.rollbackTransaction()
+            raise PyKotaStorageError, msg
+        else :    
+            self.parent.commitTransaction()
+        self.PageCounter = 0
+        self.DateLimit = None
+        
+    def hardreset(self) :    
+        """Resets actual and life time page counters to 0."""
+        self.parent.beginTransaction()
+        try :
+            for user in self.parent.getGroupMembers(self.Group) :
+                uq = self.parent.getUserPQuota(user, self.Printer)
+                uq.hardreset()
+            self.parent.writeGroupPQuotaDateLimit(self, None)
+        except PyKotaStorageError, msg :    
+            self.parent.rollbackTransaction()
+            raise PyKotaStorageError, msg
+        else :    
+            self.parent.commitTransaction()
+        self.PageCounter = self.LifePageCounter = 0
+        self.DateLimit = None
+        
+    def setDateLimit(self, datelimit) :    
+        """Sets the date limit for this quota."""
+        date = "%04i-%02i-%02i %02i:%02i:%02i" % (datelimit.year, datelimit.month, datelimit.day, datelimit.hour, datelimit.minute, datelimit.second)
+        self.parent.writeGroupPQuotaDateLimit(self, date)
+        self.DateLimit = date
+        
+    def setLimits(self, softlimit, hardlimit) :    
+        """Sets the soft and hard limit for this quota."""
+        self.parent.writeGroupPQuotaLimits(self, softlimit, hardlimit)
+        self.SoftLimit = softlimit
+        self.HardLimit = hardlimit
+        self.DateLimit = None
+        
+class StorageJob(StorageObject) :
+    """Printer's Job class."""
+    def __init__(self, parent) :
+        StorageObject.__init__(self, parent)
+        self.UserName = None
+        self.PrinterName = None
+        self.JobId = None
+        self.PrinterPageCounter = None
+        self.JobSizeBytes = None
+        self.JobSize = None
+        self.JobAction = None
+        self.JobDate = None
+        self.JobPrice = None
+        self.JobFileName = None
+        self.JobTitle = None
+        self.JobCopies = None
+        self.JobOptions = None
+        self.JobHostName = None
+        self.JobMD5Sum = None
+        self.JobPages = None
+        self.JobBillingCode = None
+        
+    def __getattr__(self, name) :    
+        """Delays data retrieval until it's really needed."""
+        if name == "User" : 
+            self.User = self.parent.getUser(self.UserName)
+            return self.User
+        elif name == "Printer" :    
+            self.Printer = self.parent.getPrinter(self.PrinterName)
+            return self.Printer
+        else :
+            raise AttributeError, name
+        
+class StorageLastJob(StorageJob) :
+    """Printer's Last Job class."""
+    def __init__(self, parent, printer) :
+        StorageJob.__init__(self, parent)
+        self.PrinterName = printer.Name # not needed
+        self.Printer = printer
+        
+class BaseStorage :
+    def __init__(self, pykotatool) :
+        """Opens the storage connection."""
+        self.closed = 1
+        self.tool = pykotatool
+        self.usecache = pykotatool.config.getCaching()
+        self.disablehistory = pykotatool.config.getDisableHistory()
+        self.privacy = pykotatool.config.getPrivacy()
+        if self.privacy :
+            pykotatool.logdebug("Jobs' title, filename and options will be hidden because of privacy concerns.")
+        if self.usecache :
+            self.tool.logdebug("Caching enabled.")
+            self.caches = { "USERS" : {}, "GROUPS" : {}, "PRINTERS" : {}, "USERPQUOTAS" : {}, "GROUPPQUOTAS" : {}, "JOBS" : {}, "LASTJOBS" : {} }
+        
+    def close(self) :    
+        """Must be overriden in children classes."""
+        raise RuntimeError, "BaseStorage.close() must be overriden !"
+        
+    def __del__(self) :        
+        """Ensures that the database connection is closed."""
+        self.close()
+        
+    def getFromCache(self, cachetype, key) :
+        """Tries to extract something from the cache."""
+        if self.usecache :
+            entry = self.caches[cachetype].get(key)
+            if entry is not None :
+                self.tool.logdebug("Cache hit (%s->%s)" % (cachetype, key))
+            else :    
+                self.tool.logdebug("Cache miss (%s->%s)" % (cachetype, key))
+            return entry    
+            
+    def cacheEntry(self, cachetype, key, value) :        
+        """Puts an entry in the cache."""
+        if self.usecache and getattr(value, "Exists", 0) :
+            self.caches[cachetype][key] = value
+            self.tool.logdebug("Cache store (%s->%s)" % (cachetype, key))
+            
+    def getUser(self, username) :        
+        """Returns the user from cache."""
+        user = self.getFromCache("USERS", username)
+        if user is None :
+            user = self.getUserFromBackend(username)
+            self.cacheEntry("USERS", username, user)
+        return user    
+        
+    def getGroup(self, groupname) :        
+        """Returns the group from cache."""
+        group = self.getFromCache("GROUPS", groupname)
+        if group is None :
+            group = self.getGroupFromBackend(groupname)
+            self.cacheEntry("GROUPS", groupname, group)
+        return group    
+        
+    def getPrinter(self, printername) :        
+        """Returns the printer from cache."""
+        printer = self.getFromCache("PRINTERS", printername)
+        if printer is None :
+            printer = self.getPrinterFromBackend(printername)
+            self.cacheEntry("PRINTERS", printername, printer)
+        return printer    
+        
+    def getUserPQuota(self, user, printer) :        
+        """Returns the user quota information from cache."""
+        useratprinter = "%s@%s" % (user.Name, printer.Name)
+        upquota = self.getFromCache("USERPQUOTAS", useratprinter)
+        if upquota is None :
+            upquota = self.getUserPQuotaFromBackend(user, printer)
+            self.cacheEntry("USERPQUOTAS", useratprinter, upquota)
+        return upquota    
+        
+    def getGroupPQuota(self, group, printer) :        
+        """Returns the group quota information from cache."""
+        groupatprinter = "%s@%s" % (group.Name, printer.Name)
+        gpquota = self.getFromCache("GROUPPQUOTAS", groupatprinter)
+        if gpquota is None :
+            gpquota = self.getGroupPQuotaFromBackend(group, printer)
+            self.cacheEntry("GROUPPQUOTAS", groupatprinter, gpquota)
+        return gpquota    
+        
+    def getPrinterLastJob(self, printer) :        
+        """Extracts last job information for a given printer from cache."""
+        lastjob = self.getFromCache("LASTJOBS", printer.Name)
+        if lastjob is None :
+            lastjob = self.getPrinterLastJobFromBackend(printer)
+            self.cacheEntry("LASTJOBS", printer.Name, lastjob)
+        return lastjob    
+        
+    def getParentPrinters(self, printer) :    
+        """Extracts parent printers information for a given printer from cache."""
+        if self.usecache :
+            if not hasattr(printer, "Parents") :
+                self.tool.logdebug("Cache miss (%s->Parents)" % printer.Name)
+                printer.Parents = self.getParentPrintersFromBackend(printer)
+                self.tool.logdebug("Cache store (%s->Parents)" % printer.Name)
+            else :
+                self.tool.logdebug("Cache hit (%s->Parents)" % printer.Name)
+        else :        
+            printer.Parents = self.getParentPrintersFromBackend(printer)
+        for parent in printer.Parents[:] :    
+            printer.Parents.extend(self.getParentPrinters(parent))
+        uniquedic = {}    
+        for parent in printer.Parents :
+            uniquedic[parent.Name] = parent
+        printer.Parents = uniquedic.values()    
+        return printer.Parents
+        
+    def getGroupMembers(self, group) :        
+        """Returns the group's members list from in-group cache."""
+        if self.usecache :
+            if not hasattr(group, "Members") :
+                self.tool.logdebug("Cache miss (%s->Members)" % group.Name)
+                group.Members = self.getGroupMembersFromBackend(group)
+                self.tool.logdebug("Cache store (%s->Members)" % group.Name)
+            else :
+                self.tool.logdebug("Cache hit (%s->Members)" % group.Name)
+        else :        
+            group.Members = self.getGroupMembersFromBackend(group)
+        return group.Members    
+        
+    def getUserGroups(self, user) :        
+        """Returns the user's groups list from in-user cache."""
+        if self.usecache :
+            if not hasattr(user, "Groups") :
+                self.tool.logdebug("Cache miss (%s->Groups)" % user.Name)
+                user.Groups = self.getUserGroupsFromBackend(user)
+                self.tool.logdebug("Cache store (%s->Groups)" % user.Name)
+            else :
+                self.tool.logdebug("Cache hit (%s->Groups)" % user.Name)
+        else :        
+            user.Groups = self.getUserGroupsFromBackend(user)
+        return user.Groups   
+        
+    def getParentPrintersUserPQuota(self, userpquota) :     
+        """Returns all user print quota on the printer and all its parents recursively."""
+        upquotas = [ ]
+        for printer in self.getParentPrinters(userpquota.Printer) :
+            upq = self.getUserPQuota(userpquota.User, printer)
+            if upq.Exists :
+                upquotas.append(upq)
+        return upquotas        
+        
+    def getParentPrintersGroupPQuota(self, grouppquota) :     
+        """Returns all group print quota on the printer and all its parents recursively."""
+        gpquotas = [ ]
+        for printer in self.getParentPrinters(grouppquota.Printer) :
+            gpq = self.getGroupPQuota(grouppquota.Group, printer)
+            if gpq.Exists :
+                gpquotas.append(gpq)
+        return gpquotas        
+        
+    def databaseToUserCharset(self, text) :
+        """Converts from database format (UTF-8) to user's charset."""
+        if text is not None :
+            try :
+                return unicode(text, "UTF-8").encode(self.tool.getCharset()) 
+            except UnicodeError :    
+                try :
+                    # Incorrect locale settings ?
+                    return unicode(text, "UTF-8").encode("ISO-8859-15") 
+                except UnicodeError :    
+                    pass
+        return text
+        
+    def userCharsetToDatabase(self, text) :
+        """Converts from user's charset to database format (UTF-8)."""
+        if text is not None :
+            try :
+                return unicode(text, self.tool.getCharset()).encode("UTF-8") 
+            except UnicodeError :    
+                try :
+                    # Incorrect locale settings ?
+                    return unicode(text, "ISO-8859-15").encode("UTF-8") 
+                except UnicodeError :    
+                    pass
+        return text
+        
+def openConnection(pykotatool) :
+    """Returns a connection handle to the appropriate Quota Storage Database."""
+    backendinfo = pykotatool.config.getStorageBackend()
+    backend = backendinfo["storagebackend"]
+    try :
+        exec "from pykota.storages import %s as storagebackend" % backend.lower()
+    except ImportError :
+        raise PyKotaStorageError, _("Unsupported quota storage backend %s") % backend
+    else :    
+        host = backendinfo["storageserver"]
+        database = backendinfo["storagename"]
+        admin = backendinfo["storageadmin"] or backendinfo["storageuser"]
+        adminpw = backendinfo["storageadminpw"] or backendinfo["storageuserpw"]
+        return storagebackend.Storage(pykotatool, host, database, admin, adminpw)
+
Index: pykota/tags/1.22/pykota/config.py
===================================================================
--- pykota/tags/1.22/pykota/config.py (revision 2147)
+++ pykota/tags/1.22/pykota/config.py (revision 2147)
@@ -0,0 +1,437 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+import ConfigParser
+
+class PyKotaConfigError(Exception):
+    """An exception for PyKota config related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+    
+class PyKotaConfig :
+    """A class to deal with PyKota's configuration."""
+    def __init__(self, directory) :
+        """Reads and checks the configuration file."""
+        self.isAdmin = 0
+        self.directory = directory
+        self.filename = os.path.join(directory, "pykota.conf")
+        if not os.path.isfile(self.filename) :
+            raise PyKotaConfigError, _("Configuration file %s not found.") % self.filename
+        self.config = ConfigParser.ConfigParser()
+        self.config.read([self.filename])
+            
+    def isTrue(self, option) :        
+        """Returns 1 if option is set to true, else 0."""
+        if (option is not None) and (option.upper().strip() in ['Y', 'YES', '1', 'ON', 'T', 'TRUE']) :
+            return 1
+        else :    
+            return 0
+                        
+    def getPrinterNames(self) :    
+        """Returns the list of configured printers, i.e. all sections names minus 'global'."""
+        return [pname for pname in self.config.sections() if pname != "global"]
+        
+    def getGlobalOption(self, option, ignore=0) :    
+        """Returns an option from the global section, or raises a PyKotaConfigError if ignore is not set, else returns None."""
+        try :
+            return self.config.get("global", option, raw=1)
+        except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) :    
+            if ignore :
+                return
+            else :
+                raise PyKotaConfigError, _("Option %s not found in section global of %s") % (option, self.filename)
+                
+    def getPrinterOption(self, printername, option) :    
+        """Returns an option from the printer section, or the global section, or raises a PyKotaConfigError."""
+        globaloption = self.getGlobalOption(option, ignore=1)
+        try :
+            return self.config.get(printername, option, raw=1)
+        except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) :    
+            if globaloption is not None :
+                return globaloption
+            else :
+                raise PyKotaConfigError, _("Option %s not found in section %s of %s") % (option, printername, self.filename)
+        
+    def getStorageBackend(self) :    
+        """Returns the storage backend information as a Python mapping."""        
+        backendinfo = {}
+        for option in [ "storagebackend", "storageserver", \
+                        "storagename", "storageuser", \
+                      ] :
+            backendinfo[option] = self.getGlobalOption(option)
+        backendinfo["storageuserpw"] = self.getGlobalOption("storageuserpw", ignore=1)  # password is optional
+        backendinfo["storageadmin"] = None
+        backendinfo["storageadminpw"] = None
+        adminconf = ConfigParser.ConfigParser()
+        filename = os.path.join(self.directory, "pykotadmin.conf")
+        adminconf.read([filename])
+        if adminconf.sections() : # were we able to read the file ?
+            try :
+                backendinfo["storageadmin"] = adminconf.get("global", "storageadmin", raw=1)
+            except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) :    
+                raise PyKotaConfigError, _("Option %s not found in section global of %s") % ("storageadmin", filename)
+            else :    
+                self.isAdmin = 1 # We are a PyKota administrator
+            try :
+                backendinfo["storageadminpw"] = adminconf.get("global", "storageadminpw", raw=1)
+            except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) :    
+                pass # Password is optional
+        return backendinfo
+        
+    def getLDAPInfo(self) :    
+        """Returns some hints for the LDAP backend."""        
+        ldapinfo = {}
+        for option in [ "userbase", "userrdn", \
+                        "balancebase", "balancerdn", \
+                        "groupbase", "grouprdn", "groupmembers", \
+                        "printerbase", "printerrdn", \
+                        "userquotabase", "groupquotabase", \
+                        "jobbase", "lastjobbase", \
+                        "newuser", "newgroup", \
+                        "usermail", \
+                      ] :
+            ldapinfo[option] = self.getGlobalOption(option).strip()
+        for field in ["newuser", "newgroup"] :
+            if ldapinfo[field].lower().startswith('attach(') :
+                ldapinfo[field] = ldapinfo[field][7:-1]
+                
+        # should we use TLS, by default (if unset) value is NO        
+        ldapinfo["ldaptls"] = self.isTrue(self.getGlobalOption("ldaptls", ignore=1))
+        ldapinfo["cacert"] = self.getGlobalOption("cacert", ignore=1)
+        if ldapinfo["cacert"] :
+            ldapinfo["cacert"] = ldapinfo["cacert"].strip()
+        if ldapinfo["ldaptls"] :    
+            if not os.access(ldapinfo["cacert"] or "", os.R_OK) :
+                raise PyKotaConfigError, _("Option ldaptls is set, but certificate %s is not readable.") % str(ldapinfo["cacert"])
+        return ldapinfo
+        
+    def getLoggingBackend(self) :    
+        """Returns the logging backend information."""
+        validloggers = [ "stderr", "system" ] 
+        try :
+            logger = self.getGlobalOption("logger").lower()
+        except PyKotaConfigError :    
+            logger = "system"
+        if logger not in validloggers :             
+            raise PyKotaConfigError, _("Option logger only supports values in %s") % str(validloggers)
+        return logger    
+        
+    def getAccounterBackend(self, printername) :    
+        """Returns the accounter backend to use for a given printer.
+        
+           if it is not set, it defaults to 'hardware' which means ask printer
+           for its internal lifetime page counter.
+        """   
+        validaccounters = [ "hardware", "software" ]     
+        fullaccounter = self.getPrinterOption(printername, "accounter").strip()
+        flower = fullaccounter.lower()
+        if flower.startswith("software") or flower.startswith("hardware") :    
+            try :
+                (accounter, args) = [x.strip() for x in fullaccounter.split('(', 1)]
+            except ValueError :    
+                raise PyKotaConfigError, _("Invalid accounter %s for printer %s") % (fullaccounter, printername)
+            if args.endswith(')') :
+                args = args[:-1].strip()
+            if (accounter == "hardware") and not args :
+                raise PyKotaConfigError, _("Invalid accounter %s for printer %s") % (fullaccounter, printername)
+            return (accounter.lower(), args)    
+        else :
+            raise PyKotaConfigError, _("Option accounter in section %s only supports values in %s") % (printername, str(validaccounters))
+        
+    def getPreHook(self, printername) :    
+        """Returns the prehook command line to launch, or None if unset."""
+        try :
+            return self.getPrinterOption(printername, "prehook").strip()
+        except PyKotaConfigError :    
+            return      # No command to launch in the pre-hook
+            
+    def getPostHook(self, printername) :    
+        """Returns the posthook command line to launch, or None if unset."""
+        try :
+            return self.getPrinterOption(printername, "posthook").strip()
+        except PyKotaConfigError :    
+            return      # No command to launch in the post-hook
+            
+    def getPrinterEnforcement(self, printername) :    
+        """Returns if quota enforcement should be strict or laxist for the current printer."""
+        validenforcements = [ "STRICT", "LAXIST" ]     
+        try :
+            enforcement = self.getPrinterOption(printername, "enforcement")
+        except PyKotaConfigError :    
+            return "LAXIST"
+        else :    
+            enforcement = enforcement.upper()
+            if enforcement not in validenforcements :
+                raise PyKotaConfigError, _("Option enforcement in section %s only supports values in %s") % (printername, str(validenforcements))
+            return enforcement    
+            
+    def getPrinterOnAccounterError(self, printername) :    
+        """Returns what must be done whenever the accounter fails."""
+        validactions = [ "CONTINUE", "STOP" ]     
+        try :
+            action = self.getPrinterOption(printername, "onaccountererror")
+        except PyKotaConfigError :    
+            return "STOP"
+        else :    
+            action = action.upper()
+            if action not in validactions :
+                raise PyKotaConfigError, _("Option onaccountererror in section %s only supports values in %s") % (printername, str(validactions))
+            return action  
+            
+    def getPrinterPolicy(self, printername) :    
+        """Returns the default policy for the current printer."""
+        validpolicies = [ "ALLOW", "DENY", "EXTERNAL" ]     
+        try :
+            fullpolicy = self.getPrinterOption(printername, "policy")
+        except PyKotaConfigError :    
+            return ("DENY", None)
+        else :    
+            try :
+                policy = [x.strip() for x in fullpolicy.split('(', 1)]
+            except ValueError :    
+                raise PyKotaConfigError, _("Invalid policy %s for printer %s") % (fullpolicy, printername)
+            if len(policy) == 1 :    
+                policy.append("")
+            (policy, args) = policy    
+            if args.endswith(')') :
+                args = args[:-1]
+            policy = policy.upper()    
+            if (policy == "EXTERNAL") and not args :
+                raise PyKotaConfigError, _("Invalid policy %s for printer %s") % (fullpolicy, printername)
+            if policy not in validpolicies :
+                raise PyKotaConfigError, _("Option policy in section %s only supports values in %s") % (printername, str(validpolicies))
+            return (policy, args)
+        
+    def getCrashRecipient(self) :    
+        """Returns the email address of the software crash messages recipient."""
+        try :
+            return self.getGlobalOption("crashrecipient")
+        except :    
+            return
+            
+    def getSMTPServer(self) :    
+        """Returns the SMTP server to use to send messages to users."""
+        try :
+            return self.getGlobalOption("smtpserver")
+        except PyKotaConfigError :    
+            return "localhost"
+        
+    def getMailDomain(self) :    
+        """Returns the mail domain to use to send messages to users."""
+        try :
+            return self.getGlobalOption("maildomain")
+        except PyKotaConfigError :    
+            return 
+        
+    def getAdminMail(self, printername) :    
+        """Returns the Email address of the Print Quota Administrator."""
+        try :
+            return self.getPrinterOption(printername, "adminmail")
+        except PyKotaConfigError :    
+            return "root@localhost"
+        
+    def getAdmin(self, printername) :    
+        """Returns the full name of the Print Quota Administrator."""
+        try :
+            return self.getPrinterOption(printername, "admin")
+        except PyKotaConfigError :    
+            return "root"
+        
+    def getMailTo(self, printername) :    
+        """Returns the recipient of email messages."""
+        validmailtos = [ "EXTERNAL", "NOBODY", "NONE", "NOONE", "BITBUCKET", "DEVNULL", "BOTH", "USER", "ADMIN" ]
+        try :
+            fullmailto = self.getPrinterOption(printername, "mailto")
+        except PyKotaConfigError :    
+            return ("BOTH", None)
+        else :    
+            try :
+                mailto = [x.strip() for x in fullmailto.split('(', 1)]
+            except ValueError :    
+                raise PyKotaConfigError, _("Invalid option mailto %s for printer %s") % (fullmailto, printername)
+            if len(mailto) == 1 :    
+                mailto.append("")
+            (mailto, args) = mailto    
+            if args.endswith(')') :
+                args = args[:-1]
+            mailto = mailto.upper()    
+            if (mailto == "EXTERNAL") and not args :
+                raise PyKotaConfigError, _("Invalid option mailto %s for printer %s") % (fullmailto, printername)
+            if mailto not in validmailtos :
+                raise PyKotaConfigError, _("Option mailto in section %s only supports values in %s") % (printername, str(validmailtos))
+            return (mailto, args)
+        
+    def getMaxDenyBanners(self, printername) :    
+        """Returns the maximum number of deny banners to be printed for a particular user on a particular printer."""
+        try :
+            maxdb = self.getPrinterOption(printername, "maxdenybanners")
+        except PyKotaConfigError :    
+            return 0 # default value is to forbid printing a deny banner.
+        try :
+            value = int(maxdb.strip())
+            if value < 0 :
+                raise ValueError
+        except (TypeError, ValueError) :    
+            raise PyKotaConfigError, _("Invalid maximal deny banners counter %s") % maxdb
+        else :    
+            return value
+            
+    def getGraceDelay(self, printername) :    
+        """Returns the grace delay in days."""
+        try :
+            gd = self.getPrinterOption(printername, "gracedelay")
+        except PyKotaConfigError :    
+            gd = 7      # default value of 7 days
+        try :
+            return int(gd)
+        except (TypeError, ValueError) :    
+            raise PyKotaConfigError, _("Invalid grace delay %s") % gd
+            
+    def getPoorMan(self) :    
+        """Returns the poor man's threshold."""
+        try :
+            pm = self.getGlobalOption("poorman")
+        except PyKotaConfigError :    
+            pm = 1.0    # default value of 1 unit
+        try :
+            return float(pm)
+        except (TypeError, ValueError) :    
+            raise PyKotaConfigError, _("Invalid poor man's threshold %s") % pm
+            
+    def getPoorWarn(self) :    
+        """Returns the poor man's warning message."""
+        try :
+            return self.getGlobalOption("poorwarn")
+        except PyKotaConfigError :    
+            return _("Your Print Quota account balance is Low.\nSoon you'll not be allowed to print anymore.\nPlease contact the Print Quota Administrator to solve the problem.")
+            
+    def getHardWarn(self, printername) :    
+        """Returns the hard limit error message."""
+        try :
+            return self.getPrinterOption(printername, "hardwarn")
+        except PyKotaConfigError :    
+            return _("You are not allowed to print anymore because\nyour Print Quota is exceeded on printer %s.") % printername
+            
+    def getSoftWarn(self, printername) :    
+        """Returns the soft limit error message."""
+        try :
+            return self.getPrinterOption(printername, "softwarn")
+        except PyKotaConfigError :    
+            return _("You will soon be forbidden to print anymore because\nyour Print Quota is almost reached on printer %s.") % printername
+            
+    def getPrivacy(self) :        
+        """Returns 1 if privacy is activated, else 0."""
+        return self.isTrue(self.getGlobalOption("privacy", ignore=1))
+        
+    def getDebug(self) :          
+        """Returns 1 if debugging is activated, else 0."""
+        return self.isTrue(self.getGlobalOption("debug", ignore=1))
+            
+    def getCaching(self) :          
+        """Returns 1 if database caching is enabled, else 0."""
+        return self.isTrue(self.getGlobalOption("storagecaching", ignore=1))
+            
+    def getLDAPCache(self) :          
+        """Returns 1 if low-level LDAP caching is enabled, else 0."""
+        return self.isTrue(self.getGlobalOption("ldapcache", ignore=1))
+            
+    def getDisableHistory(self) :          
+        """Returns 1 if we want to disable history, else 0."""
+        return self.isTrue(self.getGlobalOption("disablehistory", ignore=1))
+            
+    def getUserNameToLower(self) :          
+        """Returns 1 if we want to convert usernames to lowercase when printing, else 0."""
+        return self.isTrue(self.getGlobalOption("utolower", ignore=1))
+        
+    def getRejectUnknown(self) :          
+        """Returns 1 if we want to reject the creation of unknown users or groups, else 0."""
+        return self.isTrue(self.getGlobalOption("reject_unknown", ignore=1))
+        
+    def getDenyDuplicates(self, printername) :          
+        """Returns 1 if we want to deny duplicate jobs, else 0."""
+        try : 
+            return self.isTrue(self.getPrinterOption(printername, "denyduplicates"))
+        except PyKotaConfigError :    
+            return 0
+        
+    def getWinbindSeparator(self) :          
+        """Returns the winbind separator's value if it is set, else None."""
+        return self.getGlobalOption("winbind_separator", ignore=1)
+
+    def getAccountBanner(self, printername) :
+        """Returns which banner(s) to account for: NONE, BOTH, STARTING, ENDING."""
+        validvalues = [ "NONE", "BOTH", "STARTING", "ENDING" ]     
+        try :
+            value = self.getPrinterOption(printername, "accountbanner")
+        except PyKotaConfigError :    
+            return "BOTH"       # Default value of BOTH
+        else :    
+            value = value.strip().upper()
+            if value not in validvalues :
+                raise PyKotaConfigError, _("Option accountbanner in section %s only supports values in %s") % (printername, str(validvalues))
+            return value  
+
+    def getStartingBanner(self, printername) :
+        """Returns the startingbanner value if set, else None."""
+        try :
+            return self.getPrinterOption(printername, "startingbanner").strip()
+        except PyKotaConfigError :
+            return None
+
+    def getEndingBanner(self, printername) :
+        """Returns the endingbanner value if set, else None."""
+        try :
+            return self.getPrinterOption(printername, "endingbanner").strip()
+        except PyKotaConfigError :
+            return None
+            
+    def getTrustJobSize(self, printername) :
+        """Returns the normalized value of the trustjobsize's directive."""
+        try :
+            value = self.getPrinterOption(printername, "trustjobsize").strip().upper()
+        except PyKotaConfigError :
+            return (None, "YES")
+        else :    
+            if value == "YES" :
+                return (None, "YES")
+            try :    
+                (limit, replacement) = [p.strip() for p in value.split(">")[1].split(":")]
+                limit = int(limit)
+                try :
+                    replacement = int(replacement) 
+                except ValueError :    
+                    if replacement != "PRECOMPUTED" :
+                        raise
+                if limit < 0 :
+                    raise ValueError
+                if (replacement != "PRECOMPUTED") and (replacement < 0) :
+                    raise ValueError
+            except (IndexError, ValueError, TypeError) :
+                raise PyKotaConfigError, _("Option trustjobsize for printer %s is incorrect") % printername
+            return (limit, replacement)    
Index: pykota/tags/1.22/pykota/loggers/__init__.py
===================================================================
--- pykota/tags/1.22/pykota/loggers/__init__.py (revision 2146)
+++ pykota/tags/1.22/pykota/loggers/__init__.py (revision 2146)
@@ -0,0 +1,22 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
Index: pykota/tags/1.22/pykota/loggers/Makefile.am
===================================================================
--- pykota/tags/1.22/pykota/loggers/Makefile.am (revision 2146)
+++ pykota/tags/1.22/pykota/loggers/Makefile.am (revision 2146)
@@ -0,0 +1,6 @@
+pykota_loggersdir = $(pythondir)/pykota/loggers
+
+pykota_loggers_PYTHON = 	\
+	__init__.py				\
+	stderr.py				\
+	system.py
Index: pykota/tags/1.22/pykota/loggers/stderr.py
===================================================================
--- pykota/tags/1.22/pykota/loggers/stderr.py (revision 2147)
+++ pykota/tags/1.22/pykota/loggers/stderr.py (revision 2147)
@@ -0,0 +1,40 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+
+class Logger :
+    """A logger class which logs to stderr."""
+    def log_message(self, message, level="info") :
+        """Sends the message to the appropriate logging subsystem."""
+        try :
+            sys.stderr.write("%s: PyKota (PID %s) : %s\n" % (level.upper(), os.getpid(), message.strip()))
+        except IOError :    
+            pass # What else could we do ?
+        else :    
+            try :
+                sys.stderr.flush()
+            except IOError :    
+                pass # What else could we do ?
Index: pykota/tags/1.22/pykota/loggers/system.py
===================================================================
--- pykota/tags/1.22/pykota/loggers/system.py (revision 2147)
+++ pykota/tags/1.22/pykota/loggers/system.py (revision 2147)
@@ -0,0 +1,45 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+import syslog
+
+class Logger :
+    """A logger class which logs to syslog."""
+    levels = { "error" : "ERR", "warn": "WARNING", "info": "INFO", "debug": "DEBUG" }
+    def __init__(self) :
+        """Opens the logging subsystem."""
+        syslog.openlog("PyKota", 0, syslog.LOG_LPR)
+        
+    def __del__(self) :    
+        """Ensures the logging subsystem is closed."""
+        syslog.closelog()
+        
+    def log_message(self, message, level="info") :
+        """Sends the message to syslog."""
+        priority = getattr(syslog, "LOG_%s" % self.levels.get(level.lower(), "DEBUG").upper(), syslog.LOG_DEBUG)
+        try :
+            syslog.syslog(priority, "(PID %s) : %s" % (os.getpid(), message.strip()))
+        except :    
+            pass # What else could we do ?
Index: pykota/tags/1.22/pykota/tool.py
===================================================================
--- pykota/tags/1.22/pykota/tool.py (revision 2229)
+++ pykota/tags/1.22/pykota/tool.py (revision 2229)
@@ -0,0 +1,1003 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import pwd
+import fnmatch
+import getopt
+import smtplib
+import gettext
+import locale
+import signal
+import socket
+import tempfile
+import md5
+import ConfigParser
+import popen2
+
+from mx import DateTime
+
+from pykota import version, config, storage, logger, accounter, pdlanalyzer
+
+def N_(message) :
+    """Fake translation marker for translatable strings extraction."""
+    return message
+
+class PyKotaToolError(Exception):
+    """An exception for PyKota config related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+    
+def crashed(message="Bug in PyKota") :    
+    """Minimal crash method."""
+    import traceback
+    lines = []
+    for line in traceback.format_exception(*sys.exc_info()) :
+        lines.extend([l for l in line.split("\n") if l])
+    msg = "ERROR: ".join(["%s\n" % l for l in (["ERROR: PyKota v%s" % version.__version__, message] + lines)])
+    sys.stderr.write(msg)
+    sys.stderr.flush()
+    return msg
+
+class Tool :
+    """Base class for tools with no database access."""
+    def __init__(self, lang="", charset=None, doc="PyKota %s (c) 2003-2004 %s" % (version.__version__, version.__author__)) :
+        """Initializes the command line tool."""
+        # did we drop priviledges ?
+        self.privdropped = 0
+        
+        # locale stuff
+        self.defaultToCLocale = 0
+        try :
+            locale.setlocale(locale.LC_ALL, lang)
+        except (locale.Error, IOError) :
+            locale.setlocale(locale.LC_ALL, "C")
+            self.defaultToCLocale = 1
+        try :
+            gettext.install("pykota")
+        except :
+            gettext.NullTranslations().install()
+            
+        # We can force the charset.    
+        # The CHARSET environment variable is set by CUPS when printing.
+        # Else we use the current locale's one.
+        # If nothing is set, we use ISO-8859-15 widely used in western Europe.
+        localecharset = None
+        try :
+            try :
+                localecharset = locale.nl_langinfo(locale.CODESET)
+            except AttributeError :    
+                try :
+                    localecharset = locale.getpreferredencoding()
+                except AttributeError :    
+                    try :
+                        localecharset = locale.getlocale()[1]
+                        localecharset = localecharset or locale.getdefaultlocale()[1]
+                    except ValueError :    
+                        pass        # Unknown locale, strange...
+        except locale.Error :            
+            pass
+        self.charset = charset or os.environ.get("CHARSET") or localecharset or "ISO-8859-15"
+    
+        # pykota specific stuff
+        self.documentation = doc
+        
+    def deferredInit(self) :        
+        """Deferred initialization."""
+        # try to find the configuration files in user's 'pykota' home directory.
+        try :
+            self.pykotauser = pwd.getpwnam("pykota")
+        except KeyError :    
+            self.pykotauser = None
+            confdir = "/etc/pykota"
+            missingUser = 1
+        else :    
+            confdir = self.pykotauser[5]
+            missingUser = 0
+            
+        self.config = config.PyKotaConfig(confdir)
+        self.debug = self.config.getDebug()
+        self.smtpserver = self.config.getSMTPServer()
+        self.maildomain = self.config.getMailDomain()
+        self.logger = logger.openLogger(self.config.getLoggingBackend())
+            
+        # now drop priviledge if possible
+        self.dropPriv()    
+        
+        # We NEED this here, even when not in an accounting filter/backend    
+        self.softwareJobSize = 0
+        self.softwareJobPrice = 0.0
+        
+        if self.defaultToCLocale :
+            self.printInfo("Incorrect locale settings. PyKota falls back to the 'C' locale.", "warn")
+        if missingUser :     
+            self.printInfo("The 'pykota' system account is missing. Configuration files were searched in /etc/pykota instead.", "warn")
+        
+        self.logdebug("Charset in use : %s" % self.charset)
+        arguments = " ".join(['"%s"' % arg for arg in sys.argv])
+        self.logdebug("Command line arguments : %s" % arguments)
+        
+    def dropPriv(self) :    
+        """Drops priviledges."""
+        uid = os.geteuid()
+        if uid :
+            try :
+                username = pwd.getpwuid(uid)[0]
+            except (KeyError, IndexError), msg :    
+                self.printInfo(_("Strange problem with uid(%s) : %s") % (uid, msg), "warn")
+            else :
+                self.logdebug(_("Running as user '%s'.") % username)
+        else :
+            if self.pykotauser is None :
+                self.logdebug(_("No user named 'pykota'. Not dropping priviledges."))
+            else :    
+                try :
+                    os.setegid(self.pykotauser[3])
+                    os.seteuid(self.pykotauser[2])
+                except OSError, msg :    
+                    self.printInfo(_("Impossible to drop priviledges : %s") % msg, "warn")
+                else :    
+                    self.logdebug(_("Priviledges dropped. Now running as user 'pykota'."))
+                    self.privdropped = 1
+            
+    def regainPriv(self) :    
+        """Drops priviledges."""
+        if self.privdropped :
+            try :
+                os.seteuid(0)
+                os.setegid(0)
+            except OSError, msg :    
+                self.printInfo(_("Impossible to regain priviledges : %s") % msg, "warn")
+            else :    
+                self.logdebug(_("Regained priviledges. Now running as root."))
+                self.privdropped = 0
+        
+    def getCharset(self) :    
+        """Returns the charset in use."""
+        return self.charset
+        
+    def logdebug(self, message) :    
+        """Logs something to debug output if debug is enabled."""
+        if self.debug :
+            self.logger.log_message(message, "debug")
+            
+    def printInfo(self, message, level="info") :        
+        """Sends a message to standard error."""
+        sys.stderr.write("%s: %s\n" % (level.upper(), message))
+        sys.stderr.flush()
+        
+    def matchString(self, s, patterns) :
+        """Returns 1 if the string s matches one of the patterns, else 0."""
+        for pattern in patterns :
+            if fnmatch.fnmatchcase(s, pattern) :
+                return 1
+        return 0
+        
+    def display_version_and_quit(self) :
+        """Displays version number, then exists successfully."""
+        try :
+            self.clean()
+        except AttributeError :    
+            pass
+        print version.__version__
+        sys.exit(0)
+    
+    def display_usage_and_quit(self) :
+        """Displays command line usage, then exists successfully."""
+        try :
+            self.clean()
+        except AttributeError :    
+            pass
+        print _(self.documentation) % (version.__version__, version.__author__)
+        sys.exit(0)
+        
+    def crashed(self, message="Bug in PyKota") :    
+        """Outputs a crash message, and optionally sends it to software author."""
+        msg = crashed(message)
+        fullmessage = "========== Traceback :\n\n%s\n\n========== sys.argv :\n\n%s\n\n========== Environment :\n\n%s\n" % \
+                        (msg, \
+                         "\n".join(["    %s" % repr(a) for a in sys.argv]), \
+                         "\n".join(["    %s=%s" % (k, v) for (k, v) in os.environ.items()]))
+        try :
+            crashrecipient = self.config.getCrashRecipient()
+            if crashrecipient :
+                admin = self.config.getAdminMail("global") # Nice trick, isn't it ?
+                server = smtplib.SMTP(self.smtpserver)
+                server.sendmail(admin, [admin, crashrecipient], \
+                                       "From: %s\nTo: %s\nCc: %s\nSubject: PyKota v%s crash traceback !\n\n%s" % \
+                                       (admin, crashrecipient, admin, version.__version__, fullmessage))
+                server.quit()
+        except :
+            pass
+        return fullmessage    
+        
+    def parseCommandline(self, argv, short, long, allownothing=0) :
+        """Parses the command line, controlling options."""
+        # split options in two lists: those which need an argument, those which don't need any
+        withoutarg = []
+        witharg = []
+        lgs = len(short)
+        i = 0
+        while i < lgs :
+            ii = i + 1
+            if (ii < lgs) and (short[ii] == ':') :
+                # needs an argument
+                witharg.append(short[i])
+                ii = ii + 1 # skip the ':'
+            else :
+                # doesn't need an argument
+                withoutarg.append(short[i])
+            i = ii
+                
+        for option in long :
+            if option[-1] == '=' :
+                # needs an argument
+                witharg.append(option[:-1])
+            else :
+                # doesn't need an argument
+                withoutarg.append(option)
+        
+        # we begin with all possible options unset
+        parsed = {}
+        for option in withoutarg + witharg :
+            parsed[option] = None
+        
+        # then we parse the command line
+        args = []       # to not break if something unexpected happened
+        try :
+            options, args = getopt.getopt(argv, short, long)
+            if options :
+                for (o, v) in options :
+                    # we skip the '-' chars
+                    lgo = len(o)
+                    i = 0
+                    while (i < lgo) and (o[i] == '-') :
+                        i = i + 1
+                    o = o[i:]
+                    if o in witharg :
+                        # needs an argument : set it
+                        parsed[o] = v
+                    elif o in withoutarg :
+                        # doesn't need an argument : boolean
+                        parsed[o] = 1
+                    else :
+                        # should never occur
+                        raise PyKotaToolError, "Unexpected problem when parsing command line"
+            elif (not args) and (not allownothing) and sys.stdin.isatty() : # no option and no argument, we display help if we are a tty
+                self.display_usage_and_quit()
+        except getopt.error, msg :
+            self.printInfo(msg)
+            self.display_usage_and_quit()
+        return (parsed, args)
+    
+class PyKotaTool(Tool) :    
+    """Base class for all PyKota command line tools."""
+    def __init__(self, lang="", charset=None, doc="PyKota %s (c) 2003-2004 %s" % (version.__version__, version.__author__)) :
+        """Initializes the command line tool and opens the database."""
+        Tool.__init__(self, lang, charset, doc)
+        
+    def deferredInit(self) :    
+        """Deferred initialization."""
+        Tool.deferredInit(self)
+        self.storage = storage.openConnection(self)
+        if self.config.isAdmin : # TODO : We don't know this before, fix this !
+            self.logdebug("Beware : running as a PyKota administrator !")
+        else :    
+            self.logdebug("Don't Panic : running as a mere mortal !")
+        
+    def clean(self) :    
+        """Ensures that the database is closed."""
+        try :
+            self.storage.close()
+        except (TypeError, NameError, AttributeError) :    
+            pass
+            
+    def isValidName(self, name) :
+        """Checks if a user or printer name is valid."""
+        invalidchars = "/@?*,;&|"
+        for c in list(invalidchars) :
+            if c in name :
+                return 0
+        return 1        
+        
+    def sendMessage(self, adminmail, touser, fullmessage) :
+        """Sends an email message containing headers to some user."""
+        if "@" not in touser :
+            touser = "%s@%s" % (touser, self.maildomain or self.smtpserver)
+        try :    
+            server = smtplib.SMTP(self.smtpserver)
+        except socket.error, msg :    
+            self.printInfo(_("Impossible to connect to SMTP server : %s") % msg, "error")
+        else :
+            try :
+                server.sendmail(adminmail, [touser], "From: %s\nTo: %s\n%s" % (adminmail, touser, fullmessage))
+            except smtplib.SMTPException, answer :    
+                for (k, v) in answer.recipients.items() :
+                    self.printInfo(_("Impossible to send mail to %s, error %s : %s") % (k, v[0], v[1]), "error")
+            server.quit()
+        
+    def sendMessageToUser(self, admin, adminmail, user, subject, message) :
+        """Sends an email message to a user."""
+        message += _("\n\nPlease contact your system administrator :\n\n\t%s - <%s>\n") % (admin, adminmail)
+        self.sendMessage(adminmail, user.Email or user.Name, "Subject: %s\n\n%s" % (subject, message))
+        
+    def sendMessageToAdmin(self, adminmail, subject, message) :
+        """Sends an email message to the Print Quota administrator."""
+        self.sendMessage(adminmail, adminmail, "Subject: %s\n\n%s" % (subject, message))
+        
+    def _checkUserPQuota(self, userpquota) :            
+        """Checks the user quota on a printer and deny or accept the job."""
+        # then we check the user's own quota
+        # if we get there we are sure that policy is not EXTERNAL
+        user = userpquota.User
+        printer = userpquota.Printer
+        enforcement = self.config.getPrinterEnforcement(printer.Name)
+        self.logdebug("Checking user %s's quota on printer %s" % (user.Name, printer.Name))
+        (policy, dummy) = self.config.getPrinterPolicy(userpquota.Printer.Name)
+        if not userpquota.Exists :
+            # Unknown userquota 
+            if policy == "ALLOW" :
+                action = "POLICY_ALLOW"
+            else :    
+                action = "POLICY_DENY"
+            self.printInfo(_("Unable to match user %s on printer %s, applying default policy (%s)") % (user.Name, printer.Name, action))
+        else :    
+            pagecounter = int(userpquota.PageCounter or 0)
+            if enforcement == "STRICT" :
+                pagecounter += self.softwareJobSize
+            if userpquota.SoftLimit is not None :
+                softlimit = int(userpquota.SoftLimit)
+                if pagecounter < softlimit :
+                    action = "ALLOW"
+                else :    
+                    if userpquota.HardLimit is None :
+                        # only a soft limit, this is equivalent to having only a hard limit
+                        action = "DENY"
+                    else :    
+                        hardlimit = int(userpquota.HardLimit)
+                        if softlimit <= pagecounter < hardlimit :    
+                            now = DateTime.now()
+                            if userpquota.DateLimit is not None :
+                                datelimit = DateTime.ISO.ParseDateTime(userpquota.DateLimit)
+                            else :
+                                datelimit = now + self.config.getGraceDelay(printer.Name)
+                                userpquota.setDateLimit(datelimit)
+                            if now < datelimit :
+                                action = "WARN"
+                            else :    
+                                action = "DENY"
+                        else :         
+                            action = "DENY"
+            else :        
+                if userpquota.HardLimit is not None :
+                    # no soft limit, only a hard one.
+                    hardlimit = int(userpquota.HardLimit)
+                    if pagecounter < hardlimit :
+                        action = "ALLOW"
+                    else :      
+                        action = "DENY"
+                else :
+                    # Both are unset, no quota, i.e. accounting only
+                    action = "ALLOW"
+        return action
+    
+    def checkGroupPQuota(self, grouppquota) :    
+        """Checks the group quota on a printer and deny or accept the job."""
+        group = grouppquota.Group
+        printer = grouppquota.Printer
+        enforcement = self.config.getPrinterEnforcement(printer.Name)
+        self.logdebug("Checking group %s's quota on printer %s" % (group.Name, printer.Name))
+        if group.LimitBy and (group.LimitBy.lower() == "balance") : 
+            val = group.AccountBalance or 0.0
+            if enforcement == "STRICT" : 
+                val -= self.softwareJobPrice # use precomputed size.
+            if val <= 0.0 :
+                action = "DENY"
+            elif val <= self.config.getPoorMan() :    
+                action = "WARN"
+            else :    
+                action = "ALLOW"
+            if (enforcement == "STRICT") and (val == 0.0) :
+                action = "WARN" # we can still print until account is 0
+        else :
+            val = grouppquota.PageCounter or 0
+            if enforcement == "STRICT" :
+                val += self.softwareJobSize
+            if grouppquota.SoftLimit is not None :
+                softlimit = int(grouppquota.SoftLimit)
+                if val < softlimit :
+                    action = "ALLOW"
+                else :    
+                    if grouppquota.HardLimit is None :
+                        # only a soft limit, this is equivalent to having only a hard limit
+                        action = "DENY"
+                    else :    
+                        hardlimit = int(grouppquota.HardLimit)
+                        if softlimit <= val < hardlimit :    
+                            now = DateTime.now()
+                            if grouppquota.DateLimit is not None :
+                                datelimit = DateTime.ISO.ParseDateTime(grouppquota.DateLimit)
+                            else :
+                                datelimit = now + self.config.getGraceDelay(printer.Name)
+                                grouppquota.setDateLimit(datelimit)
+                            if now < datelimit :
+                                action = "WARN"
+                            else :    
+                                action = "DENY"
+                        else :         
+                            action = "DENY"
+            else :        
+                if grouppquota.HardLimit is not None :
+                    # no soft limit, only a hard one.
+                    hardlimit = int(grouppquota.HardLimit)
+                    if val < hardlimit :
+                        action = "ALLOW"
+                    else :      
+                        action = "DENY"
+                else :
+                    # Both are unset, no quota, i.e. accounting only
+                    action = "ALLOW"
+        return action
+    
+    def checkUserPQuota(self, userpquota) :
+        """Checks the user quota on a printer and all its parents and deny or accept the job."""
+        user = userpquota.User
+        printer = userpquota.Printer
+        
+        # indicates that a warning needs to be sent
+        warned = 0                
+        
+        # first we check any group the user is a member of
+        for group in self.storage.getUserGroups(user) :
+            grouppquota = self.storage.getGroupPQuota(group, printer)
+            # for the printer and all its parents
+            for gpquota in [ grouppquota ] + grouppquota.ParentPrintersGroupPQuota :
+                if gpquota.Exists :
+                    action = self.checkGroupPQuota(gpquota)
+                    if action == "DENY" :
+                        return action
+                    elif action == "WARN" :    
+                        warned = 1
+                        
+        # Then we check the user's account balance
+        # if we get there we are sure that policy is not EXTERNAL
+        (policy, dummy) = self.config.getPrinterPolicy(printer.Name)
+        if user.LimitBy and (user.LimitBy.lower() == "balance") : 
+            self.logdebug("Checking account balance for user %s" % user.Name)
+            if user.AccountBalance is None :
+                if policy == "ALLOW" :
+                    action = "POLICY_ALLOW"
+                else :    
+                    action = "POLICY_DENY"
+                self.printInfo(_("Unable to find user %s's account balance, applying default policy (%s) for printer %s") % (user.Name, action, printer.Name))
+                return action        
+            else :    
+                if user.OverCharge == 0.0 :
+                    self.printInfo(_("User %s will not be charged for printing.") % user.Name)
+                    action = "ALLOW"
+                else :
+                    val = float(user.AccountBalance or 0.0)
+                    enforcement = self.config.getPrinterEnforcement(printer.Name)
+                    if enforcement == "STRICT" : 
+                        val -= self.softwareJobPrice # use precomputed size.
+                    if val <= 0.0 :
+                        action = "DENY"
+                    elif val <= self.config.getPoorMan() :    
+                        action = "WARN"
+                    else :
+                        action = "ALLOW"
+                    if (enforcement == "STRICT") and (val == 0.0) :
+                        action = "WARN" # we can still print until account is 0
+                return action    
+        else :
+            # Then check the user quota on current printer and all its parents.                
+            policyallowed = 0
+            for upquota in [ userpquota ] + userpquota.ParentPrintersUserPQuota :               
+                action = self._checkUserPQuota(upquota)
+                if action in ("DENY", "POLICY_DENY") :
+                    return action
+                elif action == "WARN" :    
+                    warned = 1
+                elif action == "POLICY_ALLOW" :    
+                    policyallowed = 1
+            if warned :        
+                return "WARN"
+            elif policyallowed :    
+                return "POLICY_ALLOW" 
+            else :    
+                return "ALLOW"
+                
+    def externalMailTo(self, cmd, action, user, printer, message) :
+        """Warns the user with an external command."""
+        username = user.Name
+        printername = printer.Name
+        email = user.Email or user.Name
+        if "@" not in email :
+            email = "%s@%s" % (email, self.maildomain or self.smtpserver)
+        os.system(cmd % locals())
+    
+    def formatCommandLine(self, cmd, user, printer) :
+        """Executes an external command."""
+        username = user.Name
+        printername = printer.Name
+        return cmd % locals()
+        
+    def warnGroupPQuota(self, grouppquota) :
+        """Checks a group quota and send messages if quota is exceeded on current printer."""
+        group = grouppquota.Group
+        printer = grouppquota.Printer
+        admin = self.config.getAdmin(printer.Name)
+        adminmail = self.config.getAdminMail(printer.Name)
+        (mailto, arguments) = self.config.getMailTo(printer.Name)
+        action = self.checkGroupPQuota(grouppquota)
+        if action.startswith("POLICY_") :
+            action = action[7:]
+        if action == "DENY" :
+            adminmessage = _("Print Quota exceeded for group %s on printer %s") % (group.Name, printer.Name)
+            self.printInfo(adminmessage)
+            if mailto in [ "BOTH", "ADMIN" ] :
+                self.sendMessageToAdmin(adminmail, _("Print Quota"), adminmessage)
+            if mailto in [ "BOTH", "USER", "EXTERNAL" ] :
+                for user in self.storage.getGroupMembers(group) :
+                    if mailto != "EXTERNAL" :
+                        self.sendMessageToUser(admin, adminmail, user, _("Print Quota Exceeded"), self.config.getHardWarn(printer.Name))
+                    else :    
+                        self.externalMailTo(arguments, action, user, printer, self.config.getHardWarn(printer.Name))
+        elif action == "WARN" :    
+            adminmessage = _("Print Quota low for group %s on printer %s") % (group.Name, printer.Name)
+            self.printInfo(adminmessage)
+            if mailto in [ "BOTH", "ADMIN" ] :
+                self.sendMessageToAdmin(adminmail, _("Print Quota"), adminmessage)
+            if group.LimitBy and (group.LimitBy.lower() == "balance") : 
+                message = self.config.getPoorWarn()
+            else :     
+                message = self.config.getSoftWarn(printer.Name)
+            if mailto in [ "BOTH", "USER", "EXTERNAL" ] :
+                for user in self.storage.getGroupMembers(group) :
+                    if mailto != "EXTERNAL" :
+                        self.sendMessageToUser(admin, adminmail, user, _("Print Quota Exceeded"), message)
+                    else :    
+                        self.externalMailTo(arguments, action, user, printer, message)
+        return action        
+        
+    def warnUserPQuota(self, userpquota) :
+        """Checks a user quota and send him a message if quota is exceeded on current printer."""
+        user = userpquota.User
+        printer = userpquota.Printer
+        admin = self.config.getAdmin(printer.Name)
+        adminmail = self.config.getAdminMail(printer.Name)
+        (mailto, arguments) = self.config.getMailTo(printer.Name)
+        action = self.checkUserPQuota(userpquota)
+        if action.startswith("POLICY_") :
+            action = action[7:]
+            
+        if action == "DENY" :
+            adminmessage = _("Print Quota exceeded for user %s on printer %s") % (user.Name, printer.Name)
+            self.printInfo(adminmessage)
+            if mailto in [ "BOTH", "USER", "EXTERNAL" ] :
+                message = self.config.getHardWarn(printer.Name)
+                if mailto != "EXTERNAL" :
+                    self.sendMessageToUser(admin, adminmail, user, _("Print Quota Exceeded"), message)
+                else :    
+                    self.externalMailTo(arguments, action, user, printer, message)
+            if mailto in [ "BOTH", "ADMIN" ] :
+                self.sendMessageToAdmin(adminmail, _("Print Quota"), adminmessage)
+        elif action == "WARN" :    
+            adminmessage = _("Print Quota low for user %s on printer %s") % (user.Name, printer.Name)
+            self.printInfo(adminmessage)
+            if mailto in [ "BOTH", "USER", "EXTERNAL" ] :
+                if user.LimitBy and (user.LimitBy.lower() == "balance") : 
+                    message = self.config.getPoorWarn()
+                else :     
+                    message = self.config.getSoftWarn(printer.Name)
+                if mailto != "EXTERNAL" :    
+                    self.sendMessageToUser(admin, adminmail, user, _("Print Quota Low"), message)
+                else :    
+                    self.externalMailTo(arguments, action, user, printer, message)
+            if mailto in [ "BOTH", "ADMIN" ] :
+                self.sendMessageToAdmin(adminmail, _("Print Quota"), adminmessage)
+        return action        
+        
+class PyKotaFilterOrBackend(PyKotaTool) :    
+    """Class for the PyKota filter or backend."""
+    def __init__(self) :
+        """Initialize local datas from current environment."""
+        # We begin with ignoring signals, we may de-ignore them later on.
+        self.gotSigTerm = 0
+        signal.signal(signal.SIGTERM, signal.SIG_IGN)
+        # signal.signal(signal.SIGCHLD, signal.SIG_IGN)
+        signal.signal(signal.SIGPIPE, signal.SIG_IGN)
+        
+        PyKotaTool.__init__(self)
+        (self.printingsystem, \
+         self.printerhostname, \
+         self.printername, \
+         self.username, \
+         self.jobid, \
+         self.inputfile, \
+         self.copies, \
+         self.title, \
+         self.options, \
+         self.originalbackend) = self.extractInfoFromCupsOrLprng()
+         
+    def deferredInit(self) :
+        """Deferred initialization."""
+        PyKotaTool.deferredInit(self)
+        
+        arguments = " ".join(['"%s"' % arg for arg in sys.argv])
+        self.logdebug(_("Printing system %s, args=%s") % (str(self.printingsystem), arguments))
+        
+        self.username = self.username or 'root' # when printing test page from CUPS web interface, username is empty
+        
+        # do we want to strip out the Samba/Winbind domain name ?
+        separator = self.config.getWinbindSeparator()
+        if separator is not None :
+            self.username = self.username.split(separator)[-1]
+            
+        # do we want to lowercase usernames ?    
+        if self.config.getUserNameToLower() :
+            self.username = self.username.lower()
+            
+        self.preserveinputfile = self.inputfile 
+        try :
+            self.accounter = accounter.openAccounter(self)
+        except (config.PyKotaConfigError, accounter.PyKotaAccounterError), msg :    
+            self.crashed(msg)
+            raise
+        self.exportJobInfo()
+        self.jobdatastream = self.openJobDataStream()
+        self.checksum = self.computeChecksum()
+        self.softwareJobSize = self.precomputeJobSize()
+        os.environ["PYKOTAPRECOMPUTEDJOBSIZE"] = str(self.softwareJobSize)
+        os.environ["PYKOTAJOBSIZEBYTES"] = str(self.jobSizeBytes)
+        self.logdebug("Job size is %s bytes on %s pages." % (self.jobSizeBytes, self.softwareJobSize))
+        self.logdebug("Capturing SIGTERM events.")
+        signal.signal(signal.SIGTERM, self.sigterm_handler)
+        
+    def sendBackChannelData(self, message, level="info") :    
+        """Sends an informational message to CUPS via back channel stream (stderr)."""
+        sys.stderr.write("%s: PyKota (PID %s) : %s\n" % (level.upper(), os.getpid(), message.strip()))
+        sys.stderr.flush()
+        
+    def computeChecksum(self) :    
+        """Computes the MD5 checksum of the job's datas, to be able to detect and forbid duplicate jobs."""
+        self.logdebug("Computing MD5 checksum for job %s" % self.jobid)
+        MEGABYTE = 1024*1024
+        checksum = md5.new()
+        while 1 :
+            data = self.jobdatastream.read(MEGABYTE) 
+            if not data :
+                break
+            checksum.update(data)    
+        self.jobdatastream.seek(0)
+        digest = checksum.hexdigest()
+        self.logdebug("MD5 checksum for job %s is %s" % (self.jobid, digest))
+        os.environ["PYKOTAMD5SUM"] = digest
+        return digest
+        
+    def openJobDataStream(self) :    
+        """Opens the file which contains the job's datas."""
+        if self.preserveinputfile is None :
+            # Job comes from sys.stdin, but this is not
+            # seekable and complexifies our task, so create
+            # a temporary file and use it instead
+            self.logdebug("Duplicating data stream from stdin to temporary file")
+            dummy = 0
+            MEGABYTE = 1024*1024
+            self.jobSizeBytes = 0
+            infile = tempfile.TemporaryFile()
+            while 1 :
+                data = sys.stdin.read(MEGABYTE) 
+                if not data :
+                    break
+                self.jobSizeBytes += len(data)    
+                if not (dummy % 10) :
+                    self.logdebug("%s bytes read..." % self.jobSizeBytes)
+                dummy += 1    
+                infile.write(data)
+            self.logdebug("%s bytes read total." % self.jobSizeBytes)
+            infile.flush()    
+            infile.seek(0)
+            return infile
+        else :    
+            # real file, just open it
+            self.regainPriv()
+            self.logdebug("Opening data stream %s" % self.preserveinputfile)
+            self.jobSizeBytes = os.stat(self.preserveinputfile)[6]
+            infile = open(self.preserveinputfile, "rb")
+            self.dropPriv()
+            return infile
+        
+    def closeJobDataStream(self) :    
+        """Closes the file which contains the job's datas."""
+        self.logdebug("Closing data stream.")
+        try :
+            self.jobdatastream.close()
+        except :    
+            pass
+        
+    def precomputeJobSize(self) :    
+        """Computes the job size with a software method."""
+        self.logdebug("Precomputing job's size with generic PDL analyzer...")
+        self.jobdatastream.seek(0)
+        try :
+            parser = pdlanalyzer.PDLAnalyzer(self.jobdatastream)
+            jobsize = parser.getJobSize()
+        except pdlanalyzer.PDLAnalyzerError, msg :    
+            # Here we just log the failure, but
+            # we finally ignore it and return 0 since this
+            # computation is just an indication of what the
+            # job's size MAY be.
+            self.printInfo(_("Unable to precompute the job's size with the generic PDL analyzer : %s") % msg, "warn")
+            return 0
+        else :    
+            if ((self.printingsystem == "CUPS") \
+                and (self.preserveinputfile is not None)) \
+                or (self.printingsystem != "CUPS") :
+                return jobsize * self.copies
+            else :        
+                return jobsize
+            
+    def sigterm_handler(self, signum, frame) :
+        """Sets an attribute whenever SIGTERM is received."""
+        self.gotSigTerm = 1
+        os.environ["PYKOTASTATUS"] = "CANCELLED"
+        self.printInfo(_("SIGTERM received, job %s cancelled.") % self.jobid)
+        
+    def exportJobInfo(self) :    
+        """Exports job information to the environment."""
+        os.environ["PYKOTAUSERNAME"] = str(self.username)
+        os.environ["PYKOTAPRINTERNAME"] = str(self.printername)
+        os.environ["PYKOTAJOBID"] = str(self.jobid)
+        os.environ["PYKOTATITLE"] = self.title or ""
+        os.environ["PYKOTAFILENAME"] = self.preserveinputfile or ""
+        os.environ["PYKOTACOPIES"] = str(self.copies)
+        os.environ["PYKOTAOPTIONS"] = self.options or ""
+        os.environ["PYKOTAPRINTERHOSTNAME"] = self.printerhostname or "localhost"
+    
+    def exportUserInfo(self, userpquota) :
+        """Exports user information to the environment."""
+        os.environ["PYKOTAOVERCHARGE"] = str(userpquota.User.OverCharge)
+        os.environ["PYKOTALIMITBY"] = str(userpquota.User.LimitBy)
+        os.environ["PYKOTABALANCE"] = str(userpquota.User.AccountBalance or 0.0)
+        os.environ["PYKOTALIFETIMEPAID"] = str(userpquota.User.LifeTimePaid or 0.0)
+        os.environ["PYKOTAPAGECOUNTER"] = str(userpquota.PageCounter or 0)
+        os.environ["PYKOTALIFEPAGECOUNTER"] = str(userpquota.LifePageCounter or 0)
+        os.environ["PYKOTASOFTLIMIT"] = str(userpquota.SoftLimit)
+        os.environ["PYKOTAHARDLIMIT"] = str(userpquota.HardLimit)
+        os.environ["PYKOTADATELIMIT"] = str(userpquota.DateLimit)
+        os.environ["PYKOTAWARNCOUNT"] = str(userpquota.WarnCount)
+        
+        # not really an user information, but anyway
+        # exports the list of printers groups the current
+        # printer is a member of
+        os.environ["PYKOTAPGROUPS"] = ",".join([p.Name for p in self.storage.getParentPrinters(userpquota.Printer)])
+        
+    def prehook(self, userpquota) :
+        """Allows plugging of an external hook before the job gets printed."""
+        prehook = self.config.getPreHook(userpquota.Printer.Name)
+        if prehook :
+            self.logdebug("Executing pre-hook [%s]" % prehook)
+            os.system(prehook)
+        
+    def posthook(self, userpquota) :
+        """Allows plugging of an external hook after the job gets printed and/or denied."""
+        posthook = self.config.getPostHook(userpquota.Printer.Name)
+        if posthook :
+            self.logdebug("Executing post-hook [%s]" % posthook)
+            os.system(posthook)
+            
+    def printInfo(self, message, level="info") :        
+        """Sends a message to standard error."""
+        self.logger.log_message("%s" % message, level)
+        
+    def printMoreInfo(self, user, printer, message, level="info") :            
+        """Prefixes the information printed with 'user@printer(jobid) =>'."""
+        self.printInfo("%s@%s(%s) => %s" % (getattr(user, "Name", None), getattr(printer, "Name", None), self.jobid, message), level)
+        
+    def extractInfoFromCupsOrLprng(self) :    
+        """Returns a tuple (printingsystem, printerhostname, printername, username, jobid, filename, title, options, backend).
+        
+           Returns (None, None, None, None, None, None, None, None, None, None) if no printing system is recognized.
+        """
+        # Try to detect CUPS
+        if os.environ.has_key("CUPS_SERVERROOT") and os.path.isdir(os.environ.get("CUPS_SERVERROOT", "")) :
+            if len(sys.argv) == 7 :
+                inputfile = sys.argv[6]
+            else :    
+                inputfile = None
+                
+            # check that the DEVICE_URI environment variable's value is 
+            # prefixed with "cupspykota:" otherwise don't touch it.
+            # If this is the case, we have to remove the prefix from 
+            # the environment before launching the real backend in cupspykota
+            device_uri = os.environ.get("DEVICE_URI", "")
+            if device_uri.startswith("cupspykota:") :
+                fulldevice_uri = device_uri[:]
+                device_uri = fulldevice_uri[len("cupspykota:"):]
+                if device_uri.startswith("//") :    # lpd (at least)
+                    device_uri = device_uri[2:]
+                os.environ["DEVICE_URI"] = device_uri   # TODO : side effect !
+            # TODO : check this for more complex urls than ipp://myprinter.dot.com:631/printers/lp
+            try :
+                (backend, destination) = device_uri.split(":", 1) 
+            except ValueError :    
+                raise PyKotaToolError, "Invalid DEVICE_URI : %s\n" % device_uri
+            while destination.startswith("/") :
+                destination = destination[1:]
+            checkauth = destination.split("@", 1)    
+            if len(checkauth) == 2 :
+                destination = checkauth[1]
+            printerhostname = destination.split("/")[0].split(":")[0]
+            return ("CUPS", \
+                    printerhostname, \
+                    os.environ.get("PRINTER"), \
+                    sys.argv[2].strip(), \
+                    sys.argv[1].strip(), \
+                    inputfile, \
+                    int(sys.argv[4].strip()), \
+                    sys.argv[3], \
+                    sys.argv[5], \
+                    backend)
+        else :    
+            # Try to detect LPRng
+            # TODO : try to extract filename, options if available
+            jseen = Jseen = Pseen = nseen = rseen = Kseen = None
+            for arg in sys.argv :
+                if arg.startswith("-j") :
+                    jseen = arg[2:].strip()
+                elif arg.startswith("-n") :     
+                    nseen = arg[2:].strip()
+                elif arg.startswith("-P") :    
+                    Pseen = arg[2:].strip()
+                elif arg.startswith("-r") :    
+                    rseen = arg[2:].strip()
+                elif arg.startswith("-J") :    
+                    Jseen = arg[2:].strip()
+                elif arg.startswith("-K") or arg.startswith("-#") :    
+                    Kseen = int(arg[2:].strip())
+            if Kseen is None :        
+                Kseen = 1       # we assume the user wants at least one copy...
+            if (rseen is None) and jseen and Pseen and nseen :    
+                lparg = [arg for arg in "".join(os.environ.get("PRINTCAP_ENTRY", "").split()).split(":") if arg.startswith("rm=") or arg.startswith("lp=")]
+                try :
+                    rseen = lparg[0].split("=")[-1].split("@")[-1].split("%")[0]
+                except :    
+                    # Not found
+                    self.printInfo(_("Printer hostname undefined, set to 'localhost'"), "warn")
+                    rseen = "localhost"
+                
+            spooldir = os.environ.get("SPOOL_DIR", ".")    
+            df_name = os.environ.get("DATAFILES")
+            if not df_name :
+                try : 
+                    df_name = [line[10:] for line in os.environ.get("HF", "").split() if line.startswith("datafiles=")][0]
+                except IndexError :    
+                    try :    
+                        df_name = [line[8:] for line in os.environ.get("HF", "").split() if line.startswith("df_name=")][0]
+                    except IndexError :
+                        try :
+                            cftransfername = [line[15:] for line in os.environ.get("HF", "").split() if line.startswith("cftransfername=")][0]
+                        except IndexError :    
+                            try :
+                                df_name = [line[1:] for line in os.environ.get("CONTROL", "").split() if line.startswith("fdf") or line.startswith("Udf")][0]
+                            except IndexError :    
+                                raise PyKotaToolError, "Unable to find the file which holds the job's datas. Please file a bug report for PyKota."
+                            else :    
+                                inputfile = os.path.join(spooldir, df_name) # no need to strip()
+                        else :    
+                            inputfile = os.path.join(spooldir, "d" + cftransfername[1:]) # no need to strip()
+                    else :    
+                        inputfile = os.path.join(spooldir, df_name) # no need to strip()
+                else :    
+                    inputfile = os.path.join(spooldir, df_name) # no need to strip()
+            else :    
+                inputfile = os.path.join(spooldir, df_name.strip())
+                
+            if jseen and Pseen and nseen and rseen :        
+                options = os.environ.get("HF", "") or os.environ.get("CONTROL", "")
+                return ("LPRNG", rseen, Pseen, nseen, jseen, inputfile, Kseen, Jseen, options, None)
+        self.printInfo(_("Printing system unknown, args=%s") % " ".join(sys.argv), "warn")
+        return (None, None, None, None, None, None, None, None, None, None)   # Unknown printing system
+        
+    def getPrinterUserAndUserPQuota(self) :        
+        """Returns a tuple (policy, printer, user, and user print quota) on this printer.
+        
+           "OK" is returned in the policy if both printer, user and user print quota
+           exist in the Quota Storage.
+           Otherwise, the policy as defined for this printer in pykota.conf is returned.
+           
+           If policy was set to "EXTERNAL" and one of printer, user, or user print quota
+           doesn't exist in the Quota Storage, then an external command is launched, as
+           defined in the external policy for this printer in pykota.conf
+           This external command can do anything, like automatically adding printers
+           or users, for example, and finally extracting printer, user and user print
+           quota from the Quota Storage is tried a second time.
+           
+           "EXTERNALERROR" is returned in case policy was "EXTERNAL" and an error status
+           was returned by the external command.
+        """
+        for passnumber in range(1, 3) :
+            printer = self.storage.getPrinter(self.printername)
+            user = self.storage.getUser(self.username)
+            userpquota = self.storage.getUserPQuota(user, printer)
+            if printer.Exists and user.Exists and userpquota.Exists :
+                policy = "OK"
+                break
+            (policy, args) = self.config.getPrinterPolicy(self.printername)
+            if policy == "EXTERNAL" :    
+                commandline = self.formatCommandLine(args, user, printer)
+                if not printer.Exists :
+                    self.printInfo(_("Printer %s not registered in the PyKota system, applying external policy (%s) for printer %s") % (self.printername, commandline, self.printername))
+                if not user.Exists :
+                    self.printInfo(_("User %s not registered in the PyKota system, applying external policy (%s) for printer %s") % (self.username, commandline, self.printername))
+                if not userpquota.Exists :
+                    self.printInfo(_("User %s doesn't have quota on printer %s in the PyKota system, applying external policy (%s) for printer %s") % (self.username, self.printername, commandline, self.printername))
+                if os.system(commandline) :
+                    self.printInfo(_("External policy %s for printer %s produced an error. Job rejected. Please check PyKota's configuration files.") % (commandline, self.printername), "error")
+                    policy = "EXTERNALERROR"
+                    break
+            else :        
+                if not printer.Exists :
+                    self.printInfo(_("Printer %s not registered in the PyKota system, applying default policy (%s)") % (self.printername, policy))
+                if not user.Exists :
+                    self.printInfo(_("User %s not registered in the PyKota system, applying default policy (%s) for printer %s") % (self.username, policy, self.printername))
+                if not userpquota.Exists :
+                    self.printInfo(_("User %s doesn't have quota on printer %s in the PyKota system, applying default policy (%s)") % (self.username, self.printername, policy))
+                break
+        if policy == "EXTERNAL" :    
+            if not printer.Exists :
+                self.printInfo(_("Printer %s still not registered in the PyKota system, job will be rejected") % self.printername)
+            if not user.Exists :
+                self.printInfo(_("User %s still not registered in the PyKota system, job will be rejected on printer %s") % (self.username, self.printername))
+            if not userpquota.Exists :
+                self.printInfo(_("User %s still doesn't have quota on printer %s in the PyKota system, job will be rejected") % (self.username, self.printername))
+        return (policy, printer, user, userpquota)
+        
+    def mainWork(self) :    
+        """Main work is done here."""
+        (policy, printer, user, userpquota) = self.getPrinterUserAndUserPQuota()
+        # TODO : check for last user's quota in case pykota filter is used with querying
+        if policy == "EXTERNALERROR" :
+            # Policy was 'EXTERNAL' and the external command returned an error code
+            return self.removeJob()
+        elif policy == "EXTERNAL" :
+            # Policy was 'EXTERNAL' and the external command wasn't able
+            # to add either the printer, user or user print quota
+            return self.removeJob()
+        elif policy == "DENY" :    
+            # Either printer, user or user print quota doesn't exist,
+            # and the job should be rejected.
+            return self.removeJob()
+        else :
+            if policy not in ("OK", "ALLOW") :
+                self.printInfo(_("Invalid policy %s for printer %s") % (policy, self.printername))
+                return self.removeJob()
+            else :
+                return self.doWork(policy, printer, user, userpquota)
Index: pykota/tags/1.22/pykota/logger.py
===================================================================
--- pykota/tags/1.22/pykota/logger.py (revision 2147)
+++ pykota/tags/1.22/pykota/logger.py (revision 2147)
@@ -0,0 +1,41 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+class PyKotaLoggingError(Exception):
+    """An exception for logging related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+
+def openLogger(backend) :
+    """Returns the appropriate logger subsystem object."""
+    try :
+        exec "from pykota.loggers import %s as loggingbackend" % backend.lower()    
+    except ImportError :
+        raise PyKotaLoggingError, _("Unsupported logging subsystem %s") % backend
+    else :    
+        return loggingbackend.Logger()
Index: pykota/tags/1.22/pykota/accounters/software.py
===================================================================
--- pykota/tags/1.22/pykota/accounters/software.py (revision 2147)
+++ pykota/tags/1.22/pykota/accounters/software.py (revision 2147)
@@ -0,0 +1,85 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+import popen2
+from pykota.accounter import AccounterBase, PyKotaAccounterError
+
+class Accounter(AccounterBase) :
+    def computeJobSize(self) :    
+        """Feeds an external command with our datas to let it compute the job size, and return its value."""
+        self.filter.printInfo(_("Launching SOFTWARE(%s)...") % self.arguments)
+        if not self.arguments :
+            pagecounter = self.filter.softwareJobSize   # Optimize : already computed !
+            self.filter.logdebug("Internal software accounter said job is %s pages long." % repr(pagecounter))
+        else :
+            MEGABYTE = 1024*1024
+            self.filter.jobdatastream.seek(0)
+            child = popen2.Popen4(self.arguments)
+            try :
+                data = self.filter.jobdatastream.read(MEGABYTE)    
+                while data :
+                    child.tochild.write(data)
+                    data = self.filter.jobdatastream.read(MEGABYTE)
+                child.tochild.flush()
+                child.tochild.close()    
+            except (IOError, OSError), msg :    
+                msg = "%s : %s" % (self.arguments, msg) 
+                self.filter.printInfo(_("Unable to compute job size with accounter %s") % msg)
+            
+            pagecounter = None
+            try :
+                answer = child.fromchild.read()
+            except (IOError, OSError), msg :    
+                msg = "%s : %s" % (self.arguments, msg) 
+                self.filter.printInfo(_("Unable to compute job size with accounter %s") % msg)
+            else :    
+                lines = [l.strip() for l in answer.split("\n")]
+                for i in range(len(lines)) : 
+                    try :
+                        pagecounter = int(lines[i])
+                    except (AttributeError, ValueError) :
+                        self.filter.printInfo(_("Line [%s] skipped in accounter's output. Trying again...") % lines[i])
+                    else :    
+                        break
+            child.fromchild.close()
+            
+            try :
+                status = child.wait()
+            except OSError, msg :    
+                self.filter.printInfo(_("Problem while waiting for software accounter pid %s to exit : %s") % (child.pid, msg))
+            else :    
+                if os.WIFEXITED(status) :
+                    status = os.WEXITSTATUS(status)
+                self.filter.printInfo(_("Software accounter %s exit code is %s") % (self.arguments, str(status)))
+                
+            if pagecounter is None :    
+                message = _("Unable to compute job size with accounter %s") % self.arguments
+                if self.onerror == "CONTINUE" :
+                    self.filter.printInfo(message, "error")
+                else :
+                    raise PyKotaAccounterError, message
+            self.filter.logdebug("Software accounter %s said job is %s pages long." % (self.arguments, repr(pagecounter)))
+            
+        return pagecounter or 0
Index: pykota/tags/1.22/pykota/accounters/hardware.py
===================================================================
--- pykota/tags/1.22/pykota/accounters/hardware.py (revision 2205)
+++ pykota/tags/1.22/pykota/accounters/hardware.py (revision 2205)
@@ -0,0 +1,161 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import os
+import signal
+import popen2
+
+from pykota.accounter import AccounterBase, PyKotaAccounterError
+from pykota.accounters import snmp, pjl
+
+class Accounter(AccounterBase) :
+    def __init__(self, kotabackend, arguments) :
+        """Initializes querying accounter."""
+        AccounterBase.__init__(self, kotabackend, arguments)
+        self.isSoftware = 0
+        
+    def getPrinterInternalPageCounter(self) :    
+        """Returns the printer's internal page counter."""
+        self.filter.logdebug("Reading printer %s's internal page counter..." % self.filter.printername)
+        counter = self.askPrinterPageCounter(self.filter.printerhostname)
+        self.filter.logdebug("Printer %s's internal page counter value is : %s" % (self.filter.printername, str(counter)))
+        return counter    
+        
+    def beginJob(self, printer) :    
+        """Saves printer internal page counter at start of job."""
+        # save page counter before job
+        self.LastPageCounter = self.getPrinterInternalPageCounter()
+        self.fakeBeginJob()
+        
+    def fakeBeginJob(self) :    
+        """Fakes a begining of a job."""
+        self.counterbefore = self.getLastPageCounter()
+        
+    def endJob(self, printer) :    
+        """Saves printer internal page counter at end of job."""
+        # save page counter after job
+        self.LastPageCounter = self.counterafter = self.getPrinterInternalPageCounter()
+        
+    def getJobSize(self, printer) :    
+        """Returns the actual job size."""
+        if (not self.counterbefore) or (not self.counterafter) :
+            # there was a problem retrieving page counter
+            self.filter.printInfo(_("A problem occured while reading printer %s's internal page counter.") % printer.Name, "warn")
+            if printer.LastJob.Exists :
+                # if there's a previous job, use the last value from database
+                self.filter.printInfo(_("Retrieving printer %s's page counter from database instead.") % printer.Name, "warn")
+                if not self.counterbefore : 
+                    self.counterbefore = printer.LastJob.PrinterPageCounter or 0
+                if not self.counterafter :
+                    self.counterafter = printer.LastJob.PrinterPageCounter or 0
+                before = min(self.counterbefore, self.counterafter)    
+                after = max(self.counterbefore, self.counterafter)    
+                self.counterbefore = before
+                self.counterafter = after
+                if (not self.counterbefore) or (not self.counterafter) or (self.counterbefore == self.counterafter) :
+                    self.filter.printInfo(_("Couldn't retrieve printer %s's internal page counter either before or after printing.") % printer.Name, "warn")
+                    self.filter.printInfo(_("Job's size forced to 1 page for printer %s.") % printer.Name, "warn")
+                    self.counterbefore = 0
+                    self.counterafter = 1
+            else :
+                self.filter.printInfo(_("No previous job in database for printer %s.") % printer.Name, "warn")
+                self.filter.printInfo(_("Job's size forced to 1 page for printer %s.") % printer.Name, "warn")
+                self.counterbefore = 0
+                self.counterafter = 1
+                
+        jobsize = (self.counterafter - self.counterbefore)    
+        if jobsize < 0 :
+            # Try to take care of HP printers 
+            # Their internal page counter is saved to NVRAM
+            # only every 10 pages. If the printer was switched
+            # off then back on during the job, and that the
+            # counters difference is negative, we know 
+            # the formula (we can't know if more than eleven
+            # pages were printed though) :
+            if jobsize > -10 :
+                jobsize += 10
+            else :    
+                # here we may have got a printer being replaced
+                # DURING the job. This is HIGHLY improbable (but already happened) !
+                self.filter.printInfo(_("Inconsistent values for printer %s's internal page counter.") % printer.Name, "warn")
+                self.filter.printInfo(_("Job's size forced to 1 page for printer %s.") % printer.Name, "warn")
+                jobsize = 1
+        return jobsize
+        
+    def askPrinterPageCounter(self, printer) :
+        """Returns the page counter from the printer via an external command.
+        
+           The external command must report the life time page number of the printer on stdout.
+        """
+        commandline = self.arguments.strip() % locals()
+        cmdlower = commandline.lower()
+        if cmdlower == "snmp" :
+            return snmp.Handler(self, printer).retrieveInternalPageCounter()
+        elif cmdlower == "pjl" :
+            return pjl.Handler(self, printer).retrieveInternalPageCounter()
+            
+        if printer is None :
+            raise PyKotaAccounterError, _("Unknown printer address in HARDWARE(%s) for printer %s") % (commandline, self.filter.printername)
+        while 1 :    
+            self.filter.printInfo(_("Launching HARDWARE(%s)...") % commandline)
+            pagecounter = None
+            child = popen2.Popen4(commandline)    
+            try :
+                answer = child.fromchild.read()
+            except IOError :    
+                # we were interrupted by a signal, certainely a SIGTERM
+                # caused by the user cancelling the current job
+                try :
+                    os.kill(child.pid, signal.SIGTERM)
+                except :    
+                    pass # already killed ?
+                self.filter.printInfo(_("SIGTERM was sent to hardware accounter %s (pid: %s)") % (commandline, child.pid))
+            else :    
+                lines = [l.strip() for l in answer.split("\n")]
+                for i in range(len(lines)) : 
+                    try :
+                        pagecounter = int(lines[i])
+                    except (AttributeError, ValueError) :
+                        self.filter.printInfo(_("Line [%s] skipped in accounter's output. Trying again...") % lines[i])
+                    else :    
+                        break
+            child.fromchild.close()    
+            child.tochild.close()
+            try :
+                status = child.wait()
+            except OSError, msg :    
+                self.filter.logdebug("Error while waiting for hardware accounter pid %s : %s" % (child.pid, msg))
+            else :    
+                if os.WIFEXITED(status) :
+                    status = os.WEXITSTATUS(status)
+                self.filter.printInfo(_("Hardware accounter %s exit code is %s") % (self.arguments, str(status)))
+                
+            if pagecounter is None :
+                message = _("Unable to query printer %s via HARDWARE(%s)") % (printer, commandline)
+                if self.onerror == "CONTINUE" :
+                    self.filter.printInfo(message, "error")
+                else :
+                    raise PyKotaAccounterError, message 
+            else :        
+                return pagecounter        
Index: pykota/tags/1.22/pykota/accounters/snmp.py
===================================================================
--- pykota/tags/1.22/pykota/accounters/snmp.py (revision 2205)
+++ pykota/tags/1.22/pykota/accounters/snmp.py (revision 2205)
@@ -0,0 +1,210 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+ITERATIONDELAY = 1.0   # 1 Second
+STABILIZATIONDELAY = 3 # We must read three times the same value to consider it to be stable
+
+import sys
+import os
+import time
+
+try :
+    from pysnmp.asn1.encoding.ber.error import TypeMismatchError
+    from pysnmp.mapping.udp.error import SnmpOverUdpError
+    from pysnmp.mapping.udp.role import Manager
+    from pysnmp.proto.api import alpha
+except ImportError :
+    class Handler :
+        def __init__(self, parent, printerhostname) :
+            """Just there to raise an exception."""
+            raise RuntimeError, "The pysnmp module is not available. Download it from http://pysnmp.sf.net/"
+else :    
+    pageCounterOID = ".1.3.6.1.2.1.43.10.2.1.4.1.1"  # SNMPv2-SMI::mib-2.43.10.2.1.4.1.1
+    pageCounterOID2 = ".1.3.6.1.2.1.43.10.2.1.5.1.1" # SNMPv2-SMI::mib-2.43.10.2.1.5.1.1
+    hrPrinterStatusOID = ".1.3.6.1.2.1.25.3.5.1.1.1" # SNMPv2-SMI::mib-2.25.3.5.1.1.1
+    printerStatusValues = { 1 : 'other',
+                            2 : 'unknown',
+                            3 : 'idle',
+                            4 : 'printing',
+                            5 : 'warmup',
+                          }
+    hrDeviceStatusOID = ".1.3.6.1.2.1.25.3.2.1.5.1" # SNMPv2-SMI::mib-2.25.3.2.1.5.1
+    deviceStatusValues = { 1 : 'unknown',
+                           2 : 'running',
+                           3 : 'warning',
+                           4 : 'testing',
+                           5 : 'down',
+                         }  
+    hrPrinterDetectedErrorStateOID = ".1.3.6.1.2.1.25.3.5.1.2.1" # SNMPv2-SMI::mib-2.25.3.5.1.2.1
+    prtConsoleDisplayBufferTextOID = ".1.3.6.1.2.1.43.16.5.1.2.1.1" # SNMPv2-SMI::mib-2.43.16.5.1.2.1.1
+                          
+    #                      
+    # Documentation taken from RFC 3805 (Printer MIB v2) and RFC 2790 (Host Resource MIB)
+    #
+    class Handler :
+        """A class for SNMP print accounting."""
+        def __init__(self, parent, printerhostname) :
+            self.parent = parent
+            self.printerHostname = printerhostname
+            self.printerInternalPageCounter = None
+            self.printerInternalPageCounter2 = None
+            self.printerStatus = None
+            self.deviceStatus = None
+            
+        def retrieveSNMPValues(self) :    
+            """Retrieves a printer's internal page counter and status via SNMP."""
+            ver = alpha.protoVersions[alpha.protoVersionId1]
+            req = ver.Message()
+            req.apiAlphaSetCommunity('public')
+            req.apiAlphaSetPdu(ver.GetRequestPdu())
+            req.apiAlphaGetPdu().apiAlphaSetVarBindList((pageCounterOID, ver.Null()), \
+                                                        (pageCounterOID2, ver.Null()), \
+                                                        (hrPrinterStatusOID, ver.Null()), \
+                                                        (hrDeviceStatusOID, ver.Null()))
+            tsp = Manager()
+            try :
+                tsp.sendAndReceive(req.berEncode(), (self.printerHostname, 161), (self.handleAnswer, req))
+            except SnmpOverUdpError, msg :    
+                self.parent.filter.printInfo(_("Network error while doing SNMP queries on printer %s : %s") % (self.printerHostname, msg), "warn")
+            tsp.close()
+    
+        def handleAnswer(self, wholeMsg, notusedhere, req):
+            """Decodes and handles the SNMP answer."""
+            self.parent.filter.logdebug("SNMP message : '%s'" % repr(wholeMsg))
+            ver = alpha.protoVersions[alpha.protoVersionId1]
+            rsp = ver.Message()
+            try :
+                rsp.berDecode(wholeMsg)
+            except TypeMismatchError, msg :    
+                self.parent.filter.printInfo(_("SNMP message decoding error for printer %s : %s") % (self.printerHostname, msg), "warn")
+            else :
+                if req.apiAlphaMatch(rsp):
+                    errorStatus = rsp.apiAlphaGetPdu().apiAlphaGetErrorStatus()
+                    if errorStatus:
+                        self.parent.filter.printInfo(_("Problem encountered while doing SNMP queries on printer %s : %s") % (self.printerHostname, errorStatus), "warn")
+                    else:
+                        self.values = []
+                        for varBind in rsp.apiAlphaGetPdu().apiAlphaGetVarBindList():
+                            self.values.append(varBind.apiAlphaGetOidVal()[1].rawAsn1Value)
+                        try :    
+                            # keep maximum value seen for printer's internal page counter
+                            self.printerInternalPageCounter = max(self.printerInternalPageCounter, self.values[0])
+                            self.printerInternalPageCounter2 = max(self.printerInternalPageCounter2, self.values[1])
+                            self.printerStatus = self.values[2]
+                            self.deviceStatus = self.values[3]
+                            self.parent.filter.logdebug("SNMP answer is decoded : PageCounters : (%s, %s)  PrinterStatus : %s  DeviceStatus : %s" % tuple(self.values))
+                        except IndexError :    
+                            self.parent.filter.logdebug("SNMP answer is incomplete : %s" % str(self.values))
+                            pass
+                        else :    
+                            return 1
+                        
+        def waitPrinting(self) :
+            """Waits for printer status being 'printing'."""
+            firstvalue = None
+            while 1:
+                self.retrieveSNMPValues()
+                statusAsString = printerStatusValues.get(self.printerStatus)
+                if statusAsString in ('printing', 'warmup') :
+                    break
+                if self.printerInternalPageCounter is not None :    
+                    if firstvalue is None :
+                        # first time we retrieved a page counter, save it
+                        firstvalue = self.printerInternalPageCounter
+                    else :     
+                        # second time (or later)
+                        if firstvalue < self.printerInternalPageCounter :
+                            # Here we have a printer which lies :
+                            # it says it is not printing or warming up
+                            # BUT the page counter increases !!!
+                            # So we can probably quit being sure it is printing.
+                            self.parent.filter.printInfo("Printer %s is lying to us !!!" % self.parent.filter.printername, "warn")
+                            break
+                self.parent.filter.logdebug(_("Waiting for printer %s to be printing...") % self.parent.filter.printername)    
+                time.sleep(ITERATIONDELAY)
+            
+        def waitIdle(self) :
+            """Waits for printer status being 'idle'."""
+            idle_num = idle_flag = 0
+            while 1 :
+                self.retrieveSNMPValues()
+                pstatusAsString = printerStatusValues.get(self.printerStatus)
+                dstatusAsString = deviceStatusValues.get(self.deviceStatus)
+                idle_flag = 0
+                if (pstatusAsString == 'idle') or \
+                   ((pstatusAsString == 'other') and \
+                    (dstatusAsString == 'running')) :
+                    idle_flag = 1       # Standby / Powersave is considered idle
+                if idle_flag :    
+                    idle_num += 1
+                    if idle_num > STABILIZATIONDELAY :
+                        # printer status is stable, we can exit
+                        break
+                else :    
+                    idle_num = 0
+                self.parent.filter.logdebug(_("Waiting for printer %s's idle status to stabilize...") % self.parent.filter.printername)    
+                time.sleep(ITERATIONDELAY)
+                
+        def retrieveInternalPageCounter(self) :
+            """Returns the page counter from the printer via internal SNMP handling."""
+            try :
+                if (os.environ.get("PYKOTASTATUS") != "CANCELLED") and \
+                   (os.environ.get("PYKOTAACTION") != "DENY") and \
+                   (os.environ.get("PYKOTAPHASE") == "AFTER") and \
+                   self.parent.filter.jobSizeBytes :
+                    self.waitPrinting()
+                self.waitIdle()    
+            except :    
+                if self.printerInternalPageCounter is None :
+                    raise
+                else :    
+                    self.parent.filter.printInfo(_("SNMP querying stage interrupted. Using latest value seen for internal page counter (%s) on printer %s.") % (self.printerInternalPageCounter, self.parent.filter.printername), "warn")
+            return self.printerInternalPageCounter
+            
+if __name__ == "__main__" :            
+    if len(sys.argv) != 2 :    
+        sys.stderr.write("Usage :  python  %s  printer_ip_address\n" % sys.argv[0])
+    else :    
+        def _(msg) :
+            return msg
+            
+        class fakeFilter :
+            def __init__(self) :
+                self.printername = "FakePrintQueue"
+                self.jobSizeBytes = 1
+                
+            def printInfo(self, msg, level="info") :
+                sys.stderr.write("%s : %s\n" % (level.upper(), msg))
+                sys.stderr.flush()
+                
+            def logdebug(self, msg) :    
+                self.printInfo(msg, "debug")
+                
+        class fakeAccounter :        
+            def __init__(self) :
+                self.filter = fakeFilter()
+                self.protocolHandler = Handler(self, sys.argv[1])
+            
+        acc = fakeAccounter()            
+        print "Internal page counter's value is : %s" % acc.protocolHandler.retrieveInternalPageCounter()
Index: pykota/tags/1.22/pykota/accounters/__init__.py
===================================================================
--- pykota/tags/1.22/pykota/accounters/__init__.py (revision 2146)
+++ pykota/tags/1.22/pykota/accounters/__init__.py (revision 2146)
@@ -0,0 +1,22 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
Index: pykota/tags/1.22/pykota/accounters/Makefile.am
===================================================================
--- pykota/tags/1.22/pykota/accounters/Makefile.am (revision 2146)
+++ pykota/tags/1.22/pykota/accounters/Makefile.am (revision 2146)
@@ -0,0 +1,7 @@
+pykota_accountersdir = $(pythondir)/pykota/accounters
+
+pykota_accounters_PYTHON = 	\
+	software.py				\
+	__init__.py				\
+	hardware.py
+
Index: pykota/tags/1.22/pykota/accounters/pjl.py
===================================================================
--- pykota/tags/1.22/pykota/accounters/pjl.py (revision 2205)
+++ pykota/tags/1.22/pykota/accounters/pjl.py (revision 2205)
@@ -0,0 +1,179 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import socket
+import time
+import signal
+
+ITERATIONDELAY = 1.0   # 1 Second
+STABILIZATIONDELAY = 3 # We must read three times the same value to consider it to be stable
+
+pjlMessage = "\033%-12345X@PJL USTATUSOFF\r\n@PJL INFO STATUS\r\n@PJL INFO PAGECOUNT\r\n\033%-12345X"
+pjlStatusValues = {
+                    "10000" : "Powersave Mode",
+                    "10001" : "Ready Online",
+                    "10002" : "Ready Offline",
+                    "10003" : "Warming Up",
+                    "10004" : "Self Test",
+                    "10005" : "Reset",
+                    "10023" : "Printing",
+                    "35078" : "Powersave Mode",         # 10000 is ALSO powersave !!!
+                    "40000" : "Sleep Mode",             # Standby
+                  }
+                  
+class Handler :
+    """A class for PJL print accounting."""
+    def __init__(self, parent, printerhostname) :
+        self.parent = parent
+        self.printerHostname = printerhostname
+        self.printerInternalPageCounter = self.printerStatus = None
+        self.timedout = 0
+        
+    def alarmHandler(self, signum, frame) :    
+        """Query has timedout, handle this."""
+        self.timedout = 1
+        raise IOError, "Waiting for PJL answer timed out. Please try again later."
+        
+    def retrievePJLValues(self) :    
+        """Retrieves a printer's internal page counter and status via PJL."""
+        port = 9100
+        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        try :
+            sock.connect((self.printerHostname, port))
+        except socket.error, msg :
+            self.parent.filter.printInfo(_("Problem during connection to %s:%s : %s") % (self.printerHostname, port, msg), "warn")
+        else :
+            try :
+                sock.send(pjlMessage)
+            except socket.error, msg :
+                self.parent.filter.printInfo(_("Problem while sending PJL query to %s:%s : %s") % (self.printerHostname, port, msg), "warn")
+            else :    
+                actualpagecount = self.printerStatus = None
+                self.timedout = 0
+                while (self.timedout == 0) or (actualpagecount is None) or (self.printerStatus is None) :
+                    signal.signal(signal.SIGALRM, self.alarmHandler)
+                    signal.alarm(3)
+                    try :
+                        answer = sock.recv(1024)
+                    except IOError, msg :    
+                        break   # our alarm handler was launched, probably
+                    else :    
+                        readnext = 0
+                        for line in [l.strip() for l in answer.split()] : 
+                            if line.startswith("CODE=") :
+                                self.printerStatus = line.split("=")[1]
+                            elif line.startswith("PAGECOUNT") :    
+                                readnext = 1 # page counter is on next line
+                            elif readnext :    
+                                actualpagecount = int(line.strip())
+                                readnext = 0
+                    signal.alarm(0)
+                self.printerInternalPageCounter = max(actualpagecount, self.printerInternalPageCounter)
+        sock.close()
+        
+    def waitPrinting(self) :
+        """Waits for printer status being 'printing'."""
+        firstvalue = None
+        while 1:
+            self.retrievePJLValues()
+            if self.printerStatus in ('10023', '10003') :
+                break
+            if self.printerInternalPageCounter is not None :    
+                if firstvalue is None :
+                    # first time we retrieved a page counter, save it
+                    firstvalue = self.printerInternalPageCounter
+                else :     
+                    # second time (or later)
+                    if firstvalue < self.printerInternalPageCounter :
+                        # Here we have a printer which lies :
+                        # it says it is not printing or warming up
+                        # BUT the page counter increases !!!
+                        # So we can probably quit being sure it is printing.
+                        self.parent.filter.printInfo("Printer %s is lying to us !!!" % self.parent.filter.printername, "warn")
+                        break
+            self.parent.filter.logdebug(_("Waiting for printer %s to be printing...") % self.parent.filter.printername)
+            time.sleep(ITERATIONDELAY)
+        
+    def waitIdle(self) :
+        """Waits for printer status being 'idle'."""
+        idle_num = idle_flag = 0
+        while 1 :
+            self.retrievePJLValues()
+            idle_flag = 0
+            if self.printerStatus in ('10000', '10001', '35078', '40000') :
+                idle_flag = 1
+            if idle_flag :    
+                idle_num += 1
+                if idle_num > STABILIZATIONDELAY :
+                    # printer status is stable, we can exit
+                    break
+            else :    
+                idle_num = 0
+            self.parent.filter.logdebug(_("Waiting for printer %s's idle status to stabilize...") % self.parent.filter.printername)
+            time.sleep(ITERATIONDELAY)
+    
+    def retrieveInternalPageCounter(self) :
+        """Returns the page counter from the printer via internal PJL handling."""
+        try :
+            if (os.environ.get("PYKOTASTATUS") != "CANCELLED") and \
+               (os.environ.get("PYKOTAACTION") != "DENY") and \
+               (os.environ.get("PYKOTAPHASE") == "AFTER") and \
+               self.parent.filter.jobSizeBytes :
+                self.waitPrinting()
+            self.waitIdle()    
+        except :    
+            if self.printerInternalPageCounter is None :
+                raise
+            else :    
+                self.parent.filter.printInfo(_("PJL querying stage interrupted. Using latest value seen for internal page counter (%s) on printer %s.") % (self.printerInternalPageCounter, self.parent.filter.printername), "warn")
+        return self.printerInternalPageCounter
+            
+if __name__ == "__main__" :            
+    if len(sys.argv) != 2 :    
+        sys.stderr.write("Usage :  python  %s  printer_ip_address\n" % sys.argv[0])
+    else :    
+        def _(msg) :
+            return msg
+            
+        class fakeFilter :
+            def __init__(self) :
+                self.printername = "FakePrintQueue"
+                self.jobSizeBytes = 1
+                
+            def printInfo(self, msg, level="info") :
+                sys.stderr.write("%s : %s\n" % (level.upper(), msg))
+                sys.stderr.flush()
+                
+            def logdebug(self, msg) :    
+                self.printInfo(msg, "debug")
+                
+        class fakeAccounter :        
+            def __init__(self) :
+                self.filter = fakeFilter()
+                self.protocolHandler = Handler(self, sys.argv[1])
+            
+        acc = fakeAccounter()            
+        print "Internal page counter's value is : %s" % acc.protocolHandler.retrieveInternalPageCounter()
Index: pykota/tags/1.22/pykota/Makefile.am
===================================================================
--- pykota/tags/1.22/pykota/Makefile.am (revision 2146)
+++ pykota/tags/1.22/pykota/Makefile.am (revision 2146)
@@ -0,0 +1,15 @@
+pykotadir = $(pythondir)/pykota
+
+pykota_PYTHON = 	\
+	accounter.py	\
+	config.py		\
+	__init__.py		\
+	logger.py		\
+	reporter.py		\
+	storage.py		\
+	tool.py			\
+	pdlanalyzer.py			\
+	version.py
+
+SUBDIRS = accounters loggers reporters storages
+
Index: pykota/tags/1.22/pykota/accounter.py
===================================================================
--- pykota/tags/1.22/pykota/accounter.py (revision 2147)
+++ pykota/tags/1.22/pykota/accounter.py (revision 2147)
@@ -0,0 +1,98 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+
+class PyKotaAccounterError(Exception):
+    """An exception for Accounter related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+    
+class AccounterBase :    
+    """A class to account print usage by querying printers."""
+    def __init__(self, kotafilter, arguments) :
+        """Sets instance vars depending on the current printer."""
+        self.filter = kotafilter
+        self.arguments = arguments
+        self.onerror = self.filter.config.getPrinterOnAccounterError(self.filter.printername)
+        self.isSoftware = 1 # by default software accounting
+        
+    def getLastPageCounter(self) :    
+        """Returns last internal page counter value (possibly faked)."""
+        try :
+            return self.LastPageCounter or 0
+        except :    
+            return 0
+            
+    def beginJob(self, printer) :    
+        """Saves the computed job size."""
+        # computes job's size
+        self.JobSize = self.computeJobSize()
+        if ((self.filter.printingsystem == "CUPS") \
+            and (self.filter.preserveinputfile is not None)) \
+            or (self.filter.printingsystem != "CUPS") :
+            self.JobSize *= self.filter.copies
+        
+        # get last job information for this printer
+        if not printer.LastJob.Exists :
+            # The printer hasn't been used yet, from PyKota's point of view
+            self.LastPageCounter = 0
+        else :    
+            # get last job size and page counter from Quota Storage
+            # Last lifetime page counter before actual job is 
+            # last page counter + last job size
+            self.LastPageCounter = int(printer.LastJob.PrinterPageCounter or 0) + int(printer.LastJob.JobSize or 0)
+        
+    def fakeBeginJob(self) :    
+        """Do nothing."""
+        pass
+        
+    def endJob(self, printer) :    
+        """Do nothing."""
+        pass
+        
+    def getJobSize(self, printer) :    
+        """Returns the actual job size."""
+        try :
+            return self.JobSize
+        except AttributeError :    
+            return 0
+        
+    def computeJobSize(self) :    
+        """Must be overriden in children classes."""
+        raise RuntimeError, "AccounterBase.computeJobSize() must be overriden !"
+        
+def openAccounter(kotafilter) :
+    """Returns a connection handle to the appropriate accounter."""
+    (backend, args) = kotafilter.config.getAccounterBackend(kotafilter.printername)
+    try :
+        exec "from pykota.accounters import %s as accounterbackend" % backend.lower()
+    except ImportError :
+        raise PyKotaAccounterError, _("Unsupported accounter backend %s") % backend
+    else :    
+        return accounterbackend.Accounter(kotafilter, args)
Index: pykota/tags/1.22/pykota/pdlanalyzer.py
===================================================================
--- pykota/tags/1.22/pykota/pdlanalyzer.py (revision 2199)
+++ pykota/tags/1.22/pykota/pdlanalyzer.py (revision 2199)
@@ -0,0 +1,1016 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import re
+from struct import unpack
+import tempfile
+import mmap
+import popen2
+    
+KILOBYTE = 1024    
+MEGABYTE = 1024 * KILOBYTE    
+LASTBLOCKSIZE = int(KILOBYTE / 4)
+
+class PDLAnalyzerError(Exception):
+    """An exception for PDL Analyzer related stuff."""
+    def __init__(self, message = ""):
+        self.message = message
+        Exception.__init__(self, message)
+    def __repr__(self):
+        return self.message
+    __str__ = __repr__
+    
+class PostScriptAnalyzer :
+    """A class to parse PostScript documents."""
+    def __init__(self, infile, debug=0) :
+        """Initialize PostScript Analyzer."""
+        self.debug = debug
+        self.infile = infile
+        self.copies = 1
+       
+    def throughGhostScript(self) :
+        """Get the count through GhostScript, useful for non-DSC compliant PS files."""
+        if self.debug :
+            sys.stderr.write("Internal parser sucks, using GhostScript instead...\n")
+        self.infile.seek(0)
+        command = 'gs -sDEVICE=bbox -dNOPAUSE -dBATCH -dQUIET - 2>&1 | grep -c "%%HiResBoundingBox:" 2>/dev/null'
+        child = popen2.Popen4(command)
+        try :
+            data = self.infile.read(MEGABYTE)    
+            while data :
+                child.tochild.write(data)
+                data = self.infile.read(MEGABYTE)
+            child.tochild.flush()
+            child.tochild.close()    
+        except (IOError, OSError), msg :    
+            raise PDLAnalyzerError, "Problem during analysis of Binary PostScript document : %s" % msg
+            
+        pagecount = 0
+        try :
+            pagecount = int(child.fromchild.readline().strip())
+        except (IOError, OSError, AttributeError, ValueError), msg :
+            raise PDLAnalyzerError, "Problem during analysis of Binary PostScript document : %s" % msg
+        child.fromchild.close()
+        
+        try :
+            child.wait()
+        except OSError, msg :    
+            raise PDLAnalyzerError, "Problem during analysis of Binary PostScript document : %s" % msg
+        return pagecount * self.copies
+        
+    def natively(self) :
+        """Count pages in a DSC compliant PostScript document."""
+        self.infile.seek(0)
+        pagecount = 0
+        for line in self.infile.xreadlines() : 
+            if line.startswith(r"%%Page: ") :
+                pagecount += 1
+            elif line.startswith(r"%%Requirements: numcopies(") :    
+                try :
+                    number = int(line.strip().split('(')[1].split(')')[0])
+                except :     
+                    pass
+                else :    
+                    if number > self.copies :
+                        self.copies = number
+            elif line.startswith(r"%%BeginNonPPDFeature: NumCopies ") :
+                # handle # of copies set by some Windows printer driver
+                try :
+                    number = int(line.strip().split()[2])
+                except :     
+                    pass
+                else :    
+                    if number > self.copies :
+                        self.copies = number
+            elif line.startswith("1 dict dup /NumCopies ") :
+                # handle # of copies set by mozilla/kprinter
+                try :
+                    number = int(line.strip().split()[4])
+                except :     
+                    pass
+                else :    
+                    if number > self.copies :
+                        self.copies = number
+        return pagecount * self.copies
+        
+    def getJobSize(self) :    
+        """Count pages in PostScript document."""
+        return self.natively() or self.throughGhostScript()
+        
+class PDFAnalyzer :
+    """A class to parse PDF documents."""
+    def __init__(self, infile, debug=0) :
+        """Initialize PDF Analyzer."""
+        self.debug = debug
+        self.infile = infile
+                
+    def getJobSize(self) :    
+        """Counts pages in a PDF document."""
+        regexp = re.compile(r"(/Type) ?(/Page)[/ \t\r\n]")
+        pagecount = 0
+        for line in self.infile.xreadlines() : 
+            pagecount += len(regexp.findall(line))
+        return pagecount    
+        
+class ESCP2Analyzer :
+    """A class to parse ESC/P2 documents."""
+    def __init__(self, infile, debug=0) :
+        """Initialize ESC/P2 Analyzer."""
+        self.debug = debug
+        self.infile = infile
+                
+    def getJobSize(self) :    
+        """Counts pages in an ESC/P2 document."""
+        # with Gimpprint, at least, for each page there
+        # are two Reset Printer sequences (ESC + @)
+        marker1 = "\033@"
+        
+        # with other software or printer driver, we
+        # may prefer to search for "\r\n\fESCAPE"
+        # or "\r\fESCAPE"
+        marker2r = "\r\f\033"
+        marker2rn = "\r\n\f\033"
+        
+        # and ghostscript's stcolor for example seems to
+        # output ESC + @ + \f for each page plus one
+        marker3 = "\033@\f"
+        
+        # while ghostscript's escp driver outputs instead
+        # \f + ESC + @
+        marker4 = "\f\033@"
+        
+        data = self.infile.read()
+        pagecount1 = data.count(marker1)
+        pagecount2 = max(data.count(marker2r), data.count(marker2rn))
+        pagecount3 = data.count(marker3)
+        pagecount4 = data.count(marker4)
+            
+        if pagecount2 :    
+            return pagecount2
+        elif pagecount3 > 1 :     
+            return pagecount3 - 1
+        elif pagecount4 :    
+            return pagecount4
+        else :    
+            return int(pagecount1 / 2)       
+        
+class PCLAnalyzer :
+    """A class to parse PCL3, PCL4, PCL5 documents."""
+    mediasizes = {  # ESC&l####A
+                    0 : "Default",
+                    1 : "Executive",
+                    2 : "Letter",
+                    3 : "Legal",
+                    6 : "Ledger", 
+                    25 : "A5",
+                    26 : "A4",
+                    27 : "A3",
+                    45 : "JB5",
+                    46 : "JB4",
+                    71 : "HagakiPostcard",
+                    72 : "OufukuHagakiPostcard",
+                    80 : "MonarchEnvelope",
+                    81 : "COM10Envelope",
+                    90 : "DLEnvelope",
+                    91 : "C5Envelope",
+                    100 : "B5Envelope",
+                    101 : "Custom",
+                 }   
+                 
+    mediasources = { # ESC&l####H
+                     0 : "Default",
+                     1 : "Main",
+                     2 : "Manual",
+                     3 : "ManualEnvelope",
+                     4 : "Alternate",
+                     5 : "OptionalLarge",
+                     6 : "EnvelopeFeeder",
+                     7 : "Auto",
+                     8 : "Tray1",
+                   }
+                   
+    orientations = { # ESC&l####O
+                     0 : "Portrait",
+                     1 : "Landscape",
+                     2 : "ReversePortrait",
+                     3 : "ReverseLandscape",
+                   }
+                   
+    mediatypes = { # ESC&l####M
+                     0 : "Plain",
+                     1 : "Bond",
+                     2 : "Special",
+                     3 : "Glossy",
+                     4 : "Transparent",
+                   }
+                   
+                   
+    def __init__(self, infile, debug=0) :
+        """Initialize PCL Analyzer."""
+        self.debug = debug
+        self.infile = infile
+        
+    def setPageDict(self, pages, number, attribute, value) :
+        """Initializes a page dictionnary."""
+        dict = pages.setdefault(number, { "copies" : 1, "mediasource" : "Main", "mediasize" : "Default", "mediatype" : "Plain", "orientation" : "Portrait"})
+        dict[attribute] = value
+        
+    def getJobSize(self) :     
+        """Count pages in a PCL5 document.
+         
+           Should also work for PCL3 and PCL4 documents.
+           
+           Algorithm from pclcount
+           (c) 2003, by Eduardo Gielamo Oliveira & Rodolfo Broco Manin 
+           published under the terms of the GNU General Public Licence v2.
+          
+           Backported from C to Python by Jerome Alet, then enhanced
+           with more PCL tags detected. I think all the necessary PCL tags
+           are recognized to correctly handle PCL5 files wrt their number
+           of pages. The documentation used for this was :
+         
+           HP PCL/PJL Reference Set
+           PCL5 Printer Language Technical Quick Reference Guide
+           http://h20000.www2.hp.com/bc/docs/support/SupportManual/bpl13205/bpl13205.pdf 
+        """
+        infileno = self.infile.fileno()
+        minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED)
+        tagsends = { "&n" : "W", 
+                     "&b" : "W", 
+                     "*i" : "W", 
+                     "*l" : "W", 
+                     "*m" : "W", 
+                     "*v" : "W", 
+                     "*c" : "W", 
+                     "(f" : "W", 
+                     "(s" : "W", 
+                     ")s" : "W", 
+                     "&p" : "X", 
+                     # "&l" : "XHAOM",  # treated specially
+                     "&a" : "G", # TODO : 0 means next side, 1 front side, 2 back side
+                     "*g" : "W",
+                     "*r" : "sbABC",
+                     "*t" : "R",
+                     # "*b" : "VW", # treated specially because it occurs very often
+                   }  
+        pagecount = resets = ejects = backsides = startgfx = endgfx = 0
+        starb = ampl = ispcl3 = escstart = 0
+        mediasourcecount = mediasizecount = orientationcount = mediatypecount = 0
+        tag = None
+        pages = {}
+        pos = 0
+        try :
+            while 1 :
+                char = minfile[pos] ; pos += 1
+                if char == "\014" :    
+                    pagecount += 1
+                elif char == "\033" :    
+                    starb = ampl = 0
+                    #
+                    #     <ESC>*b###y#m###v###w... -> PCL3 raster graphics
+                    #     <ESC>*b###W -> Start of a raster data row/block
+                    #     <ESC>*b###V -> Start of a raster data plane
+                    #     <ESC>*c###W -> Start of a user defined pattern
+                    #     <ESC>*i###W -> Start of a viewing illuminant block
+                    #     <ESC>*l###W -> Start of a color lookup table
+                    #     <ESC>*m###W -> Start of a download dither matrix block
+                    #     <ESC>*v###W -> Start of a configure image data block
+                    #     <ESC>*r1A -> Start Gfx 
+                    #     <ESC>(s###W -> Start of a characters description block
+                    #     <ESC>)s###W -> Start of a fonts description block
+                    #     <ESC>(f###W -> Start of a symbol set block
+                    #     <ESC>&b###W -> Start of configuration data block
+                    #     <ESC>&l###X -> Number of copies for current page
+                    #     <ESC>&n###W -> Starts an alphanumeric string ID block
+                    #     <ESC>&p###X -> Start of a non printable characters block
+                    #     <ESC>&a2G -> Back side when duplex mode as generated by rastertohp
+                    #     <ESC>*g###W -> Needed for planes in PCL3 output
+                    #     <ESC>&l###H (or only 0 ?) -> Eject if NumPlanes > 1, as generated by rastertohp. Also defines mediasource
+                    #     <ESC>&l###A -> mediasize
+                    #     <ESC>&l###O -> orientation
+                    #     <ESC>&l###M -> mediatype
+                    #     <ESC>*t###R -> gfx resolution
+                    #
+                    tagstart = minfile[pos] ; pos += 1
+                    if tagstart in "E9=YZ" : # one byte PCL tag
+                        if tagstart == "E" :
+                            resets += 1
+                        continue             # skip to next tag
+                    tag = tagstart + minfile[pos] ; pos += 1
+                    if tag == "*b" : 
+                        starb = 1
+                        tagend = "VW"
+                    elif tag == "&l" :    
+                        ampl = 1
+                        tagend = "XHAOM"
+                    else :    
+                        try :
+                            tagend = tagsends[tag]
+                        except KeyError :    
+                            continue # Unsupported PCL tag
+                    # Now read the numeric argument
+                    size = 0
+                    while 1 :
+                        char = minfile[pos] ; pos += 1
+                        if not char.isdigit() :
+                            break
+                        size = (size * 10) + int(char)    
+                    if char in tagend :    
+                        if tag == "&l" :
+                            if char == "X" : 
+                                self.setPageDict(pages, pagecount, "copies", size)
+                            elif char == "H" :
+                                self.setPageDict(pages, pagecount, "mediasource", self.mediasources.get(size, str(size)))
+                                mediasourcecount += 1
+                                ejects += 1 
+                            elif char == "A" :
+                                self.setPageDict(pages, pagecount, "mediasize", self.mediasizes.get(size, str(size)))
+                                mediasizecount += 1
+                            elif char == "O" :
+                                self.setPageDict(pages, pagecount, "orientation", self.orientations.get(size, str(size)))
+                                orientationcount += 1
+                            elif char == "M" :
+                                self.setPageDict(pages, pagecount, "mediatype", self.mediatypes.get(size, str(size)))
+                                mediatypecount += 1
+                        elif tag == "*r" :
+                            # Special tests for PCL3
+                            if (char == "s") and size :
+                                while 1 :
+                                    char = minfile[pos] ; pos += 1
+                                    if char == "A" :
+                                        break
+                            elif (char == "b") and (minfile[pos] == "C") and not size :
+                                ispcl3 = 1 # Certainely a PCL3 file
+                            startgfx += (char == "A") and (minfile[pos - 2] in ("0", "1", "2", "3")) # Start Gfx
+                            endgfx += (not size) and (char in ("C", "B")) # End Gfx
+                        elif tag == "*t" :    
+                            escstart += 1
+                        elif (tag == "&a") and (size == 2) :
+                            backsides += 1      # Back side in duplex mode
+                        else :    
+                            # we just ignore the block.
+                            if tag == "&n" : 
+                                # we have to take care of the operation id byte
+                                # which is before the string itself
+                                size += 1
+                            pos += size    
+                else :                            
+                    if starb :
+                        # special handling of PCL3 in which 
+                        # *b introduces combined ESCape sequences
+                        size = 0
+                        while 1 :
+                            char = minfile[pos] ; pos += 1
+                            if not char.isdigit() :
+                                break
+                            size = (size * 10) + int(char)    
+                        if char in ("w", "v") :    
+                            ispcl3 = 1  # certainely a PCL3 document
+                            pos += size - 1
+                        elif char in ("y", "m") :    
+                            ispcl3 = 1  # certainely a PCL3 document
+                            pos -= 1    # fix position : we were ahead
+                    elif ampl :        
+                        # special handling of PCL3 in which 
+                        # &l introduces combined ESCape sequences
+                        size = 0
+                        while 1 :
+                            char = minfile[pos] ; pos += 1
+                            if not char.isdigit() :
+                                break
+                            size = (size * 10) + int(char)    
+                        if char in ("a", "o", "h", "m") :    
+                            ispcl3 = 1  # certainely a PCL3 document
+                            pos -= 1    # fix position : we were ahead
+                            if char == "h" :
+                                self.setPageDict(pages, pagecount, "mediasource", self.mediasources.get(size, str(size)))
+                                mediasourcecount += 1
+                            elif char == "a" :
+                                self.setPageDict(pages, pagecount, "mediasize", self.mediasizes.get(size, str(size)))
+                                mediasizecount += 1
+                            elif char == "o" :
+                                self.setPageDict(pages, pagecount, "orientation", self.orientations.get(size, str(size)))
+                                orientationcount += 1
+                            elif char == "m" :
+                                self.setPageDict(pages, pagecount, "mediatype", self.mediatypes.get(size, str(size)))
+                                mediatypecount += 1
+        except IndexError : # EOF ?
+            minfile.close() # reached EOF
+                            
+        # if pagecount is still 0, we will use the number
+        # of resets instead of the number of form feed characters.
+        # but the number of resets is always at least 2 with a valid
+        # pcl file : one at the very start and one at the very end
+        # of the job's data. So we substract 2 from the number of
+        # resets. And since on our test data we needed to substract
+        # 1 more, we finally substract 3, and will test several
+        # PCL files with this. If resets < 2, then the file is
+        # probably not a valid PCL file, so we use 0
+        
+        if self.debug :
+            sys.stderr.write("pagecount : %s\n" % pagecount)
+            sys.stderr.write("resets : %s\n" % resets)
+            sys.stderr.write("ejects : %s\n" % ejects)
+            sys.stderr.write("backsides : %s\n" % backsides)
+            sys.stderr.write("startgfx : %s\n" % startgfx)
+            sys.stderr.write("endgfx : %s\n" % endgfx)
+            sys.stderr.write("mediasourcecount : %s\n" % mediasourcecount)
+            sys.stderr.write("mediasizecount : %s\n" % mediasizecount)
+            sys.stderr.write("orientationcount : %s\n" % orientationcount)
+            sys.stderr.write("mediatypecount : %s\n" % mediatypecount)
+            sys.stderr.write("escstart : %s\n" % escstart)
+        
+#        if not pagecount :
+#            pagecount = (pagecount or ((resets - 3) * (resets > 2)))
+#        else :    
+#            # here we add counters for other ways new pages may have
+#            # been printed and ejected by the printer
+#            pagecount += ejects + backsides
+#        
+#        # now handle number of copies for each page (may differ).
+#        # in duplex mode, number of copies may be sent only once.
+#        for pnum in range(pagecount) :
+#            # if no number of copies defined, take the preceding one else the one set before any page else 1.
+#            page = pages.get(pnum, pages.get(pnum - 1, pages.get(0, { "copies" : 1 })))
+#            pagecount += (page["copies"] - 1)
+#            
+#        # in PCL3 files, there's one Start Gfx tag per page
+#        if ispcl3 :
+#            if endgfx == int(startgfx / 2) : # special case for cdj1600
+#                pagecount = endgfx 
+#            elif startgfx :
+#                pagecount = startgfx
+#            elif endgfx :    
+#                pagecount = endgfx
+                
+            
+        if pagecount == mediasourcecount == escstart : 
+            pass        # should be OK.
+        elif (not startgfx) and (not endgfx) :
+            pagecount = ejects or pagecount
+        elif startgfx == endgfx :    
+            pagecount = startgfx
+        elif startgfx == (endgfx - 1) :    
+            pagecount = startgfx
+        else :    
+            pagecount = abs(startgfx - endgfx)
+            
+        if self.debug :        
+            for pnum in range(pagecount) :
+                # if no number of copies defined, take the preceding one else the one set before any page else 1.
+                page = pages.get(pnum, pages.get(pnum - 1, pages.get(0, { "copies" : 1, "mediasource" : "Main", "mediasize" : "Default", "mediatype" : "Plain", "orientation" : "Portrait"})))
+                sys.stderr.write("%s*%s*%s*%s*%s\n" % (page["copies"], page["mediatype"], page["mediasize"], page["orientation"], page["mediasource"]))
+                
+        return pagecount
+        
+class PCLXLAnalyzer :
+    """A class to parse PCL6 (aka XL) documents."""
+    mediasizes = { 
+                    0 : "Letter",
+                    1 : "Legal",
+                    2 : "A4",
+                    3 : "Executive",
+                    4 : "Ledger",
+                    5 : "A3",
+                    6 : "COM10Envelope",
+                    7 : "MonarchEnvelope",
+                    8 : "C5Envelope",
+                    9 : "DLEnvelope",
+                    10 : "JB4",
+                    11 : "JB5",
+                    12 : "B5Envelope",
+                    14 : "JPostcard",
+                    15 : "JDoublePostcard",
+                    16 : "A5",
+                    17 : "A6",
+                    18 : "JB6",
+                 }   
+                 
+    mediasources = {             
+                     0 : "Default",
+                     1 : "Auto",
+                     2 : "Manual",
+                     3 : "MultiPurpose",
+                     4 : "UpperCassette",
+                     5 : "LowerCassette",
+                     6 : "EnvelopeTray",
+                     7 : "ThirdCassette",
+                   }
+                   
+    orientations = {               
+                     0 : "Portrait",
+                     1 : "Landscape",
+                     2 : "ReversePortrait",
+                     3 : "ReverseLandscape",
+                   }
+                   
+    def __init__(self, infile, debug=0) :
+        """Initialize PCLXL Analyzer."""
+        self.debug = debug
+        self.infile = infile
+        self.endianness = None
+        self.iscolor = None
+        found = 0
+        while not found :
+            line = self.infile.readline()
+            if not line :
+                break
+            if line[1:12] == " HP-PCL XL;" :
+                found = 1
+                endian = ord(line[0])
+                if endian == 0x29 :
+                    self.littleEndian()
+                elif endian == 0x28 :    
+                    self.bigEndian()
+                # elif endian == 0x27 : # TODO : This is the ESC code : parse it for PJL statements !
+                # 
+                else :    
+                    raise PDLAnalyzerError, "Unknown endianness marker 0x%02x at start !" % endian
+        if not found :
+            raise PDLAnalyzerError, "This file doesn't seem to be PCLXL (aka PCL6)"
+            
+        # Initialize table of tags
+        self.tags = [ 0 ] * 256    
+        
+        # GhostScript's sources tell us that HP printers
+        # only accept little endianness, but we can handle both.
+        self.tags[0x28] = self.bigEndian    # BigEndian
+        self.tags[0x29] = self.littleEndian # LittleEndian
+        
+        self.tags[0x43] = self.beginPage    # BeginPage
+        self.tags[0x44] = self.endPage      # EndPage
+        
+        self.tags[0x6a] = self.setColorSpace    # to detect color/b&w mode
+        
+        self.tags[0xc0] = 1 # ubyte
+        self.tags[0xc1] = 2 # uint16
+        self.tags[0xc2] = 4 # uint32
+        self.tags[0xc3] = 2 # sint16
+        self.tags[0xc4] = 4 # sint32
+        self.tags[0xc5] = 4 # real32
+        
+        self.tags[0xc8] = self.array_8  # ubyte_array
+        self.tags[0xc9] = self.array_16 # uint16_array
+        self.tags[0xca] = self.array_32 # uint32_array
+        self.tags[0xcb] = self.array_16 # sint16_array
+        self.tags[0xcc] = self.array_32 # sint32_array
+        self.tags[0xcd] = self.array_32 # real32_array
+        
+        self.tags[0xd0] = 2 # ubyte_xy
+        self.tags[0xd1] = 4 # uint16_xy
+        self.tags[0xd2] = 8 # uint32_xy
+        self.tags[0xd3] = 4 # sint16_xy
+        self.tags[0xd4] = 8 # sint32_xy
+        self.tags[0xd5] = 8 # real32_xy
+        
+        self.tags[0xe0] = 4  # ubyte_box
+        self.tags[0xe1] = 8  # uint16_box
+        self.tags[0xe2] = 16 # uint32_box
+        self.tags[0xe3] = 8  # sint16_box
+        self.tags[0xe4] = 16 # sint32_box
+        self.tags[0xe5] = 16 # real32_box
+        
+        self.tags[0xf8] = 1 # attr_ubyte
+        self.tags[0xf9] = 2 # attr_uint16
+        
+        self.tags[0xfa] = self.embeddedData      # dataLength
+        self.tags[0xfb] = self.embeddedDataSmall # dataLengthByte
+            
+        # color spaces    
+        self.BWColorSpace = "".join([chr(0x00), chr(0xf8), chr(0x03)])
+        self.GrayColorSpace = "".join([chr(0x01), chr(0xf8), chr(0x03)])
+        self.RGBColorSpace = "".join([chr(0x02), chr(0xf8), chr(0x03)])
+        
+        # set number of copies
+        self.setNumberOfCopies = "".join([chr(0xf8), chr(0x31)]) 
+            
+    def beginPage(self) :
+        """Indicates the beginning of a new page, and extracts media information."""
+        self.pagecount += 1
+        
+        # Default values
+        mediatypelabel = "Plain"
+        mediasourcelabel = "Main"
+        mediasizelabel = "Default"
+        orientationlabel = "Portrait"
+        
+        # Now go upstream to decode media type, size, source, and orientation
+        # this saves time because we don't need a complete parser !
+        minfile = self.minfile
+        pos = self.pos - 2
+        while pos > 0 : # safety check : don't go back to far !
+            val = ord(minfile[pos])
+            if val in (0x44, 0x48, 0x41) : # if previous endPage or openDataSource or beginSession (first page)
+                break
+            if val == 0x26 :    
+                mediasource = ord(minfile[pos - 2])
+                mediasourcelabel = self.mediasources.get(mediasource, str(mediasource))
+                pos = pos - 4
+            elif val == 0x25 :
+                mediasize = ord(minfile[pos - 2])
+                mediasizelabel = self.mediasizes.get(mediasize, str(mediasize))
+                pos = pos - 4
+            elif val == 0x28 :    
+                orientation = ord(minfile[pos - 2])
+                orienationlabel = self.orientations.get(orientation, str(orientation))
+                pos = pos - 4
+            elif val == 0x27 :    
+                savepos = pos
+                pos = pos - 1
+                while pos > 0 : # safety check : don't go back to far !
+                    val = ord(minfile[pos])
+                    pos -= 1    
+                    if val == 0xc8 :
+                        break
+                mediatypelabel = minfile[pos:savepos] # TODO : INCORRECT, WE HAVE TO STRIP OUT THE UBYTE ARRAY'S LENGTH !!!
+            # else : TODO : CUSTOM MEDIA SIZE AND UNIT ! 
+            else :    
+                pos = pos - 2   # ignored
+        self.pages[self.pagecount] = { "copies" : 1, 
+                                       "orientation" : orientationlabel, 
+                                       "mediatype" : mediatypelabel, 
+                                       "mediasize" : mediasizelabel,
+                                       "mediasource" : mediasourcelabel,
+                                     } 
+        return 0
+        
+    def endPage(self) :    
+        """Indicates the end of a page."""
+        pos = self.pos
+        pos3 = pos - 3
+        minfile = self.minfile
+        if minfile[pos3:pos-1] == self.setNumberOfCopies :
+            # The EndPage operator may be preceded by a PageCopies attribute
+            # So set number of copies for current page.
+            # From what I read in PCLXL documentation, the number
+            # of copies is an unsigned 16 bits integer
+            self.pages[self.pagecount]["copies"] = unpack(self.endianness + "H", minfile[pos-5:pos3])[0]
+        return 0
+        
+    def setColorSpace(self) :    
+        """Changes the color space."""
+        if self.minfile[self.pos-4:self.pos-1] == self.RGBColorSpace :
+            self.iscolor = 1
+        return 0
+            
+    def array_8(self) :    
+        """Handles byte arrays."""
+        pos = self.pos
+        datatype = self.minfile[pos]
+        pos += 1
+        length = self.tags[ord(datatype)]
+        if callable(length) :
+            self.pos = pos
+            length = length()
+            pos = self.pos
+        posl = pos + length
+        self.pos = posl
+        if length == 1 :    
+            return unpack("B", self.minfile[pos:posl])[0]
+        elif length == 2 :    
+            return unpack(self.endianness + "H", self.minfile[pos:posl])[0]
+        elif length == 4 :    
+            return unpack(self.endianness + "I", self.minfile[pos:posl])[0]
+        else :    
+            raise PDLAnalyzerError, "Error on array size at %s" % self.pos
+        
+    def array_16(self) :    
+        """Handles byte arrays."""
+        pos = self.pos
+        datatype = self.minfile[pos]
+        pos += 1
+        length = self.tags[ord(datatype)]
+        if callable(length) :
+            self.pos = pos
+            length = length()
+            pos = self.pos
+        posl = pos + length
+        self.pos = posl
+        if length == 1 :    
+            return 2 * unpack("B", self.minfile[pos:posl])[0]
+        elif length == 2 :    
+            return 2 * unpack(self.endianness + "H", self.minfile[pos:posl])[0]
+        elif length == 4 :    
+            return 2 * unpack(self.endianness + "I", self.minfile[pos:posl])[0]
+        else :    
+            raise PDLAnalyzerError, "Error on array size at %s" % self.pos
+        
+    def array_32(self) :    
+        """Handles byte arrays."""
+        pos = self.pos
+        datatype = self.minfile[pos]
+        pos += 1
+        length = self.tags[ord(datatype)]
+        if callable(length) :
+            self.pos = pos
+            length = length()
+            pos = self.pos
+        posl = pos + length
+        self.pos = posl
+        if length == 1 :    
+            return 4 * unpack("B", self.minfile[pos:posl])[0]
+        elif length == 2 :    
+            return 4 * unpack(self.endianness + "H", self.minfile[pos:posl])[0]
+        elif length == 4 :    
+            return 4 * unpack(self.endianness + "I", self.minfile[pos:posl])[0]
+        else :    
+            raise PDLAnalyzerError, "Error on array size at %s" % self.pos
+        
+    def embeddedDataSmall(self) :
+        """Handle small amounts of data."""
+        pos = self.pos
+        length = ord(self.minfile[pos])
+        self.pos = pos + 1
+        return length
+        
+    def embeddedData(self) :
+        """Handle normal amounts of data."""
+        pos = self.pos
+        pos4 = pos + 4
+        self.pos = pos4
+        return unpack(self.endianness + "I", self.minfile[pos:pos4])[0]
+        
+    def littleEndian(self) :        
+        """Toggles to little endianness."""
+        self.endianness = "<" # little endian
+        return 0
+        
+    def bigEndian(self) :    
+        """Toggles to big endianness."""
+        self.endianness = ">" # big endian
+        return 0
+    
+    def getJobSize(self) :
+        """Counts pages in a PCLXL (PCL6) document.
+        
+           Algorithm by Jerome Alet.
+           
+           The documentation used for this was :
+         
+           HP PCL XL Feature Reference
+           Protocol Class 2.0
+           http://www.hpdevelopersolutions.com/downloads/64/358/xl_ref20r22.pdf 
+        """
+        infileno = self.infile.fileno()
+        self.pages = {}
+        self.minfile = minfile = mmap.mmap(infileno, os.fstat(infileno)[6], prot=mmap.PROT_READ, flags=mmap.MAP_SHARED)
+        tags = self.tags
+        self.pagecount = 0
+        self.pos = pos = self.infile.tell()
+        try :
+            while 1 :
+                char = minfile[pos]
+                pos += 1
+                length = tags[ord(char)]
+                if not length :
+                    continue
+                if callable(length) :    
+                    self.pos = pos
+                    length = length()
+                    pos = self.pos
+                pos += length    
+        except IndexError : # EOF ?
+            self.minfile.close() # reached EOF
+            
+        # now handle number of copies for each page (may differ).
+        if self.iscolor :
+            colormode = "Color"
+        else :    
+            colormode = "Black"
+        for pnum in range(1, self.pagecount + 1) :
+            # if no number of copies defined, take 1, as explained
+            # in PCLXL documentation.
+            # NB : is number of copies is 0, the page won't be output
+            # but the formula below is still correct : we want 
+            # to decrease the total number of pages in this case.
+            page = self.pages.get(pnum, 1)
+            copies = page["copies"]
+            self.pagecount += (copies - 1)
+            if self.debug :
+                sys.stderr.write("%s*%s*%s*%s*%s*%s\n" % (copies, 
+                                                          page["mediatype"], 
+                                                          page["mediasize"], 
+                                                          page["orientation"], 
+                                                          page["mediasource"], 
+                                                          colormode))
+        return self.pagecount
+        
+class PDLAnalyzer :    
+    """Generic PDL Analyzer class."""
+    def __init__(self, filename, debug=0) :
+        """Initializes the PDL analyzer.
+        
+           filename is the name of the file or '-' for stdin.
+           filename can also be a file-like object which 
+           supports read() and seek().
+        """
+        self.debug = debug
+        self.filename = filename
+        try :
+            import psyco 
+        except ImportError :    
+            pass # Psyco is not installed
+        else :    
+            # Psyco is installed, tell it to compile
+            # the CPU intensive methods : PCL and PCLXL
+            # parsing will greatly benefit from this, 
+            # for PostScript and PDF the difference is
+            # barely noticeable since they are already
+            # almost optimal, and much more speedy anyway.
+            psyco.bind(PostScriptAnalyzer.getJobSize)
+            psyco.bind(PDFAnalyzer.getJobSize)
+            psyco.bind(ESCP2Analyzer.getJobSize)
+            psyco.bind(PCLAnalyzer.getJobSize)
+            psyco.bind(PCLXLAnalyzer.getJobSize)
+        
+    def getJobSize(self) :    
+        """Returns the job's size."""
+        self.openFile()
+        try :
+            pdlhandler = self.detectPDLHandler()
+        except PDLAnalyzerError, msg :    
+            self.closeFile()
+            raise PDLAnalyzerError, "ERROR : Unknown file format for %s (%s)" % (self.filename, msg)
+        else :
+            try :
+                size = pdlhandler(self.infile, self.debug).getJobSize()
+            finally :    
+                self.closeFile()
+            return size
+        
+    def openFile(self) :    
+        """Opens the job's data stream for reading."""
+        self.mustclose = 0  # by default we don't want to close the file when finished
+        if hasattr(self.filename, "read") and hasattr(self.filename, "seek") :
+            # filename is in fact a file-like object 
+            infile = self.filename
+        elif self.filename == "-" :
+            # we must read from stdin
+            infile = sys.stdin
+        else :    
+            # normal file
+            self.infile = open(self.filename, "rb")
+            self.mustclose = 1
+            return
+            
+        # Use a temporary file, always seekable contrary to standard input.
+        self.infile = tempfile.TemporaryFile(mode="w+b")
+        while 1 :
+            data = infile.read(MEGABYTE) 
+            if not data :
+                break
+            self.infile.write(data)
+        self.infile.flush()    
+        self.infile.seek(0)
+            
+    def closeFile(self) :        
+        """Closes the job's data stream if we can close it."""
+        if self.mustclose :
+            self.infile.close()    
+        else :    
+            # if we don't have to close the file, then
+            # ensure the file pointer is reset to the 
+            # start of the file in case the process wants
+            # to read the file again.
+            try :
+                self.infile.seek(0)
+            except :    
+                pass    # probably stdin, which is not seekable
+        
+    def isPostScript(self, sdata, edata) :    
+        """Returns 1 if data is PostScript, else 0."""
+        if sdata.startswith("%!") or \
+           sdata.startswith("\004%!") or \
+           sdata.startswith("\033%-12345X%!PS") or \
+           ((sdata[:128].find("\033%-12345X") != -1) and \
+             ((sdata.find("LANGUAGE=POSTSCRIPT") != -1) or \
+              (sdata.find("LANGUAGE = POSTSCRIPT") != -1) or \
+              (sdata.find("LANGUAGE = Postscript") != -1))) or \
+              (sdata.find("%!PS-Adobe") != -1) :
+            if self.debug :  
+                sys.stderr.write("%s is a PostScript file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+        
+    def isPDF(self, sdata, edata) :    
+        """Returns 1 if data is PDF, else 0."""
+        if sdata.startswith("%PDF-") or \
+           sdata.startswith("\033%-12345X%PDF-") or \
+           ((sdata[:128].find("\033%-12345X") != -1) and (sdata.upper().find("LANGUAGE=PDF") != -1)) or \
+           (sdata.find("%PDF-") != -1) :
+            if self.debug :  
+                sys.stderr.write("%s is a PDF file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+        
+    def isPCL(self, sdata, edata) :    
+        """Returns 1 if data is PCL, else 0."""
+        if sdata.startswith("\033E\033") or \
+           (sdata.startswith("\033*rbC") and (not edata[-3:] == "\f\033@")) or \
+           sdata.startswith("\033%8\033") or \
+           (sdata.find("\033%-12345X") != -1) :
+            if self.debug :  
+                sys.stderr.write("%s is a PCL3/4/5 file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+        
+    def isPCLXL(self, sdata, edata) :    
+        """Returns 1 if data is PCLXL aka PCL6, else 0."""
+        if ((sdata[:128].find("\033%-12345X") != -1) and \
+             (sdata.find(" HP-PCL XL;") != -1) and \
+             ((sdata.find("LANGUAGE=PCLXL") != -1) or \
+              (sdata.find("LANGUAGE = PCLXL") != -1))) :
+            if self.debug :  
+                sys.stderr.write("%s is a PCLXL (aka PCL6) file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+            
+    def isESCP2(self, sdata, edata) :        
+        """Returns 1 if data is ESC/P2, else 0."""
+        if sdata.startswith("\033@") or \
+           sdata.startswith("\033*") or \
+           sdata.startswith("\n\033@") or \
+           sdata.startswith("\0\0\0\033\1@EJL") : # ESC/P Raster ??? Seen on Stylus Photo 1284
+            if self.debug :  
+                sys.stderr.write("%s is an ESC/P2 file\n" % str(self.filename))
+            return 1
+        else :    
+            return 0
+    
+    def detectPDLHandler(self) :    
+        """Tries to autodetect the document format.
+        
+           Returns the correct PDL handler class or None if format is unknown
+        """   
+        # Try to detect file type by reading first block of datas    
+        self.infile.seek(0)
+        firstblock = self.infile.read(4 * KILOBYTE)
+        try :
+            self.infile.seek(-LASTBLOCKSIZE, 2)
+            lastblock = self.infile.read(LASTBLOCKSIZE)
+        except IOError :    
+            lastblock = ""
+            
+        self.infile.seek(0)
+        if self.isPostScript(firstblock, lastblock) :
+            return PostScriptAnalyzer
+        elif self.isPCLXL(firstblock, lastblock) :    
+            return PCLXLAnalyzer
+        elif self.isPDF(firstblock, lastblock) :    
+            return PDFAnalyzer
+        elif self.isPCL(firstblock, lastblock) :    
+            return PCLAnalyzer
+        elif self.isESCP2(firstblock, lastblock) :    
+            return ESCP2Analyzer
+        else :    
+            raise PDLAnalyzerError, "Analysis of first data block failed."
+            
+def main() :    
+    """Entry point for PDL Analyzer."""
+    if (len(sys.argv) < 2) or ((not sys.stdin.isatty()) and ("-" not in sys.argv[1:])) :
+        sys.argv.append("-")
+        
+    totalsize = 0    
+    debug = 0
+    minindex = 1
+    if sys.argv[1] == "--debug" :
+        minindex = 2
+        debug = 1
+    for arg in sys.argv[minindex:] :
+        try :
+            parser = PDLAnalyzer(arg, debug)
+            totalsize += parser.getJobSize()
+        except PDLAnalyzerError, msg :    
+            sys.stderr.write("ERROR: %s\n" % msg)
+            sys.stderr.flush()
+    print "%s" % totalsize
+    
+if __name__ == "__main__" :    
+    main()
Index: pykota/tags/1.22/pykota/version.py
===================================================================
--- pykota/tags/1.22/pykota/version.py (revision 2237)
+++ pykota/tags/1.22/pykota/version.py (revision 2237)
@@ -0,0 +1,29 @@
+# PyKota
+# -*- coding: ISO-8859-15 -*-
+#
+# PyKota : Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+
+__version__ = "1.22_unofficial"
+
+__doc__ = """PyKota : a complete Printing Quota Solution for CUPS and LPRng."""
+
+__author__ = """Jerome Alet - alet@librelogiciel.com"""
+
Index: pykota/tags/1.22/FAQ
===================================================================
--- pykota/tags/1.22/FAQ (revision 2146)
+++ pykota/tags/1.22/FAQ (revision 2146)
@@ -0,0 +1,252 @@
+PyKota's FAQ :
+
+  # $Id$
+  
+  * How can I diagnose the problem when something goes wrong ?
+  
+    Put "LogLevel debug2" in cupsd.conf (usually in /etc/cups/).
+    Then put "logger: stderr", "debug: yes" and 
+    "crashrecipient: youremailaddress" in /etc/pykota/pykota.conf.
+    Finally restart CUPS.
+    CUPS' error_log file will now contain many informations which
+    will help diagnose your problem. You will receive failure
+    notices by email, and you can send all this to us for
+    diagnostic. Please send complete files and not some sparse
+    parts of them. Also please send the log files as gzipped 
+    (or bzip2-ed) attachments.
+    
+    For LPRng, better to put "logger: system" in pykota.conf so
+    that all debug messages for PyKota will go to syslog's
+    destination for the LPR syslog facility.
+    
+    IMPORTANT : please don't send log files to the mailing list
+    unless they are very small of unless someone asked for this.
+  
+  * Some commands tell me I'm not allowed to use them, why ?
+  
+    Some commands refuse to work when launched as a normal user,
+    and output a message saying "You're not allowed to use this
+    command." This is because their use is reserved to PyKota
+    Administrators. A PyKota Administrator is any user allowed
+    to read the pykotadmin.conf file. Beware : any user who can
+    read this file can connect to PyKota's database in read+write
+    mode, so take care of not opening a breach when modifying
+    the permissions on this file.
+    
+  * What permissions should I use on PyKota's configuration files ?   
+  
+    It's probably best to do this :
+    
+        $ chown pykota.pykota pykota.conf pykotadmin.conf
+        $ chmod 640 pykota.conf
+        $ chmod 600 pykotadmin.conf
+        
+    Then the user 'pykota' will be the only PyKota Administrator    
+    (with user 'root' of course), but all members of the 'pykota'
+    group will be allowed to use unrestricted PyKota commands
+    like repykota.
+    
+  * How can I limit my users to N pages per day (month/year) ?
+  
+    The easiest way to do this is to create their print quota
+    entries using something like :
+        
+      $ edpykota --add -S 30 -H 30 user1 user2 user3 ...
+        
+      this would limit users to 30 pages on each printer.
+        
+    Then in a crontab launched every day (month/year) you could    
+    do :
+    
+      00 23 * * * /usr/bin/edpykota --reset 
+        
+      this would reset every user's page counter to 0 on each printer
+      at 23h00 every day. 
+  
+  * How can I tell PyKota to allow some users to print without limitation ?
+   
+    Just create these users' print quota entries this way :
+    
+      $ edpykota --add --limitby quota --noquota user1 user2 ...
+  
+      This would effectively put these users in "no limit" mode on
+      each printer. If you want to do this only on some printers, just
+      use the --printer command line argument as well. See
+      edpykota's documentation for details.
+      
+    Another way to do this when you limit your users by balance, is  
+    to set an overcharging factor of zero for every user you want to
+    print with no limitation :
+    
+      $ edpykota --add --limitby balance --overcharge 0 user1 user2 ...
+  
+  * Nothing prints when my printer is in PowerSave mode, what
+    can I do ?
+    
+    This happens if you use hardware accounting with SNMP, because
+    some (all ?) printers don't say they are idle when they are
+    in PowerSave mode.
+    For now your best bet is to disable PowerSave mode in
+    your printer. In the future, PyKota will modified to
+    handle such problems.
+  
+  * I've installed all correctly, I've created users
+    and printers, but when printing nothing works. 
+    What is the problem ?
+    The most probable cause for this is that you didn't
+    adapt /etc/pykota/pykota.conf to your own configuration.
+    The file installed by default is just an example, you
+    have to modify it. See the rest of this document to
+    learn how to really diagnose what went wrong.
+    
+  * I've downloaded PyKota from Subversion using a Windows based Subversion
+    client, and now nothing works at all. What happened ?
+    
+    Some (all?) Windows based CVS or Subversion tools translate *nix line 
+    endings (character Line Feed, ASCII code 10) into Windows line endings
+    (character Carriage Return, ASCII code 13, followed with 
+    character Line Feed). This breaks the software which has
+    to run under *nix compatible systems. Set correct options
+    in your Subversion software so that it doesn't do any translation,
+    or use an Unix-like version of Subversion, download again and
+    reinstall the software. It should work.
+    
+  * Why doesn't CUPS under Debian Woody automatically
+    detects PyKota managed devices ?
+    
+    The CUPS version in Debian Woody is 1.1.14 which is a bit
+    too old. To use PyKota with this version, just install
+    your printers as usual in CUPS web interface, and ensure
+    they work fine, then save your changes, and modify
+    /etc/cups/printers.conf manually as explained in
+    PyKota's toplevel README file. Finally restart CUPS,
+    and your printers should be managed by PyKota.
+    Another solution is to install a newer CUPS release.
+    
+  * Is print accounting ever exact ?
+  
+    No. Print accounting is **never** exact, because it depends
+    on external factors like the presence of paper in the printer,
+    the quantity of remaining ink in the print cartridge, paper
+    jams, etc... All these things are very difficult to account
+    for correctly, and no print accounting package deals with
+    these artefacts correctly in all situations.
+    We are however confident that PyKota is one of the more
+    exact print accounting software, because by default it
+    asks the printers for how many pages they have really printed.
+    
+  * Can PyKota account for ink usage ?  
+  
+    No. Actually PyKota doesn't account for ink usage, but this
+    may come in a future release. PyKota only accounts for pages
+    printed and/or money spent.  If ink accounting is a necessity
+    for you, PrintBill is recommended instead of PyKota. PrintBill
+    allows you to bill differently per color, and to bill depending
+    on the percent of the ink covered part of the pages.
+    
+  * What is a 'dumb printer' ?
+  
+    In PyKota, the term 'dumb printer' defines a printer which doesn't 
+    natively understand PostScript, PCL5 (up to), PCLXL (aka PCL6), PDF 
+    or ESC/P2 and doesn't have an internal page counter, and for which 
+    you don't know how to compute a job's size in number of pages by 
+    analyzing its content. 
+    Any printer which is not a 'dumb printer' according to the above 
+    definition is supported by PyKota. 
+
+  * How can I make PyKota work with my non-postscript printer under 
+    CUPS ?  
+  
+    From version 1.16alpha7, PyKota includes a CUPS backend which
+    allows you to use any type of printer and any driver, provided
+    your printer is not a 'dumb printer' (see above).
+    
+  * How can I use my 'dumb printer' with CUPS and PyKota.  
+  
+    You have to use a software accounter directive, and 
+    create a script which understands your printer's
+    Page Description Language.
+    
+    PyKota natively understands DSC compliant PostScript, 
+    PCL3, PCL4, PCL5, PCLXL (aka PCL6), PDF and ESC/P2. Support 
+    for Binary PostScript is done through GhostScript. More PDLs
+    will be added in the future.  
+    However you can always plug your own PDL analyzer in PyKota.
+          
+  * I've got a great number of users. How can I automatically
+    set an initial print quota for them on first print ?
+    
+    You have to define an external policy for unknown users,
+    to automatically add them to the Print Quota database.
+    The sample configuration file contains examples to do this.
+    
+  * What does the --prototype command line option to edpykota do ?
+  
+    This option allows you to use an existing user or group
+    as a template when creating or modifying other accounts.
+    
+  * How can I share print quota between some printers only (not all) ?   
+  
+    To do this you have to put the printers into a printers group, and
+    set quota on the printer group, instead of (or in addition to)
+    the printers themselves.
+    
+  * What is a printer group ?
+  
+     A printer group is exactly like a normal printer, but is
+     unknown by the printing system. You can use printer groups
+     to share print quota between printers.
+    
+  * How can I create a printer group ?   
+  
+    Just use pkprinters, like for normal printers, then create
+    quota entries for users or users groups on it using the
+    edpykota command
+ 
+  * How can I put a printer into a printer group ?
+  
+    Use the pkprinters command to do this.
+    
+      $ pkprinters --help
+      
+    Will print the complete help and tell you how to do.
+    
+  * How quota checking and update is done with printer groups ?   
+  
+    Print accounting and quota checking is done for a printer and
+    all the printers groups it belongs to, recursively.
+    If quota is reached on ANY of these printers for the current user,
+    printing is denied.
+    
+  * Is this feature robust ?
+  
+    It should be. However, beware of integrity problems. LDAP has no 
+    sense of database integrity, and PostgreSQL constraints have not 
+    yet been fully implemented. The code actually *tries* to forbid 
+    circular printers groups, but if you create printer groups with
+    another tool (e.g. psql or gq), then you are mostly on you 
+    own to not create infinite loops.
+    
+  * How is computed the job's price ?  
+  
+    A job's price is computed with this formula :
+    
+      SUM((NbPages * PricePerPage) + PricePerJob)
+      
+    For current printer and all the printers groups it is 
+    a member of, if any, recursively.
+    This may be difficult to grasp, but offers unprecedented
+    flexibility.
+
+  * My question isn't answered there, can you help ?  
+  
+    Sure. Ask your question to the mailing list. If this is a
+    frequently asked question, or if your problem is on the contrary
+    very specific, it will probably be added to this document.
+    
+    You can also ask questions by IRC :
+    
+        /server irc.freenode.net
+        /join #pykota
+        
+Send any new questions to Jerome Alet - <alet@librelogiciel.com>
Index: pykota/tags/1.22/SECURITY
===================================================================
--- pykota/tags/1.22/SECURITY (revision 2146)
+++ pykota/tags/1.22/SECURITY (revision 2146)
@@ -0,0 +1,203 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+How to improve PyKota's security :
+----------------------------------
+
+  - Secure your printers :  
+  
+    This is the most important thing to do !
+    
+    Tell them to refuse any print job not coming from your print server. 
+    Do this with telnet to set ACLs based on incoming IP addresses if 
+    possible, or through any other way. 
+        
+    Put all your printers on a private unroutable subnet, different from 
+    the subnet on which your client hosts will reside. Ensure that the 
+    only machine allowed to access to this subnet is your print server. 
+    
+    
+  - Secure your print servers :  
+  
+    Don't give shell access to your users on your print servers, and 
+    don't let them execute unauthorized commands : they could very well 
+    compile and/or execute tools like NetCat, and send datas directly to 
+    the printer in the case the printer is networked, thus bypassing the 
+    printing system and PyKota. 
+        
+    Ensure that no regular user can read PyKota administrator's 
+    configuration file, but that both the PyKota Administrator and the 
+    user the printing system is run as can read it. With CUPS under 
+    Debian you may want to do : 
+    
+        $ chown pykota.pykota pykota.conf pykotadmin.conf    
+        $ chmod 640 pykota.conf
+        $ chmod 600 pykotadmin.conf
+        
+    Depending on your needs, you may want to put the user the printing 
+    system is run as in the group 'pykota', and relax permissions a bit 
+    so that this user can read the pykotadmin.conf file while printing. 
+    For example : 
+    
+        $ chmod 640 pykotadmin.conf
+        $ adduser lp pykota
+          (this makes user 'lp' a member of group 'pykota')
+    
+    Letting any user read PyKota administrator's configuration file may 
+    expose passwords or database information which would allow write 
+    access to the database, and so may transform your print quota 
+    management in a nightmare. 
+  
+    If you want to let users generate their own print quota reports, 
+    then ensure that /etc/pykota/pykota.conf is readable by these users. 
+    To do this you can either put this users in the group 'pykota' while 
+    ensuring they can't read pykotadmin.conf with 'chmod 600 pykotadmin.conf'
+    or simply allow everyone to read pykota.conf with 'chmod 644 pykota.conf'
+    
+      
+  - Secure your database connections :
+  
+    Depending on the database backend used, either PostgreSQL or LDAP, 
+    you may have to take additionnal measures to render your database 
+    more secure. Please refer to your database system's documentation 
+    to learn how to do so. This is out of the scope of the present 
+    document which will only give basic informations. 
+    
+    Keep in mind that if you use a centralized database, the first thing
+    you may want to do is to restrict which hosts can access to it, i.e.
+    only the print servers.
+  
+    PostgreSQL :
+    
+      For the PostgreSQL backend, PyKota already defines a user with 
+      read/write access and another user with read-only access to the 
+      Print Quota Database. PyKota doesn't set any passwords for these 
+      users though, but doing so is recommended, and here's how to do :
+      
+      From the root shell do :
+      
+      $ su - postgres
+      $ psql template1
+      template1=# ALTER USER pykotauser WITH PASSWORD 'a.difficult.password';
+      template1=# ALTER USER pykotaadmin WITH PASSWORD 'another.password';
+      template1=# \q
+      $ exit
+      
+      Now modify PostgreSQL's pg_hba.conf to restrict access to the PyKota
+      database to PostgreSQL users 'pykotauser' and 'pykotaadmin' only, 
+      and only if they connect from localhost and provide the correct 
+      password. Here's an excerpt from our own pg_hba.conf :
+        
+        --- CUT ---        
+        local all    postgres                              ident sameuser
+        local all    all                                   reject
+        host  pykota pykotauser  127.0.0.1 255.255.255.255 crypt
+        host  pykota pykotaadmin 127.0.0.1 255.255.255.255 crypt
+        host  pykota all         127.0.0.1 255.255.255.255 reject
+        --- CUT ---        
+
+      Finally restart PostgreSQL so that the changes will be applied :
+      
+        $ /etc/init.d/postgresql restart
+        
+      Of course, depending on your needs, you may want to secure
+      your database connections in a completely different way or 
+      add other security layers on top of this. To do so please
+      refer to PostgreSQL's documentation because this is out of
+      the scope of the present document.
+      
+    LDAP :
+    
+      For the LDAP backend, you have to ensure that no regular user can 
+      write to any PyKota specific attribute or objectClass. Otherwise 
+      they could modify their quota at will. Here too you will have to 
+      create two LDAP users which will be used for readonly and read+write
+      access to PyKota's datas. PyKota currently doesn't do this, so
+      you have to create an LDIF file this way (please adapt the
+      DNs to your own environment) :
+      
+        --- CUT ---      
+        dn: cn=pykotauser,dc=example,dc=com
+        cn: pykotauser
+        objectClass: simpleSecurityObject
+        objectClass: organizationalRole
+        description: PyKota ReadOnly User
+        userPassword: {CRYPT}jfdsk653dsZFL
+        
+        dn: cn=pykotaadmin,dc=example,dc=com
+        cn: pykotaadmin
+        objectClass: simpleSecurityObject
+        objectClass: organizationalRole
+        description: PyKota Read+Write User
+        userPassword: {CRYPT}kqsIu43Exoi5s
+        --- CUT ---
+
+      Then add these two users to your existing LDAP tree :
+      
+        $ ldapadd -W -x -D "cn=admin,dc=example,dc=com" -f users.ldif
+    
+      Now modify your LDAP server's configuration to respectively allow
+      read+write and readonly access to the datas :
+      
+        --- CUT ---
+        by dn="cn=pykotaadmin,dc=example,dc=com" write
+        by dn="cn=pykotauser,dc=example,dc=com" read
+        --- CUT ---
+
+      Finally restart your LDAP server so that the changes will be applied :
+      
+        $ /etc/init.d/slapd restart
+        
+      Of course, depending on your needs, you may want to secure
+      your database connections in a completely different way or 
+      add other security layers on top of this. To do so please
+      refer to your LDAP server's documentation because this is out 
+      of the scope of the present document.
+        
+        
+  - Secure your CGI scripts :    
+  
+    If you use printquota.cgi or dumpykota.cgi, ensure that the user 
+    they are run as can read the pykota.conf file but NOT the 
+    pykotadmin.conf file. 
+        
+    The particular user they will be run as depends on your web server's 
+    settings. 
+        
+    If you want to further restrict the access to these CGI scripts, 
+    please read your web server's documentation to add either 
+    encryption, authentication or both. 
+        
+    The CGI scripts will honor the content of the REMOTE_USER CGI 
+    environment variable which is set by your web server if an 
+    authentication took place. If REMOTE_USER contains 'root' then, even 
+    if you didn't authenticate using the real root account and password, 
+    the scripts will consider they have been run by a PyKota 
+    administrator and will report all datas if asked to do so. If 
+    REMOTE_USER is not present, which means that you didn't chose to 
+    secure access to your CGI scripts, the same will happen. If 
+    REMOTE_USER contains something else, only datas pertaining to this 
+    user will be made available through the web. 
+    
+    NB : In any case, the CGI scripts actually included in PyKota only
+    do readonly accesses to PyKota's database.
+    
+====================================================================
Index: pykota/tags/1.22/cgi-bin/printquota.cgi
===================================================================
--- pykota/tags/1.22/cgi-bin/printquota.cgi (revision 2229)
+++ pykota/tags/1.22/cgi-bin/printquota.cgi (revision 2229)
@@ -0,0 +1,272 @@
+#! /usr/bin/python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Reports generator
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import cgi
+import urllib
+
+from pykota import version
+from pykota.tool import PyKotaTool, PyKotaToolError
+from pykota.reporter import PyKotaReporterError, openReporter
+from pykota.cgifuncs import getLanguagePreference, getCharsetPreference
+
+header = """Content-type: text/html
+
+<?xml version="1.0" encoding="%s"?>
+<html>
+  <head>
+    <title>%s</title>
+    <link rel="stylesheet" type="text/css" href="/pykota.css" />
+  </head>
+  <body>
+    <form action="printquota.cgi" method="POST">
+      <table>
+        <tr>
+          <td>
+            <p>
+              <a href="http://www.librelogiciel.com/software/"><img src="http://www.librelogiciel.com/software/PyKota/pykota.png?version=%s" alt="PyKota's Logo" /></a>
+              <br />
+              <a href="http://www.librelogiciel.com/software/">PyKota v%s</a>
+            </p>
+          </td>
+          <td colspan="2">
+            <h1>%s</h1>
+          </td>
+        </tr>
+        <tr>
+          <td colspan="3" align="center">
+            <input type="submit" name="report" value="%s" />
+          </td>
+        </tr>
+      </table>"""
+    
+footer = """
+      <table>
+        <tr>
+          <td colspan="3" align="center">
+            <input type="submit" name="report" value="%s" />
+          </td>
+        </tr>
+      </table>  
+    </form>
+  </body>
+</html>"""  
+
+class PyKotaReportGUI(PyKotaTool) :
+    """PyKota Administrative GUI"""
+    def guiDisplay(self) :
+        """Displays the administrative interface."""
+        global header, footer
+        print header % (self.getCharset(), _("PyKota Reports"), version.__version__, version.__version__, _("PyKota Reports"), _("Report"))
+        print self.body
+        print footer % _("Report")
+        
+    def error(self, message) :
+        """Adds an error message to the GUI's body."""
+        if message :
+            self.body = '<p><font color="red">%s</font></p>\n%s' % (message, self.body)
+        
+    def htmlListPrinters(self, selected=[], mask="*") :    
+        """Displays the printers multiple selection list."""
+        printers = self.storage.getMatchingPrinters(mask)
+        selectednames = [p.Name for p in selected]
+        message = '<table><tr><td valign="top">%s :</td><td valign="top"><select name="printers" multiple="multiple">' % _("Printer")
+        for printer in printers :
+            if printer.Name in selectednames :
+                message += '<option value="%s" selected="selected">%s (%s)</option>' % (printer.Name, printer.Name, printer.Description)
+            else :
+                message += '<option value="%s">%s (%s)</option>' % (printer.Name, printer.Name, printer.Description)
+        message += '</select></td></tr></table>'
+        return message
+        
+    def htmlUGNamesInput(self, value="*") :    
+        """Input field for user/group names wildcard."""
+        return _("User / Group names mask") + (' : <input type="text" name="ugmask" size="20" value="%s" /> <em>e.g. <strong>jo*</strong></em>' % (value or "*"))
+        
+    def htmlGroupsCheckbox(self, isgroup=0) :
+        """Groups checkbox."""
+        if isgroup :
+            return _("Groups report") + ' : <input type="checkbox" checked="checked" name="isgroup" />'
+        else :    
+            return _("Groups report") + ' : <input type="checkbox" name="isgroup" />'
+            
+    def guiAction(self) :
+        """Main function"""
+        printers = ugmask = isgroup = None
+        remuser = os.environ.get("REMOTE_USER", "root")    
+        # special hack to accomodate mod_auth_ldap Apache module
+        try :
+            remuser = remuser.split("=")[1].split(",")[0]
+        except IndexError :    
+            pass
+        self.body = "<p>%s</p>\n" % _("Please click on the above button")
+        if self.form.has_key("report") :
+            if self.form.has_key("printers") :
+                printersfield = self.form["printers"]
+                if type(printersfield) != type([]) :
+                    printersfield = [ printersfield ]
+                printers = [self.storage.getPrinter(p.value) for p in printersfield]
+            else :    
+                printers = self.storage.getMatchingPrinters("*")
+            if remuser == "root" :
+                if self.form.has_key("ugmask") :     
+                    ugmask = self.form["ugmask"].value
+                else :     
+                    ugmask = "*"
+            else :        
+                if self.form.has_key("isgroup") :    
+                    user = self.storage.getUser(remuser)
+                    if user.Exists :
+                        ugmask = " ".join([ g.Name for g in self.storage.getUserGroups(user) ])
+                    else :    
+                        ugmask = remuser # result will probably be empty, we don't care
+                else :    
+                    ugmask = remuser
+            if self.form.has_key("isgroup") :    
+                isgroup = 1
+            else :    
+                isgroup = 0
+        self.body += self.htmlListPrinters(printers or [])            
+        self.body += "<br />"
+        self.body += self.htmlUGNamesInput(ugmask)
+        self.body += "<br />"
+        self.body += self.htmlGroupsCheckbox(isgroup)
+        try :
+            if not self.form.has_key("history") :
+                if printers and ugmask :
+                    self.reportingtool = openReporter(admin, "html", printers, ugmask.split(), isgroup)
+                    self.body += "%s" % self.reportingtool.generateReport()
+            else :        
+                if remuser != "root" :
+                    username = remuser
+                elif self.form.has_key("username") :    
+                    username = self.form["username"].value
+                else :    
+                    username = None
+                if username is not None :    
+                    user = self.storage.getUser(username)
+                else :    
+                    user =None
+                if self.form.has_key("printername") :
+                    printer = self.storage.getPrinter(self.form["printername"].value)
+                else :    
+                    printer = None
+                if self.form.has_key("datelimit") :    
+                    datelimit = self.form["datelimit"].value
+                else :    
+                    datelimit = None
+                if self.form.has_key("hostname") :    
+                    hostname = self.form["hostname"].value
+                else :    
+                    hostname = None
+                if self.form.has_key("billingcode") :    
+                    billingcode = self.form["billingcode"].value
+                else :    
+                    billingcode = None
+                self.report = ["<h2>%s</h2>" % _("History")]    
+                history = self.storage.retrieveHistory(user, printer, datelimit, hostname, billingcode)
+                if not history :
+                    self.report.append("<h3>%s</h3>" % _("Empty"))
+                else :
+                    self.report.append('<table class="pykotatable" border="1">')
+                    headers = [_("Date"), _("Action"), _("User"), _("Printer"), \
+                               _("Hostname"), _("JobId"), _("JobSize"), \
+                               _("JobPrice"), _("Copies"), _("JobBytes"), \
+                               _("PageCounter"), _("Title"), _("Filename"), \
+                               _("Options"), _("MD5Sum"), _("BillingCode"), \
+                               _("Pages")]
+                    self.report.append('<tr class="pykotacolsheader">%s</tr>' % "".join(["<th>%s</th>" % h for h in headers]))
+                    oddeven = 0
+                    for job in history :
+                        oddeven += 1
+                        if oddeven % 2 :
+                            oddevenclass = "odd"
+                        else :    
+                            oddevenclass = "even"
+                        if job.JobAction == "DENY" :
+                            oddevenclass = "deny"
+                        elif job.JobAction == "WARN" :    
+                            oddevenclass = "warn"
+                        username_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "username" : job.UserName}), job.UserName)
+                        printername_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "printername" : job.PrinterName}), job.PrinterName)
+                        if job.JobHostName :
+                            hostname_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "hostname" : job.JobHostName}), job.JobHostName)
+                        else :    
+                            hostname_url = None
+                        if job.JobBillingCode :
+                            billingcode_url = '<a href="%s?%s">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode({"history" : 1, "billingcode" : job.JobBillingCode}), job.JobBillingCode)
+                        else :    
+                            billingcode_url = None
+                        self.report.append('<tr class="%s">%s</tr>' % \
+                                              (oddevenclass, \
+                                               "".join(["<td>%s</td>" % (h or "&nbsp;") \
+                                                  for h in (job.JobDate[:19], \
+                                                            job.JobAction, \
+                                                            username_url, \
+                                                            printername_url, \
+                                                            hostname_url, \
+                                                            job.JobId, \
+                                                            job.JobSize, \
+                                                            job.JobPrice, \
+                                                            job.JobCopies, \
+                                                            job.JobSizeBytes, \
+                                                            job.PrinterPageCounter, \
+                                                            job.JobTitle, \
+                                                            job.JobFileName, \
+                                                            job.JobOptions, \
+                                                            job.JobMD5Sum, \
+                                                            billingcode_url, \
+                                                            job.JobPages)])))
+                    self.report.append('</table>')
+                    dico = { "history" : 1,
+                             "datelimit" : job.JobDate,
+                           }
+                    if user and user.Exists :
+                        dico.update({ "username" : user.Name })
+                    if printer and printer.Exists :
+                        dico.update({ "printername" : printer.Name })
+                    if hostname :    
+                        dico.update({ "hostname" : hostname })
+                    prevurl = "%s?%s" % (os.environ.get("SCRIPT_NAME", ""), urllib.urlencode(dico))
+                    self.report.append('<a href="%s">%s</a>' % (prevurl, _("Previous page")))
+                self.body = "\n".join(self.report)    
+        except :
+                self.body += '<p><font color="red">%s</font></p>' % self.crashed("CGI Error").replace("\n", "<br />")
+            
+if __name__ == "__main__" :
+    os.environ["LC_ALL"] = getLanguagePreference()
+    admin = PyKotaReportGUI(lang=os.environ["LC_ALL"], charset=getCharsetPreference())
+    admin.deferredInit()
+    admin.form = cgi.FieldStorage()
+    admin.guiAction()
+    admin.guiDisplay()
+    try :
+        admin.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(0)
Index: pykota/tags/1.22/cgi-bin/pykotme.cgi
===================================================================
--- pykota/tags/1.22/cgi-bin/pykotme.cgi (revision 2232)
+++ pykota/tags/1.22/cgi-bin/pykotme.cgi (revision 2232)
@@ -0,0 +1,168 @@
+#! /usr/bin/python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quotes generator
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import cgi
+import urllib
+import cStringIO
+
+from pykota import version
+from pykota.tool import PyKotaTool, PyKotaToolError
+from pykota.pdlanalyzer import PDLAnalyzer, PDLAnalyzerError
+from pykota.cgifuncs import getLanguagePreference, getCharsetPreference
+
+header = """Content-type: text/html
+
+<?xml version="1.0" encoding="%s"?>
+<html>
+  <head>
+    <title>%s</title>
+    <link rel="stylesheet" type="text/css" href="/pykota.css" />
+  </head>
+  <body>
+    <form action="pykotme.cgi" method="POST" enctype="multipart/form-data">
+      <table>
+        <tr>
+          <td>
+            <p>
+              <a href="http://www.librelogiciel.com/software/"><img src="http://www.librelogiciel.com/software/PyKota/pykota.png?version=%s" alt="PyKota's Logo" /></a>
+              <br />
+              <a href="http://www.librelogiciel.com/software/">PyKota v%s</a>
+            </p>
+          </td>
+          <td colspan="2">
+            <h1>%s</h1>
+          </td>
+        </tr>
+        <tr>
+          <td colspan="3" align="center">
+            <input type="submit" name="report" value="%s" />
+          </td>
+        </tr>
+      </table>"""
+    
+footer = """
+      <table>
+        <tr>
+          <td colspan="3" align="center">
+            <input type="submit" name="report" value="%s" />
+          </td>
+        </tr>
+      </table>  
+    </form>
+  </body>
+</html>"""  
+
+class PyKotMeGUI(PyKotaTool) :
+    """PyKota Quote's Generator GUI"""
+    def guiDisplay(self) :
+        """Displays the administrative interface."""
+        global header, footer
+        print header % (self.getCharset(), _("PyKota Reports"), version.__version__, version.__version__, _("PyKota Quotes"), _("Quote"))
+        print self.body
+        print footer % _("Quote")
+        
+    def error(self, message) :
+        """Adds an error message to the GUI's body."""
+        if message :
+            self.body = '<p><font color="red">%s</font></p>\n%s' % (message, self.body)
+        
+    def htmlListPrinters(self, selected=[], mask="*") :    
+        """Displays the printers multiple selection list."""
+        printers = self.storage.getMatchingPrinters(mask)
+        selectednames = [p.Name for p in selected]
+        message = '<table><tr><td valign="top">%s :</td><td valign="top"><select name="printers" multiple="multiple">' % _("Printer")
+        for printer in printers :
+            if printer.Name in selectednames :
+                message += '<option value="%s" selected="selected">%s (%s)</option>' % (printer.Name, printer.Name, printer.Description)
+            else :
+                message += '<option value="%s">%s (%s)</option>' % (printer.Name, printer.Name, printer.Description)
+        message += '</select></td></tr></table>'
+        return message
+        
+    def guiAction(self) :
+        """Main function"""
+        printers = inputfile = None
+        self.body = "<p>%s</p>\n" % _("Please click on the above button")
+        if self.form.has_key("report") :
+            if self.form.has_key("printers") :
+                printersfield = self.form["printers"]
+                if type(printersfield) != type([]) :
+                    printersfield = [ printersfield ]
+                printers = [self.storage.getPrinter(p.value) for p in printersfield]
+            else :    
+                printers = self.storage.getMatchingPrinters("*")
+            if self.form.has_key("inputfile") :    
+                inputfile = self.form["inputfile"].value
+                
+        self.body += self.htmlListPrinters(printers or [])            
+        self.body += "<br />"
+        self.body += _("Filename") + " : "
+        self.body += '<input type="file" size="64" name="inputfile" />'
+        self.body += "<br />"
+        if inputfile :
+            try :
+                parser = PDLAnalyzer(cStringIO.StringIO(inputfile))
+                jobsize = parser.getJobSize()
+            except PDLAnalyzerError, msg :    
+                self.body += '<p><font color="red">%s</font></p>' % msg
+            else :    
+                self.body += "<p>%s</p>" % (_("Job size : %i pages") % jobsize)
+                
+            remuser = os.environ.get("REMOTE_USER", "root")    
+            # special hack to accomodate mod_auth_ldap Apache module
+            try :
+                remuser = remuser.split("=")[1].split(",")[0]
+            except IndexError :    
+                pass
+            if remuser == "root" :    
+                self.body += "<p>%s</p>" % _("The exact cost of a print job can only be determined for a particular user. Please retry while logged-in.")
+            else :    
+                try :    
+                    user = self.storage.getUser(remuser)
+                    if user.Exists :
+                        for printer in printers :
+                            upquota = self.storage.getUserPQuota(user, printer)
+                            if upquota.Exists :
+                                cost = upquota.computeJobPrice(jobsize)
+                                self.body += "<p>%s</p>" % (_("Cost on printer %s : %.2f") % (printer.Name, cost))
+                except :
+                    self.body += '<p><font color="red">%s</font></p>' % self.crashed("CGI Error").replace("\n", "<br />")
+            
+if __name__ == "__main__" :
+    os.environ["LC_ALL"] = getLanguagePreference()
+    admin = PyKotMeGUI(lang=os.environ["LC_ALL"], charset=getCharsetPreference())
+    admin.deferredInit()
+    admin.form = cgi.FieldStorage()
+    admin.guiAction()
+    admin.guiDisplay()
+    try :
+        admin.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(0)
Index: pykota/tags/1.22/cgi-bin/README
===================================================================
--- pykota/tags/1.22/cgi-bin/README (revision 2232)
+++ pykota/tags/1.22/cgi-bin/README (revision 2232)
@@ -0,0 +1,52 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains CGI scripts which you may find useful to
+put on a web server along with PyKota command line tools.
+
+Be sure to restrict access to these CGI scripts as necessary.
+
+If you protect access to printquota.cgi or dumpykota.cgi with 
+username+password authentication, the REMOTE_USER CGI environment variable
+is honored, so an user can only see his own datas, but not
+other users' datas. However, the special REMOTE_USER value 'root'
+is allowed an unrestricted access.
+
+If no username+password authentication takes place, then access
+is completely unrestricted.
+
+If you don't protect access to pykotme.cgi with username+password
+authentication, then only the job's size will be displayed
+to you. This is due to the cost of a print job on a particular printer
+depending on the user because of the overcharging factor's value. 
+So if you want pykotme.cgi to produce complete web quotes, you must 
+ensure that the user logs in from his web browser whenever he uses 
+this CGI script.
+
+You must ensure that the user your web server runs as can read
+PyKota's pykota.conf configuration file. No read access to
+PyKota's pykotadmin.conf configuration file is necessary though.
+
+The web server doesn't need to be a print server nor a PyKota 
+Storage Backend server, but it must contain a correctly configured 
+PyKota installation. 
+
+====================================================================
Index: pykota/tags/1.22/cgi-bin/dumpykota.cgi
===================================================================
--- pykota/tags/1.22/cgi-bin/dumpykota.cgi (revision 2229)
+++ pykota/tags/1.22/cgi-bin/dumpykota.cgi (revision 2229)
@@ -0,0 +1,192 @@
+#! /usr/bin/python
+# -*- coding: ISO-8859-15 -*-
+
+# PyKota Print Quota Reports generator
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+#
+
+import sys
+import os
+import cgi
+import urllib
+
+from pykota import version
+from pykota.tool import PyKotaToolError
+from pykota.dumper import DumPyKota
+from pykota.cgifuncs import getLanguagePreference, getCharsetPreference
+
+header = """Content-type: text/html
+
+<?xml version="1.0" encoding="%s"?>
+<html>
+  <head>
+    <title>%s</title>
+    <link rel="stylesheet" type="text/css" href="/pykota.css" />
+  </head>
+  <body>
+    <form action="dumpykota.cgi" method="GET">
+      <table>
+        <tr>
+          <td>
+            <p>
+              <a href="http://www.librelogiciel.com/software/"><img src="http://www.librelogiciel.com/software/PyKota/pykota.png?version=%s" alt="PyKota's Logo" /></a>
+              <br />
+              <a href="http://www.librelogiciel.com/software/">PyKota v%s</a>
+            </p>
+          </td>
+          <td colspan="2">
+            <h1>%s</h1>
+          </td>
+        </tr>
+        <tr>
+          <td colspan="3" align="center">
+            <input type="submit" name="report" value="%s" />
+          </td>
+        </tr>
+      </table>
+      <p>
+        %s
+      </p>"""
+    
+footer = """
+      <table>
+        <tr>
+          <td colspan="3" align="center">
+            <input type="submit" name="report" value="%s" />
+          </td>
+        </tr>
+      </table>  
+    </form>
+  </body>
+</html>"""  
+
+class PyKotaDumperGUI(DumPyKota) :
+    """PyKota Dumper GUI"""
+    def guiDisplay(self) :
+        """Displays the dumper interface."""
+        global header, footer
+        print header % (self.getCharset(), _("PyKota Data Dumper"), version.__version__, version.__version__, _("PyKota Data Dumper"), _("Dump"), _("Please click on the above button"))
+        print self.htmlListDataTypes(self.options.get("data", "")) 
+        print "<br />"
+        print self.htmlListFormats(self.options.get("format", ""))
+        print "<br />"
+        print self.htmlFilterInput(" ".join(self.arguments))
+        print footer % _("Dump")
+        
+    def htmlListDataTypes(self, selected="") :    
+        """Displays the datatype selection list."""
+        message = '<table><tr><td valign="top">%s :</td><td valign="top"><select name="datatype">' % _("Data Type")
+        for dt in self.validdatatypes.items() :
+            if dt[0] == selected :
+                message += '<option value="%s" selected="selected">%s (%s)</option>' % (dt[0], dt[0], dt[1])
+            else :
+                message += '<option value="%s">%s (%s)</option>' % (dt[0], dt[0], dt[1])
+        message += '</select></td></tr></table>'
+        return message
+        
+    def htmlListFormats(self, selected="") :    
+        """Displays the formats selection list."""
+        message = '<table><tr><td valign="top">%s :</td><td valign="top"><select name="format">' % _("Output Format")
+        for fmt in self.validformats.items() :
+            if fmt[0] == selected :
+                message += '<option value="%s" selected="selected">%s (%s)</option>' % (fmt[0], fmt[0], fmt[1])
+            else :
+                message += '<option value="%s">%s (%s)</option>' % (fmt[0], fmt[0], fmt[1])
+        message += '</select></td></tr></table>'
+        return message
+        
+    def htmlFilterInput(self, value="") :    
+        """Input the optional dump filter."""
+        return _("Filter") + (' : <input type="text" name="filter" size="40" value="%s" /> <em>e.g. <strong>username=jerome printername=HP2100</strong></em>' % (value or ""))
+        
+    def guiAction(self) :
+        """Main function"""
+        try :
+            wantreport = self.form.has_key("report")
+        except TypeError :    
+            pass # WebDAV request probably, seen when trying to open a csv file in OOo
+        else :    
+            if wantreport :
+                try :
+                    if self.form.has_key("datatype") :
+                        self.options["data"] = self.form["datatype"].value
+                    if self.form.has_key("format") :
+                        self.options["format"] = self.form["format"].value
+                    if self.form.has_key("filter") :    
+                        self.arguments = self.form["filter"].value.split()
+                        
+                    # when no authentication is done, or when the remote username    
+                    # is 'root' (even if not run as root of course), then unrestricted
+                    # dump is allowed.
+                    remuser = os.environ.get("REMOTE_USER", "root")    
+                    # special hack to accomodate mod_auth_ldap Apache module
+                    try :
+                        remuser = remuser.split("=")[1].split(",")[0]
+                    except IndexError :    
+                        pass
+                    if remuser != "root" :
+                        # non-'root' users when the script is password protected
+                        # can not dump any data as they like, we restrict them
+                        # to their own datas.
+                        if self.options["data"] not in ["printers", "pmembers", "groups", "gpquotas"] :
+                            self.arguments.append("username=%s" % remuser)
+                        
+                    if self.options["format"] in ("csv", "ssv") :
+                        #ctype = "application/vnd.sun.xml.calc"     # OpenOffice.org
+                        ctype = "text/comma-separated-values"
+                        fname = "dump.csv"
+                    elif self.options["format"] == "tsv" :
+                        #ctype = "application/vnd.sun.xml.calc"     # OpenOffice.org
+                        ctype = "text/tab-separated-values"
+                        fname = "dump.tsv"
+                    elif self.options["format"] == "xml" :
+                        ctype = "text/xml"
+                        fname = "dump.xml"
+                    elif self.options["format"] == "cups" :
+                        ctype = "text/plain"
+                        fname = "page_log"
+                    print "Content-type: %s" % ctype    
+                    print "Content-disposition: attachment; filename=%s" % fname 
+                    print
+                    self.main(self.arguments, self.options, restricted=0)
+                except :
+                    print 'Content-type: text/html\n\n<html><head><title>CGI Error</title></head><body><p><font color="red">%s</font></p></body></html>' % self.crashed("CGI Error").replace("\n", "<br />")
+            else :        
+                self.guiDisplay()
+            
+if __name__ == "__main__" :
+    os.environ["LC_ALL"] = getLanguagePreference()
+    admin = PyKotaDumperGUI(lang=os.environ["LC_ALL"], charset=getCharsetPreference())
+    admin.deferredInit()
+    admin.form = cgi.FieldStorage()
+    admin.options = { "output" : "-",
+                "data" : "history",
+                "format" : "cups",
+              }
+    admin.arguments = []
+    admin.guiAction()
+    try :
+        admin.storage.close()
+    except (TypeError, NameError, AttributeError) :    
+        pass
+        
+    sys.exit(0)
Index: pykota/tags/1.22/Makefile.am
===================================================================
--- pykota/tags/1.22/Makefile.am (revision 2146)
+++ pykota/tags/1.22/Makefile.am (revision 2146)
@@ -0,0 +1,22 @@
+SUBDIRS = intl pykota bin conf untested man openoffice initscripts po
+
+pykotadocdir = $(datadir)/doc/pykota
+pykotadoc_DATA = 		\
+	README				\
+	FAQ					\
+	SECURITY			\
+	COPYING				\
+	LICENSE				\
+	CREDITS				\
+	TODO				\
+	NEWS				
+
+pykotaesdocdir = $(datadir)/doc/pykota/spanish
+pykotaesdoc_DATA = 		\
+	docs/spanish/instalacion.sxw
+
+EXTRA_DIST = config.rpath  \
+	$(pykotadoc_DATA)	\
+	$(pykotaesdoc_DATA)
+
+ACLOCAL_AMFLAGS = -I m4
Index: pykota/tags/1.22/initscripts/ldap/pykota-sample.ldif
===================================================================
--- pykota/tags/1.22/initscripts/ldap/pykota-sample.ldif (revision 2146)
+++ pykota/tags/1.22/initscripts/ldap/pykota-sample.ldif (revision 2146)
@@ -0,0 +1,43 @@
+#
+# PyKota sample LDAP directory tree
+#
+# YOU CAN USE IT TO CREATE AN INITIAL LDAP TREE WITH PYKOTA SUPPORT.
+# 
+# ITS STRUCTURE IS AN EXAMPLE : YOU CAN USE WHATEVER STRUCTURE YOU WANT,
+# PROVIDED YOU PUT CORRECT CONFIGURATION PARAMETERS IN /etc/pykota/pykota.conf
+# 
+# $Id$
+#
+ 
+dn: ou=People,dc=librelogiciel,dc=com
+ou: People
+objectClass: organizationalUnit
+
+dn: ou=Groups,dc=librelogiciel,dc=com
+ou: Groups
+objectClass: organizationalUnit
+
+dn: ou=PyKota,dc=librelogiciel,dc=com
+ou: PyKota
+objectClass: organizationalUnit
+
+dn: ou=Printers,ou=PyKota,dc=librelogiciel,dc=com
+ou: Printers
+objectClass: organizationalUnit
+
+dn: ou=UQuotas,ou=PyKota,dc=librelogiciel,dc=com
+ou: UQuotas
+objectClass: organizationalUnit
+
+dn: ou=GQuotas,ou=PyKota,dc=librelogiciel,dc=com
+ou: GQuotas
+objectClass: organizationalUnit
+
+dn: ou=Jobs,ou=PyKota,dc=librelogiciel,dc=com
+ou: Jobs
+objectClass: organizationalUnit
+
+dn: ou=LastJobs,ou=PyKota,dc=librelogiciel,dc=com
+ou: LastJobs
+objectClass: organizationalUnit
+
Index: pykota/tags/1.22/initscripts/ldap/pykota.schema
===================================================================
--- pykota/tags/1.22/initscripts/ldap/pykota.schema (revision 2146)
+++ pykota/tags/1.22/initscripts/ldap/pykota.schema (revision 2146)
@@ -0,0 +1,285 @@
+# $Id$
+#
+# pykota.schema
+#
+# LDAP Schema for Pykota Quota System
+#
+# Include it in OpenLDAP's configuration file (/etc/ldap/slapd.conf)
+# and restart slapd.
+#
+# Written 2003-05-28 by Wayne Godoy and John Flynn <wgodoy =AT= ub -DOT- edu -DOT- bz>
+#
+# Modified by Jerome Alet 2003-06-01
+#
+# 16868.x       => Conseil Internet & Logiciels Libres
+# 16868.1.x     => Pykota
+# 16868.1.1.x   => attributes
+# 16868.1.2.x   => classes
+#
+# Contributors : Leif Johansson - Stockholm University 
+#
+
+#        
+# PyKota Attributes Types
+#
+
+# pykotaLimitBy
+attributetype ( 1.3.6.1.4.1.16868.1.1.1 NAME 'pykotaLimitBy'
+        DESC 'How to limit the user/group : quota or balance'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaBalance
+attributetype ( 1.3.6.1.4.1.16868.1.1.2 NAME 'pykotaBalance'
+        DESC 'Current account balance for the user, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaLifeTimePaid
+attributetype ( 1.3.6.1.4.1.16868.1.1.3 NAME 'pykotaLifeTimePaid'
+        DESC 'Total money paid by the user to fill his account balance, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaPricePerPage
+attributetype ( 1.3.6.1.4.1.16868.1.1.4 NAME 'pykotaPricePerPage'
+        DESC 'Price per page for a printer, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaPricePerJob
+attributetype ( 1.3.6.1.4.1.16868.1.1.5 NAME 'pykotaPricePerJob'
+        DESC 'Price per job for a printer, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaSoftLimit
+attributetype ( 1.3.6.1.4.1.16868.1.1.6 NAME 'pykotaSoftLimit'
+        DESC 'Soft limit in maximal number of pages'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaHardLimit        
+attributetype ( 1.3.6.1.4.1.16868.1.1.7 NAME 'pykotaHardLimit'
+        DESC 'Hard limit in maximal number of pages'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaDateLimit
+attributetype ( 1.3.6.1.4.1.16868.1.1.8 NAME 'pykotaDateLimit'
+        DESC 'Date at which the soft limit becomes a hard one'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaPageCounter
+attributetype ( 1.3.6.1.4.1.16868.1.1.9 NAME 'pykotaPageCounter'
+        DESC 'Current page counter for the user on a particular printer'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+
+# pykotaLifePageCounter
+attributetype ( 1.3.6.1.4.1.16868.1.1.10 NAME 'pykotaLifePageCounter'
+        DESC 'Total page counter for the user on a particular printer'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+
+# pykotaJobId
+attributetype ( 1.3.6.1.4.1.16868.1.1.11 NAME 'pykotaJobId'
+        DESC 'Id of a job in a printer history of jobs'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaPrinterPageCounter
+attributetype ( 1.3.6.1.4.1.16868.1.1.12 NAME 'pykotaPrinterPageCounter'
+        DESC 'Life time page counter of a printer when the job began'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+
+# pykotaJobSize
+attributetype ( 1.3.6.1.4.1.16868.1.1.13 NAME 'pykotaJobSize'
+        DESC 'Current job size in number of pages in the history'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+
+# pykotaAction
+attributetype ( 1.3.6.1.4.1.16868.1.1.14 NAME 'pykotaAction'
+        DESC 'Was the job allowed, or denied : ( "ALLOW" |  "DENY" )'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaPrinterName        
+attributetype ( 1.3.6.1.4.1.16868.1.1.15 NAME 'pykotaPrinterName'
+        DESC 'PyKota printer name as received from the printing subsystem'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaUserName        
+attributetype ( 1.3.6.1.4.1.16868.1.1.16 NAME 'pykotaUserName'
+        DESC 'PyKota user name'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaGroupName        
+attributetype ( 1.3.6.1.4.1.16868.1.1.17 NAME 'pykotaGroupName'
+        DESC 'PyKota group name'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaLastJobIdent        
+attributetype ( 1.3.6.1.4.1.16868.1.1.18 NAME 'pykotaLastJobIdent'
+        DESC 'Identifies the last job in the history'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaFileName        
+attributetype ( 1.3.6.1.4.1.16868.1.1.19 NAME 'pykotaFileName'
+        DESC 'Print job filename'
+        EQUALITY caseExactMatch
+        SUBSTR caseExactSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+        
+# pykotaTitle        
+attributetype ( 1.3.6.1.4.1.16868.1.1.20 NAME 'pykotaTitle'
+        DESC 'Print job title'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+        
+# pykotaCopies
+attributetype ( 1.3.6.1.4.1.16868.1.1.21 NAME 'pykotaCopies'
+        DESC 'Number of copies of the current print job'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+        
+# pykotaOptions        
+attributetype ( 1.3.6.1.4.1.16868.1.1.22 NAME 'pykotaOptions'
+        DESC 'Print job options'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+        
+# pykotaJobPrice
+attributetype ( 1.3.6.1.4.1.16868.1.1.23 NAME 'pykotaJobPrice'
+        DESC 'Price of a particular job in the history, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+
+# pykotaHostName
+attributetype ( 1.3.6.1.4.1.16868.1.1.24 NAME 'pykotaHostName'
+        DESC 'The host the job is coming from'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
+        
+# pykotaJobSizeBytes
+attributetype ( 1.3.6.1.4.1.16868.1.1.25 NAME 'pykotaJobSizeBytes'
+        DESC 'Current job size in number of bytes in the history'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+
+# pykotaPayments
+attributetype ( 1.3.6.1.4.1.16868.1.1.26 NAME 'pykotaPayments'
+        DESC 'Stores all payments made by an user, encoded to store both date and amount, separated by a # between two spaces'
+        EQUALITY caseExactIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+        
+# pykotaOverCharge
+attributetype ( 1.3.6.1.4.1.16868.1.1.27 NAME 'pykotaOverCharge'
+        DESC 'OverCharging factor for a particular user, float'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaWarnCount
+attributetype ( 1.3.6.1.4.1.16868.1.1.28 NAME 'pykotaWarnCount'
+        DESC 'Number of times the user was warned'
+        EQUALITY integerMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
+        
+# pykotaMD5Sum        
+attributetype ( 1.3.6.1.4.1.16868.1.1.29 NAME 'pykotaMD5Sum'
+        DESC 'MD5 Sum of the job datas'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
+        
+# pykotaPages        
+attributetype ( 1.3.6.1.4.1.16868.1.1.30 NAME 'pykotaPages'
+        DESC 'Descriptor for each page settings in the history'
+        EQUALITY caseExactIA5Match
+        SUBSTR caseExactIA5SubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
+        
+# pykotaPrinterCoefficient
+attributetype ( 1.3.6.1.4.1.16868.1.1.31 NAME 'pykotaPrinterCoefficient'
+        DESC 'Coefficient for a particular page format. Contains label # coeff, e.g. A3 # 2.0'
+        EQUALITY caseIgnoreIA5Match
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+
+# pykotaBillingCode
+attributetype ( 1.3.6.1.4.1.16868.1.1.32 NAME 'pykotaBillingCode'
+        DESC 'Optional billing code for the print job'
+        EQUALITY caseIgnoreMatch
+        SUBSTR caseIgnoreSubstringsMatch
+        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+        
+
+#        
+# PyKota Object Classes
+#
+
+# pykotaAccount
+objectclass ( 1.3.6.1.4.1.16868.1.2.1 NAME 'pykotaAccount' SUP top AUXILIARY
+        DESC 'PyKota Auxiliary User Account'
+        MUST ( uid )
+        MAY  ( pykotaUserName $ pykotaLimitBy $ mail ) )
+        
+# pykotaGroup        
+objectclass ( 1.3.6.1.4.1.16868.1.2.2 NAME 'pykotaGroup' SUP top AUXILIARY
+        DESC 'PyKota Auxiliary Group'
+        MUST ( cn )
+        MAY  ( pykotaGroupName $ pykotaLimitBy $ memberUid $ uniqueMember $ member ) )
+        
+# pykotaPrinter        
+objectclass ( 1.3.6.1.4.1.16868.1.2.3 NAME 'pykotaPrinter' SUP top AUXILIARY
+        DESC 'PyKota Printer'
+        MUST ( cn )
+        MAY  ( description $ pykotaPrinterName $ pykotaPricePerPage $ pykotaPricePerJob $ pykotaPrinterCoefficient $ uniqueMember ) )
+        
+# pykotaUserPQuota        
+objectclass ( 1.3.6.1.4.1.16868.1.2.4 NAME 'pykotaUserPQuota' SUP top AUXILIARY
+        DESC 'PyKota User Quota on a Printer'
+        MUST ( cn $ pykotaUserName $ pykotaPrinterName )
+        MAY  ( pykotaPageCounter $ pykotaLifePageCounter $ pykotaSoftLimit $ pykotaHardLimit $ pykotaDateLimit $ pykotaWarnCount ) )
+        
+# pykotaGroupPQuota        
+objectclass ( 1.3.6.1.4.1.16868.1.2.5 NAME 'pykotaGroupPQuota' SUP top AUXILIARY
+        DESC 'PyKota Group Quota on a Printer'
+        MUST ( cn $ pykotaGroupName $ pykotaPrinterName )
+        MAY  ( pykotaSoftLimit $ pykotaHardLimit $ pykotaDateLimit ) )
+        
+# pykotaJob        
+objectclass ( 1.3.6.1.4.1.16868.1.2.6 NAME 'pykotaJob' SUP top AUXILIARY
+        DESC 'An entry in the job history for a printer'
+        MUST ( cn $ pykotaUserName $ pykotaPrinterName $ pykotaJobId )
+        MAY  ( pykotaBillingCode $ pykotaPrinterPageCounter $ pykotaJobSize $ pykotaAction $ pykotaJobPrice $ pykotaFileName $ pykotaTitle $ pykotaCopies $ pykotaOptions $ pykotaHostName $ pykotaJobSizeBytes $ pykotaMD5Sum $ pykotaPages ) )
+        
+# pykotaAccountBalance
+objectclass ( 1.3.6.1.4.1.16868.1.2.7 NAME 'pykotaAccountBalance' SUP top AUXILIARY
+        DESC 'PyKota User account balance'
+        MAY  ( pykotaUserName $ pykotaBalance $ pykotaLifeTimePaid $ pykotaOverCharge $ pykotaPayments ) )
+        
+# pykotaLastJob        
+objectclass ( 1.3.6.1.4.1.16868.1.2.8 NAME 'pykotaLastJob' SUP top AUXILIARY
+        DESC 'Last job information for a printer'
+        MUST ( pykotaLastJobIdent )
+        MAY ( pykotaPrinterName ) ) 
+        
+# pykotaObject - Use it if you have to 
+objectclass ( 1.3.6.1.4.1.16868.1.2.9 NAME 'pykotaObject' SUP top STRUCTURAL
+        DESC 'PyKota Object'
+        MUST ( cn ) )
+        
+        
Index: pykota/tags/1.22/initscripts/ldap/Makefile.am
===================================================================
--- pykota/tags/1.22/initscripts/ldap/Makefile.am (revision 2146)
+++ pykota/tags/1.22/initscripts/ldap/Makefile.am (revision 2146)
@@ -0,0 +1,8 @@
+pykotadocldapdir = $(datadir)/doc/pykota/
+pykotadocldap_DATA = 	\
+	pykota-sample.ldif	\
+	pykota.schema		\
+	README.ldap
+	
+EXTRA_DIST = \
+	$(pykotadocldap_DATA)
Index: pykota/tags/1.22/initscripts/ldap/README.ldap
===================================================================
--- pykota/tags/1.22/initscripts/ldap/README.ldap (revision 2146)
+++ pykota/tags/1.22/initscripts/ldap/README.ldap (revision 2146)
@@ -0,0 +1,92 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+Documentation :
+---------------
+
+pykota.schema :
+
+    This file can be used to modify an existing LDAP directory
+    to add the necessary object classes and attributes for use 
+    with PyKota.
+    
+    Include it in your LDAP server's configuration.
+    For example, with OpenLDAP 2.1.17 under Debian :
+    
+        $ cp pykota.schema /etc/ldap/schema
+        
+    Then edit /etc/ldap/slapd.conf and add a line to    
+    include the PyKota schema. You should have something
+    like :
+    
+        # Schema and objectClass definitions
+        include         /etc/ldap/schema/core.schema
+        include         /etc/ldap/schema/cosine.schema
+        include         /etc/ldap/schema/nis.schema
+        include         /etc/ldap/schema/inetorgperson.schema
+        include         /etc/ldap/schema/pykota.schema
+        
+    While this is not mandatory, you may want to create    
+    some indexes to speed things up a bit :
+    
+      You should already have these :
+      
+        index objectClass eq
+        index cn pres,eq,sub
+        index uid pres,eq,sub
+        
+      But we recommend that you add these :  
+      
+        index pykotaUserName pres,eq,sub
+        index pykotaGroupName pres,eq,sub
+        index pykotaPrinterName pres,eq,sub
+        index pykotaLastJobIdent eq
+        
+    Now you must ensure that the DN you use to bind to    
+    your OpenLDAP server don't have search queries size limits,
+    which gives for example (OpenLDAP 2.1.x or above) :
+    
+        limits dn="cn=RWadmin,dc=example,dc=com" size.soft=-1 size.hard=soft
+        limits dn="cn=ROadmin,dc=example,dc=com" size.soft=-1 size.hard=soft
+    
+    Where RWadmin and ROadmin are the usernames used to bind to your
+    OpenLDAP server within PyKota, respectively in ReadWrite mode 
+    (as set in pykotadmin.conf) and in ReadOnly mode (pykota.conf).
+    
+    Finally, restart the OpenLDAP server :    
+    
+        $ /etc/init.d/slapd restart
+
+pykota-sample.ldif :
+
+    You can use this file to initialize an LDAP tree for PyKota, if
+    you want.
+    
+    The structure used in this file is NOT mandatory !
+    Provided you put correct parameters into /etc/pykota/pykota.conf,
+    you can structure your LDAP directory the way you want.
+    
+To use an LDAP directory as the Quota Storage, just modify  
+/etc/pykota/pykota.conf to make it contain lines similar to the LDAP
+related ones in conf/pykota.conf.sample, but adapted to your
+own configuration. Also de-activate the PostgreSQL-related lines.
+    
+============================================================
Index: pykota/tags/1.22/initscripts/postgresql/README.postgresql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/README.postgresql (revision 2146)
+++ pykota/tags/1.22/initscripts/postgresql/README.postgresql (revision 2146)
@@ -0,0 +1,118 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+Documentation for the pykota-postgresql.sql script :
+----------------------------------------------------
+
+This script is to be used to create an empty Quota Storage
+DataBase using PostgreSQL as a backend.
+
+If you have already installed PyKota, and have datas in your
+Quota Storage DataBase, you may prefer to skip this section
+and read the next one.
+
+        - Launch the psql frontend and connect to the
+          database template1 as a PostgreSQL administrator
+          (i.e. the postgres user) :
+          
+            $ psql -h localhost -U postgres template1
+          
+        - Executes the pykota-postgresql.sql script :  
+        
+            template1=# \i pykota-postgresql.sql
+            
+        - Quit the psql frontend :    
+        
+            template1=# \q
+            
+        - Your PostgreSQL PyKota storage is now ready
+          for use.
+        
+============================================================
+
+Upgrade scripts :
+
+  DON'T DO ANYTHING IF THIS IS YOUR FIRST INSTALLATION
+  OF PYKOTA.
+
+  Some scripts to upgrade old PyKota databases to the new
+  database schema are included. You may have to run all
+  of them or only some of them, depending on your 
+  version of PyKota.
+  
+  * An SQL script to upgrade a 1.20 PyKota Storage DataBase to
+    1.21 is included. Launch it this way on the Quota Storage Server :
+    
+        $ psql -U postgres pykota
+        pykota=# \i upgrade-to-1.21.sql
+        pykota=# \q
+        $
+        
+    This script adds many fields to existing tables, and also adds
+    some tables in indexes.
+    
+  * An SQL script to upgrade a 1.18 PyKota Storage DataBase to
+    1.19 is included. Launch it this way on the Quota Storage Server :
+    
+        $ psql -U postgres pykota
+        pykota=# \i upgrade-to-1.19.sql
+        pykota=# \q
+        $
+        
+    This script adds a field to the print job history. The field that
+    is added is : hostname
+    
+  * An SQL script to upgrade a pre-1.16 PyKota Storage DataBase to
+    1.16 is included. Launch it this way on the Quota Storage Server :
+    
+        $ psql -U postgres pykota
+        pykota=# \i upgrade-to-1.16.sql
+        pykota=# \q
+        $
+        
+    This script adds some fields to the print job history, so that
+    more complete information will be known. The fields that
+    are added are : jobprice, filename, title, copies and print 
+    command options. Also some indexes are created to speed things up.
+  
+What is below is for historical reasons only, real people don't use  
+such old beasts, and YOU SHOULDN'T EITHER !
+
+  * An SQL script to upgrade a pre-1.14 PyKota Storage DataBase to
+    1.14 is included. Launch it this way on the Quota Storage Server :
+    
+        $ psql -U postgres pykota
+        pykota=# \i upgrade-to-1.14.sql
+        pykota=# \q
+        $
+        
+    This script adds an "email" field for each user. This field, if not    
+    NULL, is used as the email address of the user when sending warning
+    messages in case he is over quota.
+    
+  * An sql script to upgrade a pre-1.01 PyKota Quota Storage DataBase to 
+    1.01 is still included for historical reasons. PLEASE DON'T USE IT ! 
+  
+  * If you are already running an old version of PyKota (<1.03) and 
+    want to upgrade to 1.03, YOU HAVE TO RUN the 
+    upgrade-from-before-1.03.py shell script. NOT LAUNCHING THIS SCRIPT 
+    WILL CAUSE PYKOTA TO STOP WORKING ! PLEASE NEVER RUN THIS SCRIPT IF 
+    YOUR EXISTING VERSION OF PYKOTA IS ALREADY 1.03 OR HIGHER. 
Index: pykota/tags/1.22/initscripts/postgresql/VERYOLDpykota-upgrade-postgresql.sql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/VERYOLDpykota-upgrade-postgresql.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/postgresql/VERYOLDpykota-upgrade-postgresql.sql (revision 2147)
@@ -0,0 +1,51 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+--
+-- This script has to be used if you already
+-- have a pre-1.01 version of PyKota to upgrade
+-- your database schema. Don't use it if
+-- you've just installed PyKota, just use
+-- the normal script instead.
+--
+                        
+--                         
+-- WARNING : YOU NEED A RECENT VERSION OF POSTGRESQL FOR THE DROP COLUMN STATEMENT TO WORK !
+--
+
+--                         
+-- Modify the old database schema
+--
+ALTER TABLE grouppquota DROP COLUMN lifepagecounter;
+ALTER TABLE grouppquota DROP COLUMN pagecounter;
+
+--                         
+-- Create the groups/members relationship
+--
+CREATE TABLE groupsmembers(groupid INT4 REFERENCES groups(id),
+                           userid INT4 REFERENCES users(id),
+                           PRIMARY KEY (groupid, userid));
+                           
+--                        
+-- Set some ACLs                        
+--
+REVOKE ALL ON groupsmembers FROM public;                        
+GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON groupsmembers TO pykotaadmin;
Index: pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.21.sql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.21.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.21.sql (revision 2147)
@@ -0,0 +1,67 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+--
+-- This script has to be used if you already
+-- have a pre-1.21 version of PyKota to upgrade
+-- your database schema. 
+--
+-- YOU DON'T NEED TO USE IT IF YOU'VE JUST INSTALLED PYKOTA
+--
+                        
+--                         
+-- Modify the old database schema
+--
+ALTER TABLE users DROP COLUMN coefficient;
+ALTER TABLE users ADD COLUMN overcharge FLOAT;
+ALTER TABLE users ALTER COLUMN overcharge SET DEFAULT 1.0;
+UPDATE users SET overcharge=1.0;
+ALTER TABLE users ALTER COLUMN overcharge SET NOT NULL;
+
+ALTER TABLE userpquota DROP COLUMN warned;
+ALTER TABLE userpquota ADD COLUMN warncount INT4;
+ALTER TABLE userpquota ALTER COLUMN warncount SET DEFAULT 0;
+CREATE INDEX userpquota_u_id_ix ON userpquota (userid);
+CREATE INDEX userpquota_p_id_ix ON userpquota (printerid);
+UPDATE userpquota SET warncount=0;
+
+CREATE INDEX grouppquota_g_id_ix ON grouppquota (groupid);
+CREATE INDEX grouppquota_p_id_ix ON grouppquota (printerid);
+
+ALTER TABLE jobhistory ADD COLUMN md5sum TEXT;
+ALTER TABLE jobhistory ADD COLUMN pages TEXT;
+ALTER TABLE jobhistory ADD COLUMN billingcode TEXT;
+CREATE INDEX jobhistory_u_id_ix ON jobhistory (userid);
+
+-- 
+-- Create the table for coefficients wrt paper sizes and the like
+--
+CREATE TABLE coefficients (id SERIAL PRIMARY KEY NOT NULL, 
+                           printerid INTEGER NOT NULL REFERENCES printers(id), 
+                           label TEXT NOT NULL, 
+                           coefficient FLOAT DEFAULT 1.0, 
+                           CONSTRAINT coeffconstraint UNIQUE (printerid, label));
+                           
+REVOKE ALL ON coefficients FROM public;                        
+REVOKE ALL ON coefficients_id_seq FROM public;
+GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON coefficients TO pykotaadmin;
+GRANT SELECT, UPDATE ON coefficients_id_seq TO pykotaadmin;
+GRANT SELECT ON coefficients TO pykotauser;
Index: pykota/tags/1.22/initscripts/postgresql/pykota-postgresql.sql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/pykota-postgresql.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/postgresql/pykota-postgresql.sql (revision 2147)
@@ -0,0 +1,169 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+
+--
+-- PyKota Database creation script for PostgreSQL
+--
+-- Launch this as PostgreSQL administrator with \i
+--
+
+
+--
+-- Create the print quota database
+--
+CREATE DATABASE pykota;
+
+--
+-- Create the print quota database users
+-- 
+CREATE USER pykotaadmin;
+CREATE USER pykotauser;
+
+-- 
+-- Now connect to the new database
+-- 
+\connect pykota
+
+--
+-- Create the users table
+--
+CREATE TABLE users(id SERIAL PRIMARY KEY NOT NULL,
+                   username TEXT UNIQUE NOT NULL,
+                   email TEXT, 
+                   balance FLOAT DEFAULT 0.0,
+                   lifetimepaid FLOAT DEFAULT 0.0,
+                   limitby TEXT DEFAULT 'quota',
+                   overcharge FLOAT NOT NULL DEFAULT 1.0);
+                   
+--
+-- Create the groups table
+--
+CREATE TABLE groups(id SERIAL PRIMARY KEY NOT NULL,
+                    groupname TEXT UNIQUE NOT NULL,
+                    limitby TEXT DEFAULT 'quota');
+                    
+--
+-- Create the printers table
+--
+CREATE TABLE printers(id SERIAL PRIMARY KEY NOT NULL,
+                      printername TEXT UNIQUE NOT NULL,
+                      description TEXT,
+                      priceperpage FLOAT DEFAULT 0.0,
+                      priceperjob FLOAT DEFAULT 0.0);
+                    
+--
+-- Create the print quota table for users
+--
+CREATE TABLE userpquota(id SERIAL PRIMARY KEY NOT NULL,
+                        userid INT4 REFERENCES users(id),
+                        printerid INT4 REFERENCES printers(id),
+                        lifepagecounter INT4 DEFAULT 0,
+                        pagecounter INT4 DEFAULT 0,
+                        softlimit INT4,
+                        hardlimit INT4,
+                        datelimit TIMESTAMP,
+                        warncount INT4 DEFAULT 0); 
+CREATE INDEX userpquota_u_id_ix ON userpquota (userid);
+CREATE INDEX userpquota_p_id_ix ON userpquota (printerid);
+CREATE UNIQUE INDEX userpquota_up_id_ix ON userpquota (userid, printerid);
+                        
+--
+-- Create the job history table
+--
+CREATE TABLE jobhistory(id SERIAL PRIMARY KEY NOT NULL,
+                        jobid TEXT,
+                        userid INT4,
+                        printerid INT4,
+                        pagecounter INT4 DEFAULT 0,
+                        jobsizebytes INT8,
+                        jobsize INT4,
+                        jobprice FLOAT,
+                        action TEXT,
+                        filename TEXT,
+                        title TEXT,
+                        copies INT4,
+                        options TEXT,
+                        hostname TEXT,
+                        md5sum TEXT,
+                        pages TEXT,
+                        billingcode TEXT,
+                        jobdate TIMESTAMP DEFAULT now(),
+                        CONSTRAINT checkUserPQuota FOREIGN KEY (userid, printerid) REFERENCES userpquota(userid, printerid));
+CREATE INDEX jobhistory_u_id_ix ON jobhistory (userid);
+CREATE INDEX jobhistory_p_id_ix ON jobhistory (printerid);
+CREATE INDEX jobhistory_pd_id_ix ON jobhistory (printerid, jobdate);
+CREATE INDEX jobhistory_hostname_ix ON jobhistory (hostname);
+                        
+--
+-- Create the print quota table for groups
+--
+CREATE TABLE grouppquota(id SERIAL PRIMARY KEY NOT NULL,
+                         groupid INT4 REFERENCES groups(id),
+                         printerid INT4 REFERENCES printers(id),
+                         softlimit INT4,
+                         hardlimit INT4,
+                         datelimit TIMESTAMP);
+CREATE INDEX grouppquota_g_id_ix ON grouppquota (groupid);
+CREATE INDEX grouppquota_p_id_ix ON grouppquota (printerid);
+CREATE UNIQUE INDEX grouppquota_up_id_ix ON grouppquota (groupid, printerid);
+                        
+--                         
+-- Create the groups/members relationship
+--
+CREATE TABLE groupsmembers(groupid INT4 REFERENCES groups(id),
+                           userid INT4 REFERENCES users(id),
+                           PRIMARY KEY (groupid, userid));
+                           
+--                         
+-- Create the printer groups relationship
+--
+CREATE TABLE printergroupsmembers(groupid INT4 REFERENCES printers(id),
+                           printerid INT4 REFERENCES printers(id),
+                           PRIMARY KEY (groupid, printerid));
+--
+-- Create the table for payments
+-- 
+CREATE TABLE payments (id SERIAL PRIMARY KEY NOT NULL,
+                       userid INT4 REFERENCES users(id),
+                       amount FLOAT,
+                       date TIMESTAMP DEFAULT now());
+CREATE INDEX payments_date_ix ON payments (date);
+
+-- 
+-- Create the table for coefficients wrt paper sizes and the like
+--
+CREATE TABLE coefficients (id SERIAL PRIMARY KEY NOT NULL, 
+                           printerid INTEGER NOT NULL REFERENCES printers(id), 
+                           label TEXT NOT NULL, 
+                           coefficient FLOAT DEFAULT 1.0, 
+                           CONSTRAINT coeffconstraint UNIQUE (printerid, label));
+
+--                        
+-- Set some ACLs                        
+--
+REVOKE ALL ON users, groups, printers, userpquota, grouppquota, groupsmembers, printergroupsmembers, jobhistory, payments, coefficients FROM public;                        
+REVOKE ALL ON users_id_seq, groups_id_seq, printers_id_seq, userpquota_id_seq, grouppquota_id_seq, jobhistory_id_seq, payments_id_seq, coefficients_id_seq FROM public;
+
+GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON users, groups, printers, userpquota, grouppquota, groupsmembers, printergroupsmembers, jobhistory, payments, coefficients TO pykotaadmin;
+GRANT SELECT, UPDATE ON users_id_seq, groups_id_seq, printers_id_seq, userpquota_id_seq, grouppquota_id_seq, jobhistory_id_seq, payments_id_seq, coefficients_id_seq TO pykotaadmin;
+GRANT SELECT ON users, groups, printers, userpquota, grouppquota, groupsmembers, printergroupsmembers, jobhistory, payments, coefficients TO pykotauser;
+
Index: pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.14.sql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.14.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.14.sql (revision 2147)
@@ -0,0 +1,34 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+                        
+--                         
+-- WARNING : YOU NEED A RECENT VERSION OF POSTGRESQL FOR THE ALTER COLUMN STATEMENT TO WORK !
+--
+
+--                         
+-- Modify the old database schema
+--
+ALTER TABLE users ADD COLUMN email TEXT;
+CREATE USER pykotauser;
+REVOKE ALL ON users, groups, printers, userpquota, grouppquota, groupsmembers, jobhistory FROM pykotauser;
+REVOKE ALL ON users_id_seq, groups_id_seq, printers_id_seq, userpquota_id_seq, grouppquota_id_seq, jobhistory_id_seq FROM pykotauser;
+GRANT SELECT ON users, groups, printers, userpquota, grouppquota, groupsmembers, jobhistory TO pykotauser;
Index: pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.16.sql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.16.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.16.sql (revision 2147)
@@ -0,0 +1,75 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+--
+-- This script has to be used if you already
+-- have a pre-1.16 version of PyKota to upgrade
+-- your database schema. 
+--
+-- YOU DON'T NEED TO USE IT IF YOU'VE JUST INSTALLED PYKOTA
+--
+                        
+--                         
+-- WARNING : YOU NEED A RECENT VERSION OF POSTGRESQL FOR THE ALTER COLUMN STATEMENT TO WORK !
+--
+
+--                         
+-- Modify the old database schema
+--
+ALTER TABLE jobhistory ADD COLUMN jobprice FLOAT;
+ALTER TABLE jobhistory ADD COLUMN filename TEXT;
+ALTER TABLE jobhistory ADD COLUMN title TEXT;
+ALTER TABLE jobhistory ADD COLUMN copies INT4;
+ALTER TABLE jobhistory ADD COLUMN options TEXT;
+
+--
+-- Remove bad integrity rules
+-- and replace them with a new one
+--
+ALTER TABLE jobhistory DROP CONSTRAINT "$1";
+ALTER TABLE jobhistory DROP CONSTRAINT "$2";
+ALTER TABLE jobhistory ADD CONSTRAINT checkUserPQuota FOREIGN KEY (userid, printerid) REFERENCES userpquota (userid, printerid);
+
+-- 
+-- Add new tables
+--
+--                         
+-- Create the printer groups relationship
+--
+CREATE TABLE printergroupsmembers(groupid INT4 REFERENCES printers(id),
+                           printerid INT4 REFERENCES printers(id),
+                           PRIMARY KEY (groupid, printerid));
+
+--                         
+-- Now add some indexes
+--
+CREATE UNIQUE INDEX userpquota_up_id_ix ON userpquota (userid, printerid);
+CREATE INDEX jobhistory_p_id_ix ON jobhistory (printerid);
+CREATE INDEX jobhistory_pd_id_ix ON jobhistory (printerid, jobdate);
+CREATE UNIQUE INDEX grouppquota_up_id_ix ON grouppquota (groupid, printerid);
+
+-- 
+-- And now sets some ACLs
+-- 
+REVOKE ALL ON printergroupsmembers FROM public;                        
+GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON printergroupsmembers TO pykotaadmin;
+GRANT SELECT ON printergroupsmembers TO pykotauser;
+
Index: pykota/tags/1.22/initscripts/postgresql/Makefile.am
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/Makefile.am (revision 2146)
+++ pykota/tags/1.22/initscripts/postgresql/Makefile.am (revision 2146)
@@ -0,0 +1,12 @@
+pykotadopostgresdir = $(datadir)/doc/pykota/
+pykotadopostgres_DATA = 		\
+	dbschema.png				\
+	pykota-postgresql.sql		\
+	README.postgresql			\
+	upgrade-from-before-1.03.py	\
+	upgrade-to-1.14.sql			\
+	upgrade-to-1.16.sql			\
+	VERYOLDpykota-upgrade-postgresql.sql
+
+EXTRA_DIST = \
+	$(pykotadopostgres_DATA)
Index: pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.19.sql
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.19.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/postgresql/upgrade-to-1.19.sql (revision 2147)
@@ -0,0 +1,52 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+--
+-- This script has to be used if you already
+-- have a pre-1.19 version of PyKota to upgrade
+-- your database schema. 
+--
+-- YOU DON'T NEED TO USE IT IF YOU'VE JUST INSTALLED PYKOTA
+--
+                        
+--                         
+-- WARNING : YOU NEED A RECENT VERSION OF POSTGRESQL FOR THE ALTER COLUMN STATEMENT TO WORK !
+--
+
+--                         
+-- Modify the old database schema
+--
+ALTER TABLE printers ADD COLUMN description TEXT;
+ALTER TABLE jobhistory ADD COLUMN jobsizebytes INT8;
+ALTER TABLE jobhistory ADD COLUMN hostname TEXT;
+CREATE INDEX jobhistory_hostname_ix ON jobhistory (hostname);
+
+CREATE TABLE payments (id SERIAL PRIMARY KEY NOT NULL,
+                       userid INT4 REFERENCES users(id),
+                       amount FLOAT,
+                       date TIMESTAMP DEFAULT now());
+CREATE INDEX payments_date_ix ON payments (date);
+
+REVOKE ALL ON payments FROM public;                        
+REVOKE ALL ON payments_id_seq FROM public;
+GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON payments TO pykotaadmin;
+GRANT SELECT, UPDATE ON payments_id_seq TO pykotaadmin;
+GRANT SELECT ON payments TO pykotauser;
Index: pykota/tags/1.22/initscripts/postgresql/upgrade-from-before-1.03.py
===================================================================
--- pykota/tags/1.22/initscripts/postgresql/upgrade-from-before-1.03.py (revision 2146)
+++ pykota/tags/1.22/initscripts/postgresql/upgrade-from-before-1.03.py (revision 2146)
@@ -0,0 +1,172 @@
+#! /usr/bin/env python
+
+# PyKota Print Quota Warning sender
+#
+# PyKota - Print Quotas for CUPS and LPRng
+#
+# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+#
+# THIS IS AN UPGRADE SCRIPT FOR OLD PYKOTA DATABASES TO THE 1.03 VERSION
+#
+
+import sys
+import os
+try :
+    import pg
+except ImportError :    
+    sys.stderr.write("The PyGreSQL Python module doesn't seem to be available. ABORTED.\n")
+    sys.exit(-1)
+
+def dump_old_database() :
+    """Dumps the existing PyKota database to a file, to avoir loosing data.
+    
+       Returns 1 if dump is successfull, 0 if it isn't.
+    """   
+    pipeinput = os.popen("pg_dump -C -D -N -U postgres -f pykota-dump.sql pykota")
+    dummy = pipeinput.read()
+    return (pipeinput.close() is None) or 0
+
+def create_new_database() :
+    """Creates the empty database."""
+    pipeinput = os.popen("psql -U postgres template1 <pykota-postgresql.sql")
+    dummy = pipeinput.read()
+    return (pipeinput.close() is None) or 0
+    
+def restore_original_database() :
+    """Creates the empty database."""
+    pipeinput = os.popen("psql -U postgres template1 <pykota-dump.sql")
+    dummy = pipeinput.read()
+    return (pipeinput.close() is None) or 0
+    
+def open_database(dbname="pykota") :
+    """Returns the database object or None if we can't connect to it."""
+    try :
+        pykotadb = pg.connect(host="localhost", port=5432, dbname=dbname, user="postgres")
+    except pg.error, msg :     
+        sys.stderr.write("%s\n" % msg)
+        sys.stderr.write("Unable to connect to the local PostgreSQL server.\nPlease modify the open_database() method in %s\nto connect to the correct PostgreSQL server\nand relaunch the script.\n" % sys.argv[0])
+        return 
+    else :    
+        return pykotadb
+        
+        
+def doQuote(field) :
+    """Quotes a field for use as a string in SQL queries."""
+    if type(field) == type(0) : # TODO : do something safer
+        typ = "decimal"
+    else :    
+        typ = "text"
+    return pg._quote(field, typ)
+        
+def main() :
+    """Does the work."""
+    
+    # First we make a dump of the old database
+    print "Dumping old database for safety...",
+    if not dump_old_database() :
+        sys.stderr.write("Error while dumping old database. ABORTED.\n")
+        return -1
+    print "Done."
+        
+    # Second we try to connect to it    
+    print "Extracting datas from old database...", 
+    db = open_database()
+    if db is None :
+        sys.stderr.write("Impossible to connect to old PyKota database. ABORTED.\nAre you sure you are upgrading an existing installation ?\n")
+        return -1
+    
+    # Third we extract datas
+    oldprinters = db.query("SELECT * FROM printers ORDER BY id;")
+    oldusers = db.query("SELECT * FROM users ORDER BY id;")
+    oldquotas = db.query("SELECT * FROM userpquota ORDER BY printerid, userid;")
+    
+    # Fourth close the database
+    db.close()
+    print "Done."
+    
+    # Fifth we delete the old database !
+    answer = raw_input("The old database will be deleted for the upgrade to take place.\nAre you sure you want to continue (y/N) ? ")
+    if answer[0:1].upper() != 'Y' :
+        sys.stderr.write("User wants to stop now ! ABORTED.\n")
+        return -1
+    db = open_database("template1")
+    if db is None :
+        sys.stderr.write("Impossible to connect to database template1. ABORTED.\nPlease report to your Database administrator.\n")
+        return -1
+    try :
+        db.query("DROP DATABASE pykota;")
+    except pg.error, msg :
+        sys.stderr.write("Impossible to delete old database. ABORTED.\n%s\n" % msg)
+        db.close()
+        return -1
+    else :    
+        db.close()
+        
+    # Sixth we create the new database
+    print "Creating the new database...",
+    if not create_new_database() :
+        sys.stderr.write("impossible to create new database ! ABORTED.\n")
+        return -1
+    print "Done."
+    
+    # Seventh we restore old data
+    print "Restoring old datas..."
+    db = open_database()
+    if db is None :
+        sys.stderr.write("Impossible to connect to new PyKota database. ABORTED.\nOld database will be restored if possible.")
+        print "An error occured, I'll try to restore the original database..."
+        if not restore_original_database() :
+            sys.stderr.write("Shit ! A double-error occured !!!\nPlease report problem to your database administrator.\n")
+            sys.stderr.write("And file a bug report to alet@librelogiciel.com\n")
+        else :    
+            print "Done."
+        return -1
+    db.query("BEGIN;")    
+    try :
+        newprinters = {}
+        for oldprinter in oldprinters.dictresult() :
+            db.query("INSERT INTO printers (printername) VALUES (%s);" % doQuote(oldprinter["printername"]))
+            newid = db.query("SELECT id FROM printers WHERE printername='%s';" % oldprinter["printername"]).dictresult()[0]["id"]
+            newprinters[oldprinter["id"]] = newid
+        newusers = {}    
+        for olduser in oldusers.dictresult() :    
+            db.query("INSERT INTO users (username) VALUES (%s);" % doQuote(olduser["username"]))
+            newid = db.query("SELECT id FROM users WHERE username='%s';" % olduser["username"]).dictresult()[0]["id"]
+            newusers[olduser["id"]] = newid
+        for oldquota in oldquotas.dictresult() :   
+            db.query("INSERT INTO userpquota (userid, printerid, pagecounter, lifepagecounter, softlimit, hardlimit, datelimit) VALUES (%s, %s, %s, %s, %s, %s, %s);" % 
+                                              (doQuote(newusers[oldquota["userid"]]) , doQuote(newprinters[oldquota["printerid"]]), doQuote(oldquota["pagecounter"]), doQuote(oldquota["lifepagecounter"]), doQuote(oldquota["softlimit"]), doQuote(oldquota["hardlimit"]), doQuote(oldquota["datelimit"])))
+    except pg.error, msg :    
+        sys.stderr.write("ERROR : %s\nABORTED.\n" % msg)
+        db.query("ROLLBACK;")
+        db.close()    
+        return -1
+    except :    
+        sys.stderr.write("Unknown error ! ABORTED.\n")
+        db.query("ROLLBACK;")
+        db.close()    
+        return -1
+    else :    
+        db.query("COMMIT;")
+        db.close()
+    print "Done."
+    print "NB : Last job on each printer was lost. This is normal !"
+    return 0
+    
+if __name__ == "__main__" :
+    sys.exit(main())
Index: pykota/tags/1.22/initscripts/mysql/README.mysql
===================================================================
--- pykota/tags/1.22/initscripts/mysql/README.mysql (revision 2146)
+++ pykota/tags/1.22/initscripts/mysql/README.mysql (revision 2146)
@@ -0,0 +1,33 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+Documentation for the pykota-mysql.sql script :
+-----------------------------------------------
+
+This script is to be used to create an empty Quota Storage
+DataBase using MySQL as a backend.
+
+FOR NOW MYSQL SUPPORT IS ONLY A WORK IN PROGRESS. THIS DOESN'T WORK. 
+DON'T TOUCH THIS UNLESS YOU KNOW WHAT YOU ARE DOING OR WANT TO HELP. 
+
+IF YOU REALLY WANT MYSQL SUPPORT, BE PATIENT, OR USE POSTGRESQL
+INSTEAD WHICH IS MUCH MUCH BETTER ANYWAY.
+
Index: pykota/tags/1.22/initscripts/mysql/pykota-mysql.sql
===================================================================
--- pykota/tags/1.22/initscripts/mysql/pykota-mysql.sql (revision 2147)
+++ pykota/tags/1.22/initscripts/mysql/pykota-mysql.sql (revision 2147)
@@ -0,0 +1,150 @@
+--
+-- PyKota - Print Quotas for CUPS and LPRng
+--
+-- (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program; if not, write to the Free Software
+-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+--
+-- $Id$
+--
+--
+
+--
+-- PyKota Database creation script for MySQL
+--
+-- Launch this as MySQL administrator with \.
+--
+
+
+--
+-- Create the print quota database
+--
+
+--
+-- Create the print quota database users
+-- 
+-- TODO : CREATE USER pykotaadmin;
+-- TODO : CREATE USER pykotauser;
+
+-- 
+-- Now connect to the new database
+-- 
+\u pykota
+
+--
+-- Create the users table
+--
+CREATE TABLE users(id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                   username VARCHAR(255) UNIQUE NOT NULL,
+                   email TEXT, 
+                   balance FLOAT DEFAULT 0.0,
+                   lifetimepaid FLOAT DEFAULT 0.0,
+                   limitby VARCHAR(30) DEFAULT 'quota');
+                   
+--
+-- Create the groups table
+--
+CREATE TABLE groups(id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                    groupname VARCHAR(255) UNIQUE NOT NULL,
+                    limitby VARCHAR(30) DEFAULT 'quota');
+                    
+--
+-- Create the printers table
+--
+CREATE TABLE printers(id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                      printername VARCHAR(255) UNIQUE NOT NULL,
+                      description TEXT,
+                      priceperpage FLOAT DEFAULT 0.0,
+                      priceperjob FLOAT DEFAULT 0.0);
+                    
+--
+-- Create the print quota table for users
+--
+CREATE TABLE userpquota(id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                        userid INT4 REFERENCES users(id),
+                        printerid INT4 REFERENCES printers(id),
+                        lifepagecounter INT4 DEFAULT 0,
+                        pagecounter INT4 DEFAULT 0,
+                        softlimit INT4,
+                        hardlimit INT4,
+                        datelimit TIMESTAMP);
+CREATE UNIQUE INDEX userpquota_up_id_ix ON userpquota (userid, printerid);
+                        
+--
+-- Create the job history table
+--
+CREATE TABLE jobhistory(id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                        jobid TEXT,
+                        userid INT4,
+                        printerid INT4,
+                        pagecounter INT4 DEFAULT 0,
+                        jobsizebytes INT8,
+                        jobsize INT4,
+                        jobprice FLOAT,
+                        action TEXT,
+                        filename TEXT,
+                        title TEXT,
+                        copies INT4,
+                        options TEXT,
+                        hostname VARCHAR(255),
+                        jobdate TIMESTAMP,
+                        CONSTRAINT checkUserPQuota FOREIGN KEY (userid, printerid) 
+                                                           REFERENCES userpquota(userid, printerid));
+CREATE INDEX jobhistory_p_id_ix ON jobhistory (printerid);
+CREATE INDEX jobhistory_pd_id_ix ON jobhistory (printerid, jobdate);
+CREATE INDEX jobhistory_hostname_ix ON jobhistory (hostname);
+                        
+--
+-- Create the print quota table for groups
+--
+CREATE TABLE grouppquota(id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                         groupid INT4 REFERENCES groups(id),
+                         printerid INT4 REFERENCES printers(id),
+                         softlimit INT4,
+                         hardlimit INT4,
+                         datelimit TIMESTAMP);
+CREATE UNIQUE INDEX grouppquota_up_id_ix ON grouppquota (groupid, printerid);
+                        
+--                         
+-- Create the groups/members relationship
+--
+CREATE TABLE groupsmembers(groupid INT4 REFERENCES groups(id),
+                           userid INT4 REFERENCES users(id),
+                           PRIMARY KEY (groupid, userid));
+                           
+--                         
+-- Create the printer groups relationship
+--
+CREATE TABLE printergroupsmembers(groupid INT4 REFERENCES printers(id),
+                           printerid INT4 REFERENCES printers(id),
+                           PRIMARY KEY (groupid, printerid));
+--
+-- Create the table for payments
+-- 
+CREATE TABLE payments (id INT4 PRIMARY KEY NOT NULL AUTO_INCREMENT,
+                       userid INT4 REFERENCES users(id),
+                       amount FLOAT,
+                       date TIMESTAMP DEFAULT now());
+CREATE INDEX payments_date_ix ON payments (date);
+
+--                        
+-- Set some ACLs                        
+--
+-- TODO : REVOKE ALL ON users, groups, printers, userpquota, grouppquota, groupsmembers, printergroupsmembers, jobhistory, payments FROM public;                        
+-- TODO : REVOKE ALL ON users_id_seq, groups_id_seq, printers_id_seq, userpquota_id_seq, grouppquota_id_seq, jobhistory_id_seq, payments_id_seq FROM public;
+
+-- TODO : GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON users, groups, printers, userpquota, grouppquota, groupsmembers, printergroupsmembers, jobhistory, payments TO pykotaadmin;
+-- TODO : GRANT SELECT, UPDATE ON users_id_seq, groups_id_seq, printers_id_seq, userpquota_id_seq, grouppquota_id_seq, jobhistory_id_seq, payments_id_seq TO pykotaadmin;
+-- TODO : GRANT SELECT ON users, groups, printers, userpquota, grouppquota, groupsmembers, printergroupsmembers, jobhistory, payments TO pykotauser;
+
Index: pykota/tags/1.22/initscripts/Makefile.am
===================================================================
--- pykota/tags/1.22/initscripts/Makefile.am (revision 2146)
+++ pykota/tags/1.22/initscripts/Makefile.am (revision 2146)
@@ -0,0 +1,1 @@
+SUBDIRS = ldap postgresql
Index: pykota/tags/1.22/initscripts/README
===================================================================
--- pykota/tags/1.22/initscripts/README (revision 2146)
+++ pykota/tags/1.22/initscripts/README (revision 2146)
@@ -0,0 +1,88 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+============================================================
+
+This directory contains scripts to initialise the PyKota
+storage database. Use the one which best suits your need
+depending on the storage backend you want to use.
+
+There's one subdirectory per backend type supported.
+
+Files :
+=======
+
+  * postgresql/pykota-postgresql.sql :
+  
+    This file creates an empty Quota Storage Database, using PostgreSQL
+    as a backend. You have to use it the first time you install PyKota
+    if you want to use PostgreSQL as the Quota Storage Backend.
+    
+  * ldap/pykota.schema :  
+  
+    This file adds the necessary classes and attributes to an existing
+    LDAP directory for use with PyKota. Read this file and the 
+    associated ldap/README.ldap files for details.
+    
+    
+Old files, kept to allow people to upgrade from very old versions of PyKota :   
+=============================================================================
+    
+  * upgrade-to-1.19.sql :  
+  
+    This file upgrades the PostgreSQL Quota Storage Database schema
+    from versions before 1.19alpha7 to version 1.19alpha7 and above.
+    NEVER USE IT IF YOU ALREADY RUN 1.19alpha7 OR ABOVE !
+    
+  * upgrade-to-1.16.sql :  
+  
+    This file upgrades the PostgreSQL Quota Storage Database schema
+    from versions before 1.16 to version 1.16.
+    NEVER USE IT IF YOU ALREADY RUN 1.16 OR ABOVE !
+    
+  * upgrade-to-1.14.sql :  
+  
+    This file upgrades the PostgreSQL Quota Storage Database schema
+    from versions before 1.14 to version 1.14.
+    NEVER USE IT IF YOU ALREADY RUN 1.14 OR ABOVE !
+    
+  * VERYOLDpykota-upgrade-postgresql.sql :
+  
+    This file upgrades the PostgreSQL Quota Storage Database schema
+    from versions before 1.01 to version 1.01.
+    
+    IT'S THERE FOR HISTORICAL REASONS ONLY : DON'T USE IT, USE
+    THE SCRIPT DESCRIBED BELOW INSTEAD !
+    
+  * upgrade-from-before-1.03.py :
+  
+    This shell script upgrades the PostgreSQL Quota Storage Database schema
+    from versions 1.01 or 1.02 to version 1.03.
+    PLEASE DO A BACKUP OF YOUR PYKOTA DATABASE BEFORE RUNNING THIS SCRIPT !
+    Also this script will try to connect to PostgreSQL as the postgres user
+    (i.e. PostgreSQL's administrator), on the local machine (PyKota Storage 
+    Server), without prompting for a password. Please read this script and 
+    adapt it to your own configuration before running it. THIS IS IMPORTANT.
+    
+    THIS SCRIPT MAKES ANY REASONABLE CHECK TO ENSURE THAT YOUR DATAS WON'T 
+    BE LOST, AND ALSO DUMPS YOUR OLD DATABASE TO A TEXT FILE BEFORE DOING
+    ANYTHING. IT WAS TESTED SEVERAL TIMES AND SHOULDN'T PRODUCE ANY ERROR
+    EXCEPT ABOUT THE pykotaadmin and pykotauser POSTGRESQL USERS WHO 
+    ALREADY EXIST WHEN THE DATABASE SCHEMA IS UPGRADED. THIS IS NORMAL !
+  
Index: pykota/tags/1.22/stylesheets/README
===================================================================
--- pykota/tags/1.22/stylesheets/README (revision 2146)
+++ pykota/tags/1.22/stylesheets/README (revision 2146)
@@ -0,0 +1,26 @@
+# $Id$
+
+PyKota - Print Quota for CUPS and LPRng
+
+(c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+====================================================================
+
+This directory contains CSS stylesheets for use with PyKota's web based 
+tools. Just copy them in your web server's DocumentRoot (e.g. /var/www)
+so that the CGI scripts will find them.
+
+====================================================================
Index: pykota/tags/1.22/stylesheets/pykota.css
===================================================================
--- pykota/tags/1.22/stylesheets/pykota.css (revision 2146)
+++ pykota/tags/1.22/stylesheets/pykota.css (revision 2146)
@@ -0,0 +1,60 @@
+/* 
+  PyKota - Print Quota for CUPS and LPRng
+  
+  (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+  
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+  
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* $Id$ */
+
+body {
+        background-color: #FFFFFF;
+     }
+
+.even {
+        background-color: #DEDEDE;
+      }
+      
+.odd {      
+        background-color: #FFFFFF;
+     }   
+     
+.warn {     
+        background-color: orange;
+      }
+      
+.deny {     
+        background-color: red;
+      }
+      
+.pykotacolsheader {      
+        background-color: #AAAAAA;
+      }
+      
+a:link {      
+        color : blue;
+       }
+       
+a:visited {      
+        color : purple;
+       }
+       
+a:hover {      
+        color : green;
+       }
+       
+a:active {      
+        color : magenta;
+       }
