root / pykota / trunk / setup.py @ 1307

Revision 1307, 18.9 kB (checked in by jalet, 20 years ago)

Portuguese portuguese translation replaces brasilian portuguese one, which
moves in its own directory.
Installation script modified to reorganise installed documentation and include
the documentation on OpenOffice?.org + ODBC

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