root / pykota / trunk / setup.py @ 1149

Revision 1149, 16.8 kB (checked in by jalet, 21 years ago)

Job history can be disabled.
Some typos in README.
More messages in setup script.

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