root / pykota / trunk / setup.py @ 1257

Revision 1257, 17.4 kB (checked in by jalet, 20 years ago)

Copyright year changed.

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