root / pykota / trunk / setup.py @ 1297

Revision 1297, 18.1 kB (checked in by jalet, 20 years ago)

Installation scripts now tells where the documentation was installed.

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