root / pykota / trunk / setup.py @ 1232

Revision 1226, 17.1 kB (checked in by jalet, 21 years ago)

Shell script to wait for AppleTalk? enabled printers being idle was added.

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