root / pykota / trunk / setup.py @ 1595

Revision 1595, 23.0 kB (checked in by jalet, 20 years ago)

Introduction of the pykosd command

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1#! /usr/bin/env python
2# -*- coding: ISO-8859-15 -*-
3#
4# PyKota
5#
6# PyKota : Print Quotas for CUPS and LPRng
7#
8# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22#
23# $Id$
24#
25# $Log$
26# Revision 1.46  2004/07/07 13:21:26  jalet
27# Introduction of the pykosd command
28#
29# Revision 1.45  2004/07/06 09:37:01  jalet
30# Integrated most of the Debian packaging work made by Sergio Gonz�z Gonz�z
31#
32# Revision 1.44  2004/06/05 22:03:49  jalet
33# Payments history is now stored in database
34#
35# Revision 1.43  2004/05/25 09:49:41  jalet
36# The old pykota filter has been removed. LPRng support disabled for now.
37#
38# Revision 1.42  2004/05/18 14:48:46  jalet
39# Big code changes to completely remove the need for "requester" directives,
40# jsut use "hardware(... your previous requester directive's content ...)"
41#
42# Revision 1.41  2004/05/13 14:17:32  jalet
43# Warning about changed accounter and requester directives
44#
45# Revision 1.40  2004/05/13 13:59:27  jalet
46# Code simplifications
47#
48# Revision 1.39  2004/04/08 17:07:41  jalet
49# pkpgcounter added
50#
51# Revision 1.38  2004/03/18 09:18:09  jalet
52# Installation now checks for old scripts
53#
54# Revision 1.37  2004/03/03 19:35:36  jalet
55# Spelling problem. Thanks to Jurandy Martins
56#
57# Revision 1.36  2004/02/25 15:10:38  jalet
58# Preliminary snmpprinterstatus command added.
59#
60# Revision 1.35  2004/02/12 22:43:58  jalet
61# Better integration in Debian and more LSB compliance, thanks to
62# Peter Hawkins.
63#
64# Revision 1.34  2004/02/07 13:45:51  jalet
65# Preliminary work on the pkhint command
66#
67# Revision 1.33  2004/02/04 11:16:59  jalet
68# pkprinters command line tool added.
69#
70# Revision 1.32  2004/01/18 20:52:50  jalet
71# Portuguese portuguese translation replaces brasilian portuguese one, which
72# moves in its own directory.
73# Installation script modified to reorganise installed documentation and include
74# the documentation on OpenOffice.org + ODBC
75#
76# Revision 1.31  2004/01/15 12:50:41  jalet
77# Installation scripts now tells where the documentation was installed.
78#
79# Revision 1.30  2004/01/12 15:45:03  jalet
80# Now installs documentation in /usr/share/doc/pykota too.
81#
82# Revision 1.29  2004/01/08 14:10:32  jalet
83# Copyright year changed.
84#
85# Revision 1.28  2003/12/27 16:49:25  uid67467
86# Should be ok now.
87#
88# Revision 1.28  2003/12/06 09:03:43  jalet
89# Added Perl script to retrieve printer's internal page counter via PJL,
90# contributed by Ren�und Jensen.
91#
92# Revision 1.27  2003/11/28 08:31:28  jalet
93# Shell script to wait for AppleTalk enabled printers being idle was added.
94#
95# Revision 1.26  2003/11/08 16:05:31  jalet
96# CUPS backend added for people to experiment.
97#
98# Revision 1.25  2003/10/08 07:01:19  jalet
99# Job history can be disabled.
100# Some typos in README.
101# More messages in setup script.
102#
103# Revision 1.24  2003/10/07 09:07:27  jalet
104# Character encoding added to please latest version of Python
105#
106# Revision 1.23  2003/07/29 20:55:17  jalet
107# 1.14 is out !
108#
109# Revision 1.22  2003/07/29 09:54:03  jalet
110# Added configurable LDAP mail attribute support
111#
112# Revision 1.21  2003/07/28 09:11:12  jalet
113# PyKota now tries to add its attributes intelligently in existing LDAP
114# directories.
115#
116# Revision 1.20  2003/07/23 16:51:32  jalet
117# waitprinter.sh is now included to prevent PyKota from asking the
118# printer's internal page counter while a job is still being printer.
119#
120# Revision 1.19  2003/07/16 21:53:07  jalet
121# Really big modifications wrt new configuration file's location and content.
122#
123# Revision 1.18  2003/07/03 09:44:00  jalet
124# Now includes the pykotme utility
125#
126# Revision 1.17  2003/06/30 12:46:15  jalet
127# Extracted reporting code.
128#
129# Revision 1.16  2003/06/06 20:49:15  jalet
130# Very latest schema. UNTESTED.
131#
132# Revision 1.15  2003/05/17 16:32:30  jalet
133# Also outputs the original import error message.
134#
135# Revision 1.14  2003/05/17 16:31:38  jalet
136# Dies gracefully if DistUtils is not present.
137#
138# Revision 1.13  2003/04/29 18:37:54  jalet
139# Pluggable accounting methods (actually doesn't support external scripts)
140#
141# Revision 1.12  2003/04/23 22:13:56  jalet
142# Preliminary support for LPRng added BUT STILL UNTESTED.
143#
144# Revision 1.11  2003/04/17 13:49:29  jalet
145# Typo
146#
147# Revision 1.10  2003/04/17 13:48:39  jalet
148# Better help
149#
150# Revision 1.9  2003/04/17 13:47:28  jalet
151# Help added during installation.
152#
153# Revision 1.8  2003/04/15 17:49:29  jalet
154# Installation script now checks the presence of Netatalk
155#
156# Revision 1.7  2003/04/03 20:03:37  jalet
157# Installation script now allows to install the sample configuration file.
158#
159# Revision 1.6  2003/03/29 13:45:26  jalet
160# GPL paragraphs were incorrectly (from memory) copied into the sources.
161# Two README files were added.
162# Upgrade script for PostgreSQL pre 1.01 schema was added.
163#
164# Revision 1.5  2003/03/29 13:08:28  jalet
165# Configuration is now expected to be found in /etc/pykota.conf instead of
166# in /etc/cups/pykota.conf
167# Installation script can move old config files to the new location if needed.
168# Better error handling if configuration file is absent.
169#
170# Revision 1.4  2003/03/29 09:47:00  jalet
171# More powerful installation script.
172#
173# Revision 1.3  2003/03/26 17:48:36  jalet
174# First shot at trying to detect the availability of the needed software
175# during the installation.
176#
177# Revision 1.2  2003/03/09 16:49:04  jalet
178# The installation script installs the man pages too now.
179#
180# Revision 1.1  2003/02/05 21:28:17  jalet
181# Initial import into CVS
182#
183#
184#
185
186import sys
187import glob
188import os
189import shutil
190try :
191    from distutils.core import setup
192except ImportError, msg :   
193    sys.stderr.write("%s\n" % msg)
194    sys.stderr.write("You need the DistUtils Python module.\nunder Debian, you may have to install the python-dev package.\nOf course, YMMV.\n")
195    sys.exit(-1)
196
197from distutils import sysconfig
198sys.path.insert(0, "pykota")
199from pykota.version import __version__, __doc__
200
201ACTION_CONTINUE = 0
202ACTION_ABORT = 1
203
204#ETC_DIR = "./debian/tmp/etc/pykota/"
205ETC_DIR = "/etc/pykota/"
206
207def checkOldModule(path) :
208    """Checks if an old PyKota module is still in the destination (in case of upgrade)."""
209    fname = os.path.join(sysconfig.get_python_lib(), "pykota", path)
210    for ext in ["py", "pyc", "pyo"] :
211        fullname = "%s.%s" % (fname, ext)
212        if os.path.isfile(fullname) :
213            sys.stderr.write("ERROR : old module %s still exists. Remove it and restart installation.\n" % fullname)
214            sys.stderr.write("INSTALLATION ABORTED !\n")
215            sys.exit(-1)
216   
217def checkOldScript(cmd) :
218    """Checks if an old shell script is still around in /usr/bin."""
219    return os.path.isfile(os.path.join("/usr/bin", cmd))
220
221def checkModule(module) :
222    """Checks if a Python module is available or not."""
223    try :
224        exec "import %s" % module
225    except ImportError :   
226        return 0
227    else :   
228        return 1
229       
230def checkCommand(command) :
231    """Checks if a command is available or not."""
232    input = os.popen("type %s 2>/dev/null" % command)
233    result = input.read().strip()
234    input.close()
235    return result
236   
237def checkWithPrompt(prompt, module=None, command=None, helper=None) :
238    """Tells the user what will be checked, and asks him what to do if something is absent."""
239    sys.stdout.write("Checking for %s availability : " % prompt)
240    sys.stdout.flush()
241    if command is not None :
242        result = checkCommand(command)
243    elif module is not None :   
244        result = checkModule(module)
245    if result :   
246        sys.stdout.write("OK\n")
247        return ACTION_CONTINUE
248    else :   
249        sys.stdout.write("NO.\n")
250        sys.stderr.write("ERROR : %s not available !\n" % prompt)
251        if helper is not None :
252            sys.stdout.write("%s\n" % helper)
253            sys.stdout.write("You may continue safely if you don't need this functionnality.\n")
254        answer = raw_input("%s is missing. Do you want to continue anyway (y/N) ? " % prompt)
255        if answer[0:1].upper() == 'Y' :
256            return ACTION_CONTINUE
257        else :
258            return ACTION_ABORT
259   
260if ("install" in sys.argv) and not ("help" in sys.argv) :
261    # checks if Python version is correct, we need >= 2.1
262    if not (sys.version > "2.1") :
263        sys.stderr.write("PyKota needs at least Python v2.1 !\nYour version seems to be older than that, please update.\nAborted !\n")
264        sys.exit(-1)
265       
266    # checks if a configuration file is present in the new location
267    if not os.path.isfile(os.path.join(ETC_DIR,"pykota.conf")) :
268        if not os.path.isdir(ETC_DIR) :
269            try :
270                os.mkdir(ETC_DIR)
271            except OSError, msg :   
272                sys.stderr.write("An error occured while creating the etc/pykota directory.\n%s\n" % msg)
273                sys.exit(-1)
274               
275        if os.path.isfile("/etc/pykota.conf") :
276            # upgrade from pre-1.14 to 1.14 and above
277            sys.stdout.write("From version 1.14 on, PyKota expects to find its configuration\nfile in /etc/pykota/ instead of /etc/\n")
278            sys.stdout.write("It seems that you've got a configuration file in the old location,\nso it will not be used anymore,\nand there's no configuration file in the new location.\n")
279            answer = raw_input("Do you want to move /etc/pykota.conf to /etc/pykota/pykota.conf (y/N) ? ")
280            if answer[0:1].upper() == 'Y' :
281                try :
282                    os.rename("/etc/pykota.conf", os.path.join(ETC_DIR,"pykota.conf"))
283                except OSError :   
284                    sys.stderr.write("ERROR : An error occured while moving /etc/pykota.conf to /etc/pykota/pykota.conf\nAborted !\n")
285                    sys.exit(-1)
286                else :   
287                    sys.stdout.write("Configuration file /etc/pykota.conf moved to /etc/pykota/pykota.conf.\n")
288            else :
289                sys.stderr.write("WARNING : Configuration file /etc/pykota.conf won't be used ! Move it to /etc/pykota/ instead.\n")
290                sys.stderr.write("PyKota installation will continue anyway,\nbut the software won't run until you put a proper configuration file in /etc/pykota/\n")
291            dummy = raw_input("Please press ENTER when you have read the message above. ")
292        else :
293            # first installation
294            if os.path.isfile("conf/pykota.conf.sample") :
295                answer = raw_input("Do you want to install\n\tconf/pykota.conf.sample as /etc/pykota/pykota.conf (y/N) ? ")
296                if answer[0:1].upper() == 'Y' :
297                    try :
298                        shutil.copy("conf/pykota.conf.sample", os.path.join(ETC_DIR,"pykota.conf"))       
299                        shutil.copy("conf/pykotadmin.conf.sample", os.path.join(ETC_DIR,"pykotadmin.conf"))       
300                    except IOError, msg :   
301                        sys.stderr.write("WARNING : Problem while installing sample configuration files in /etc/pykota/, please do it manually.\n%s\n" % msg)
302                    else :   
303                        sys.stdout.write("Configuration file /etc/pykota/pykota.conf and /etc/pykota/pykotadmin.conf installed.\nDon't forget to adapt these files to your needs.\n")
304                else :       
305                    sys.stderr.write("WARNING : PyKota won't run without a configuration file !\n")
306            else :       
307                # Problem ?
308                sys.stderr.write("WARNING : PyKota's sample configuration file cannot be found.\nWhat you have downloaded seems to be incomplete,\nor you are not in the pykota directory.\nPlease double check, and restart the installation procedure.\n")
309            dummy = raw_input("Please press ENTER when you have read the message above. ")
310    else :   
311        # already at 1.14 or above.
312        # Now check if old scripts are still in /usr/bin
313        for script in ["cupspykota", "pykota", "waitprinter.sh", "papwaitprinter.sh", "mailandpopup.sh", "pagecount.pl"] :
314            if checkOldScript(script) :
315                sys.stderr.write("WARNING : the %s script is still present in /usr/bin, but the new version will be installed in /usr/share/pykota, please remove the %s script from /usr/bin and double check that your configuration is correct.\n" % (script, script))
316                if script == "cupspykota" :
317                    sys.stderr.write("\nBe sure to also remove the old symbolic link from /usr/lib/cups/backend/cupspykota to /usr/bin/cupspykota. You'll have to recreate it once the installation has finished successfully.\n")
318                sys.stderr.write("\nINSTALLATION ABORTED !\nPlease correct the problem and restart installation.\n")
319                sys.exit(-1)
320               
321        # now checks if pre-1.19alpha8 code is still there       
322        for module in ["accounters/querying", "accounters/external", "requesters/snmp", "requesters/external"] :
323            checkOldModule(module)
324       
325    # Second stage, we will fail if onfiguration is incorrect for security reasons
326    from pykota.config import PyKotaConfig,PyKotaConfigError
327    try :
328        conf = PyKotaConfig(ETC_DIR)
329    except PyKotaConfigError, msg :   
330        sys.stedrr.write("%s\nINSTALLATION ABORTED !\nPlease restart installation.\n" % msg)
331        sys.exit(-1)
332    else :
333        hasadmin = conf.getGlobalOption("storageadmin", ignore=1)
334        hasadminpw = conf.getGlobalOption("storageadminpw", ignore=1)
335        hasuser = conf.getGlobalOption("storageuser", ignore=1)
336        if hasadmin or hasadminpw : 
337            sys.stderr.write("From version 1.14 on, PyKota expects that /etc/pykota/pykota.conf doesn't contain the Quota Storage Administrator's name and optional password.\n")
338            sys.stderr.write("Please put these in a [global] section in /etc/pykota/pykotadmin.conf\n")
339            sys.stderr.write("Then replace these values with 'storageuser' and 'storageuserpw' in /etc/pykota/pykota.conf\n")
340            sys.stderr.write("These two fields were re-introduced to allow any user to read to his own quota, without allowing them to modify it.\n")
341            sys.stderr.write("You can look at the conf/pykota.conf.sample and conf/pykotadmin.conf.sample files for examples.\n")
342            sys.stderr.write("YOU HAVE TO DO THESE MODIFICATIONS MANUALLY, AND RESTART THE INSTALLATION.\n")
343            sys.stderr.write("INSTALLATION ABORTED FOR SECURITY REASONS.\n")
344            sys.exit(-1)
345        if not hasuser :
346            sys.stderr.write("From version 1.14 on, PyKota expects that /etc/pykota/pykota.conf contains the Quota Storage Normal User's name and optional password.\n")
347            sys.stderr.write("Please put these in a [global] section in /etc/pykota/pykota.conf\n")
348            sys.stderr.write("These fields are respectively named 'storageuser' and 'storageuserpw'.\n")
349            sys.stderr.write("These two fields were re-introduced to allow any user to read to his own quota, without allowing them to modify it.\n")
350            sys.stderr.write("You can look at the conf/pykota.conf.sample and conf/pykotadmin.conf.sample files for examples.\n")
351            sys.stderr.write("YOU HAVE TO DO THESE MODIFICATIONS MANUALLY, AND RESTART THE INSTALLATION.\n")
352            sys.stderr.write("INSTALLATION ABORTED FOR SECURITY REASONS.\n")
353            sys.exit(-1)
354           
355        sb = conf.getStorageBackend()
356        if (sb.get("storageadmin") is None) or (sb.get("storageuser") is None) :
357            sys.stderr.write("From version 1.14 on, PyKota expects that /etc/pykota/pykota.conf contains the Quota Storage Normal User's name and optional password which gives READONLY access to the Print Quota DataBase,")
358            sys.stderr.write("and that /etc/pykota/pykotadmin.conf contains the Quota Storage Administrator's name and optional password which gives READ/WRITE access to the Print Quota DataBase.\n")
359            sys.stderr.write("Your configuration doesn't seem to be OK, please modify your configuration files in /etc/pykota/\n")
360            sys.stderr.write("AND RESTART THE INSTALLATION.\n")
361            sys.stderr.write("INSTALLATION ABORTED FOR SECURITY REASONS.\n")
362            sys.exit(-1)
363           
364        # warns for new LDAP fields   
365        if sb.get("storagebackend") == "ldapstorage" :   
366            usermail = conf.getGlobalOption("usermail", ignore=1)
367            newuser = conf.getGlobalOption("newuser", ignore=1)
368            newgroup = conf.getGlobalOption("newgroup", ignore=1)
369            if not (usermail and newuser and newgroup) :
370                sys.stderr.write("From version 1.14 on, PyKota LDAP Support needs three additional configuration fields.\n")
371                sys.stderr.write("Please put the 'usermail', 'newuser' and 'newgroup' configuration fields in a\n[global] section in /etc/pykota/pykota.conf\n")
372                sys.stderr.write("You can look at the conf/pykota.conf.sample file for examples.\n")
373                sys.stderr.write("YOU HAVE TO DO THESE MODIFICATIONS MANUALLY, AND RESTART THE INSTALLATION.\n")
374                sys.stderr.write("INSTALLATION ABORTED BECAUSE CONFIGURATION INCOMPLETE.\n")
375                sys.exit(-1)
376               
377        # Say something about caching mechanism and disabling job history
378        sys.stdout.write("You can now activate the database caching mechanism\nwhich is disabled by default.\nIt is especially recommended with the LDAP backend.\n")
379        sys.stdout.write("You can now disable the preservation of the complete\njob history which is enabled by default.\nIt is probably more useful with the LDAP backend.\n")
380        sys.stdout.write("PLEASE LOOK AT THE SAMPLE CONFIGURATION FILE conf/pykota.conf.sample\n")
381        sys.stdout.write("TO LEARN HOW TO DO\n")
382        dummy = raw_input("Please press ENTER when you have read the message above. ")
383        sys.stdout.write("\n")
384           
385    # change files permissions   
386    os.chmod(os.path.join(ETC_DIR,"pykota.conf"), 0644)
387    os.chmod(os.path.join(ETC_DIR,"pykotadmin.conf"), 0640)
388   
389    # WARNING MESSAGE   
390    sys.stdout.write("WARNING : IF YOU ARE UPGRADING FROM A PRE-1.19alpha17 TO 1.19alpha17 OR ABOVE\n")
391    sys.stdout.write("AND USE THE POSTGRESQL BACKEND, THEN YOU HAVE TO MODIFY YOUR\n")
392    sys.stdout.write("DATABASE SCHEMA USING initscripts/postgresql/upgrade-to-1.19.sql\n")
393    sys.stdout.write("PLEASE READ DOCUMENTATION IN initscripts/postgresql/ TO LEARN HOW TO DO.\n")
394    sys.stdout.write("YOU CAN DO THAT AFTER THE INSTALLATION IS FINISHED, OR PRESS CTRL+C NOW.\n")
395    sys.stdout.write("\n\nYOU DON'T HAVE ANYTHING SPECIAL TO DO IF THIS IS YOUR FIRST INSTALLATION\nOR IF YOU ARE ALREADY RUNNING VERSION 1.19alpha17 OR ABOVE.\n\n")
396    dummy = raw_input("Please press ENTER when you have read the message above. ")
397   
398    sys.stdout.write("\n\nWARNING : IF YOU ARE UPGRADING FROM A PRE-1.19alpha10 TO 1.19alpha10 OR ABOVE\n")
399    sys.stdout.write("YOU **MUST** MODIFY YOUR /etc/pykota/pykota.conf FILE BECAUSE accounter\n")
400    sys.stdout.write("AND requester DIRECTIVES SUPPORTED VALUES HAVE CHANGED.\n\n")
401    sys.stdout.write("YOU CAN DO THAT AFTER THE INSTALLATION IS FINISHED, OR PRESS CTRL+C NOW.\n")
402    sys.stdout.write("\n\nYOU DON'T HAVE ANYTHING SPECIAL TO DO IF THIS IS YOUR FIRST INSTALLATION\nOR IF YOU ARE ALREADY RUNNING VERSION 1.19alpha10 OR ABOVE.\n\n")
403    dummy = raw_input("Please press ENTER when you have read the message above. ")
404   
405    # checks if some needed Python modules are there or not.
406    modulestocheck = [ ("PygreSQL", "pg", "PygreSQL is mandatory if you want to use PostgreSQL as the quota storage backend."),                                           
407                       ("mxDateTime", "mx.DateTime", "eGenix' mxDateTime is mandatory for PyKota to work."), 
408                       ("Python-LDAP", "ldap", "Python-LDAP is mandatory if you plan to use an LDAP\ndirectory as the quota storage backend.")
409                     ]
410    commandstocheck = [("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.")]
411    for (name, module, helper) in modulestocheck :
412        action = checkWithPrompt(name, module=module, helper=helper)
413        if action == ACTION_ABORT :
414            sys.stderr.write("Aborted !\n")
415            sys.exit(-1)
416           
417    # checks if some software are there or not.
418    for (name, command, helper) in commandstocheck :
419        action = checkWithPrompt(name, command=command, helper=helper)
420        if action == ACTION_ABORT :
421            sys.stderr.write("Aborted !\n")
422            sys.exit(-1)
423           
424data_files = []
425mofiles = glob.glob(os.sep.join(["po", "*", "*.mo"]))
426for mofile in mofiles :
427    lang = mofile.split(os.sep)[1]
428    directory = os.sep.join(["share", "locale", lang, "LC_MESSAGES"])
429    data_files.append((directory, [ mofile ]))
430   
431docdir = "share/doc/pykota"   
432docfiles = ["README", "FAQ", "SECURITY", "COPYING", "LICENSE", "CREDITS", "TODO", "NEWS"]
433data_files.append((docdir, docfiles))
434
435docfiles = glob.glob(os.sep.join(["docs", "*.pdf"]))
436data_files.append((docdir, docfiles))
437
438docfiles = glob.glob(os.sep.join(["docs", "spanish", "*.pdf"]))
439docfiles += glob.glob(os.sep.join(["docs", "spanish", "*.sxw"]))
440data_files.append((os.path.join(docdir, "spanish"), docfiles))
441
442docfiles = glob.glob(os.sep.join(["docs", "pykota", "*.html"]))
443data_files.append((os.path.join(docdir, "html"), docfiles))
444
445docfiles = glob.glob(os.sep.join(["openoffice", "*.sxw"]))
446docfiles += glob.glob(os.sep.join(["openoffice", "*.png"]))
447docfiles += glob.glob(os.sep.join(["openoffice", "README"]))
448data_files.append((os.path.join(docdir, "openoffice"), docfiles))
449
450directory = os.sep.join(["share", "man", "man1"])
451manpages = glob.glob(os.sep.join(["man", "*.1"]))   
452data_files.append((directory, manpages))
453
454directory = os.sep.join(["share", "pykota"])
455data_files.append((directory, ["bin/cupspykota", "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"]))
456
457setup(name = "pykota", version = __version__,
458      license = "GNU GPL",
459      description = __doc__,
460      author = "Jerome Alet",
461      author_email = "alet@librelogiciel.com",
462      url = "http://www.librelogiciel.com/software/",
463      packages = [ "pykota", "pykota.storages", "pykota.loggers", "pykota.accounters", "pykota.reporters" ],
464      scripts = [ "bin/pkpgcounter", "bin/snmpprinterstatus", "bin/pykosd", "bin/edpykota", "bin/repykota", "bin/warnpykota", "bin/pykotme", "bin/pkprinters", "bin/pkhint" ],
465      data_files = data_files)
466
467if ("install" in sys.argv) and not ("help" in sys.argv) :
468    sys.stdout.write("\n\nYou can give a look at PyKota's documentation in:\n%s\n\n" % docdir)
Note: See TracBrowser for help on using the browser.