root / pykota / trunk / setup.py @ 1407

Revision 1407, 20.7 kB (checked in by jalet, 20 years ago)

Installation now checks for old scripts

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