root / pykota / trunk / setup.py @ 1345

Revision 1345, 19.4 kB (checked in by jalet, 20 years ago)

Better integration in Debian and more LSB compliance, thanks to
Peter Hawkins.

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