root / pykota / trunk / setup.py @ 1336

Revision 1330, 19.0 kB (checked in by jalet, 21 years ago)

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