root / pykota / trunk / setup.py @ 1459

Revision 1430, 20.8 kB (checked in by jalet, 21 years ago)

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