root / pykota / trunk / setup.py @ 1500

Revision 1500, 22.6 kB (checked in by jalet, 20 years ago)

The old pykota filter has been removed. LPRng support disabled for now.

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