root / pykota / trunk / setup.py @ 1483

Revision 1483, 22.5 kB (checked in by jalet, 20 years ago)

Big code changes to completely remove the need for "requester" directives,
jsut use "hardware(... your previous requester directive's content ...)"

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