summaryrefslogtreecommitdiffstats
path: root/ipaserver
diff options
context:
space:
mode:
Diffstat (limited to 'ipaserver')
-rw-r--r--ipaserver/install/installutils.py130
-rw-r--r--ipaserver/install/ldapupdate.py5
2 files changed, 133 insertions, 2 deletions
diff --git a/ipaserver/install/installutils.py b/ipaserver/install/installutils.py
index 362723614..313761777 100644
--- a/ipaserver/install/installutils.py
+++ b/ipaserver/install/installutils.py
@@ -30,13 +30,18 @@ import netaddr
import time
import tempfile
import shutil
+from ConfigParser import SafeConfigParser
+import traceback
+
from dns import resolver, rdatatype
from dns.exception import DNSException
+import ldap
-from ConfigParser import SafeConfigParser
from ipapython import ipautil, sysrestore
from ipapython.ipa_log_manager import *
from ipalib.util import validate_hostname
+from ipapython import config
+from ipalib import errors
# Used to determine install status
IPA_MODULES = ['httpd', 'kadmin', 'dirsrv', 'pki-cad', 'pkids', 'install', 'krb5kdc', 'ntpd', 'named', 'ipa_memcached']
@@ -56,6 +61,18 @@ class HostReverseLookupError(HostLookupError):
class HostnameLocalhost(HostLookupError):
pass
+
+class ScriptError(StandardError):
+ """An exception that records an error message and a return value
+ """
+ def __init__(self, msg = '', rval = 1):
+ self.msg = msg
+ self.rval = rval
+
+ def __str__(self):
+ return self.msg
+
+
class ReplicaConfig:
def __init__(self):
self.realm_name = ""
@@ -655,3 +672,114 @@ def is_ipa_configured():
root_logger.debug('filestore is tracking no files')
return installed
+
+
+def run_script(main_function, operation_name, log_file_name=None,
+ fail_message=None):
+ """Run the given function as a command-line utility
+
+ This function:
+
+ - Runs the given function
+ - Formats any errors
+ - Exits with the appropriate code
+
+ :param main_function: Function to call
+ :param log_file_name: Name of the log file (displayed on unexpected errors)
+ :param operation_name: Name of the script
+ :param fail_message: Optional message displayed on failure
+ """
+
+ root_logger.info('Starting script: %s', operation_name)
+ try:
+ try:
+ return_value = main_function()
+ except BaseException, e:
+ if isinstance(e, SystemExit) and (e.code is None or e.code == 0):
+ # Not an error after all
+ root_logger.info('The %s command was successful',
+ operation_name)
+ else:
+ # Log at the INFO level, which is not output to the console
+ # (unless in debug/verbose mode), but is written to a logfile
+ # if one is open.
+ tb = sys.exc_info()[2]
+ root_logger.info('\n'.join(traceback.format_tb(tb)))
+ root_logger.info('The %s command failed, exception: %s: %s',
+ operation_name, type(e).__name__, e)
+ exception = e
+ if fail_message and not isinstance(e, SystemExit):
+ print fail_message
+ raise
+ else:
+ if return_value:
+ root_logger.info('The %s command failed, return value %s',
+ operation_name, return_value)
+ else:
+ root_logger.info('The %s command was successful',
+ operation_name)
+ sys.exit(return_value)
+
+ except BaseException, error:
+ handle_error(error, log_file_name)
+
+
+def handle_error(error, log_file_name=None):
+ """Handle specific errors"""
+
+ if isinstance(error, SystemExit):
+ sys.exit(error)
+ if isinstance(error, RuntimeError):
+ sys.exit(error)
+ if isinstance(error, KeyboardInterrupt):
+ print >> sys.stderr, "Cancelled."
+ sys.exit(1)
+
+ if isinstance(error, ScriptError):
+ if error.msg:
+ print >> sys.stderr, error.msg
+ sys.exit(error.rval)
+
+ if isinstance(error, socket.error):
+ print >> sys.stderr, error
+ sys.exit(1)
+
+ if isinstance(error, ldap.INVALID_CREDENTIALS):
+ print >> sys.stderr, "Invalid password"
+ sys.exit(1)
+ if isinstance(error, ldap.INSUFFICIENT_ACCESS):
+ print >> sys.stderr, "Insufficient access"
+ sys.exit(1)
+ if isinstance(error, ldap.LOCAL_ERROR):
+ print >> sys.stderr, error.args[0]['info']
+ sys.exit(1)
+ if isinstance(error, ldap.SERVER_DOWN):
+ print >> sys.stderr, error.args[0]['desc']
+ sys.exit(1)
+ if isinstance(error, ldap.LDAPError):
+ print >> sys.stderr, 'LDAP error: %s' % type(error).__name__
+ print >> sys.stderr, error.args[0]['info']
+ sys.exit(1)
+
+ if isinstance(error, config.IPAConfigError):
+ print >> sys.stderr, "An IPA server to update cannot be found. Has one been configured yet?"
+ print >> sys.stderr, "The error was: %s" % error
+ sys.exit(1)
+ if isinstance(error, errors.LDAPError):
+ print >> sys.stderr, "An error occurred while performing operations: %s" % error
+ sys.exit(1)
+
+ if isinstance(error, HostnameLocalhost):
+ print >> sys.stderr, "The hostname resolves to the localhost address (127.0.0.1/::1)"
+ print >> sys.stderr, "Please change your /etc/hosts file so that the hostname"
+ print >> sys.stderr, "resolves to the ip address of your network interface."
+ print >> sys.stderr, ""
+ print >> sys.stderr, "Please fix your /etc/hosts file and restart the setup program"
+ sys.exit(1)
+
+ if log_file_name:
+ print >> sys.stderr, "Unexpected error - see %s for details:" % log_file_name
+ else:
+ print >> sys.stderr, "Unexpected error"
+ print >> sys.stderr, '%s: %s' % (type(error).__name__, error)
+ sys.exit(1)
diff --git a/ipaserver/install/ldapupdate.py b/ipaserver/install/ldapupdate.py
index 61a2ae19f..e75ee804a 100644
--- a/ipaserver/install/ldapupdate.py
+++ b/ipaserver/install/ldapupdate.py
@@ -47,9 +47,12 @@ import inspect
from ipaserver.install.plugins import PRE_UPDATE, POST_UPDATE
from ipaserver.install.plugins import FIRST, MIDDLE, LAST
-class BadSyntax(Exception):
+class BadSyntax(installutils.ScriptError):
def __init__(self, value):
self.value = value
+ self.msg = "There is a syntax error in this update file: \n %s" % value
+ self.rval = 1
+
def __str__(self):
return repr(self.value)