root / pykota / trunk / setup.py @ 1388

Revision 1386, 19.6 kB (checked in by jalet, 21 years ago)

Spelling problem. Thanks to Jurandy Martins

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