#!/usr/bin/env python # Authors: Rob Crittenden # # Copyright (C) 2008 Red Hat # see file 'COPYING' for use and warranty information # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; version 2 only # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Documentation can be found at http://freeipa.org/page/LdapUpdate # TODO # save undo files? import sys try: from optparse import OptionParser from ipaserver import ipaldap from ipa import entity, ipaerror, ipautil, config from ipaserver import installutils from ipaserver.ldapupdate import LDAPUpdate, BadSyntax, UPDATES_DIR import ldap import logging import re import krbV import platform import shlex import time import random except ImportError: print >> sys.stderr, """\ There was a problem importing one of the required Python modules. The error was: %s """ % sys.exc_value sys.exit(1) def parse_options(): usage = "%prog [options] input_file(s)\n" usage += "%prog [options]\n" parser = OptionParser(usage=usage, formatter=config.IPAFormatter()) parser.add_option("-d", "--debug", action="store_true", dest="debug", help="Display debugging information about the update(s)") parser.add_option("-t", "--test", action="store_true", dest="test", help="Run through the update without changing anything") parser.add_option("-y", dest="password", help="File containing the Directory Manager password") config.add_standard_options(parser) options, args = parser.parse_args() config.init_config(options) return options, args def get_dirman_password(): """Prompt the user for the Directory Manager password and verify its correctness. """ password = installutils.read_password("Directory Manager", confirm=False, validate=False) return password def main(): loglevel = logging.INFO options, args = parse_options() if options.debug: loglevel = logging.DEBUG logging.basicConfig(level=loglevel, format='%(levelname)s %(message)s') dirman_password = "" if options.password: pw = read_file(options.password) dirman_password = pw[0].strip() else: dirman_password = get_dirman_password() ld = LDAPUpdate(dm_password=dirman_password, sub_dict={}, live_run=not options.test) files=[] if len(args) < 1: files = ld.get_all_files(UPDATES_DIR) else: files = args modified = ld.update(files) if modified and options.test: return 2 else: return 0 try: if __name__ == "__main__": sys.exit(main()) except BadSyntax, e: print "There is a syntax error in this update file:" print " %s" % e sys.exit(1) except RuntimeError, e: print "%s" % e sys.exit(1) except SystemExit, e: sys.exit(e) except KeyboardInterrupt, e: sys.exit(1) except config.IPAConfigError, e: print "An IPA server to update cannot be found. Has one been configured yet?" print "The error was: %s" % e sys.exit(1)