root / pykota / trunk / setup.py @ 1220

Revision 1177, 16.9 kB (checked in by jalet, 21 years ago)

CUPS backend added for people to experiment.

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