root / pykota / trunk / setup.py @ 1338

Revision 1338, 19.1 kB (checked in by jalet, 20 years ago)

Preliminary work on the pkhint command

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