root / pykota / trunk / setup.py @ 1360

Revision 1360, 19.5 kB (checked in by jalet, 20 years ago)

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