root / pykota / trunk / setup.py @ 1529

Revision 1522, 22.7 kB (checked in by jalet, 20 years ago)

Payments history is now stored in database

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