root / pykota / trunk / setup.py @ 1240

Revision 1240, 17.3 kB (checked in by uid67467, 20 years ago)

Should be ok now.

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