/usr/lib/python3/dist-packages/lib389/paths.py is in python3-lib389 1.3.7.10-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | # --- BEGIN COPYRIGHT BLOCK ---
# Copyright (C) 2016 Red Hat, Inc.
# All rights reserved.
#
# License: GPL (version 3 or any later version).
# See LICENSE for details.
# --- END COPYRIGHT BLOCK ---
import sys
import os
from lib389._constants import DIRSRV_STATE_ONLINE
MAJOR, MINOR, _, _, _ = sys.version_info
if MAJOR >= 3:
import configparser
else:
import ConfigParser as configparser
# Read the paths from default.inf
# Create a lazy eval class for paths. When we first access, we re-read
# the inf. This way, if we never request a path, we never need to read
# this file. IE remote installs, we shouldn't need to read this.
# Could this actually become a defaults module, and merge with instance/options?
# Would it handle the versioning requirements and diff we need?
DEFAULTS_PATH = [
'/usr/share/dirsrv/inf/defaults.inf',
'/usr/local/share/dirsrv/inf/defaults.inf',
'/opt/dirsrv/share/dirsrv/inf/defaults.inf',
'/opt/local/share/dirsrv/inf/defaults.inf',
'/opt/share/dirsrv/inf/defaults.inf',
]
MUST = [
'product',
'version',
'user',
'group',
'root_dn',
'prefix',
'bin_dir',
'sbin_dir',
'lib_dir',
'data_dir',
'tmp_dir',
'sysconf_dir',
'config_dir',
'schema_dir',
'cert_dir',
'local_state_dir',
'run_dir',
'lock_dir',
'log_dir',
'inst_dir',
'db_dir',
'backup_dir',
'ldif_dir',
'initconfig_dir',
]
# will need to add the access, error, audit log later.
# This maps a config to (entry, attr).
# This can be used online, or while the server is offline and we can parse dse.ldif
CONFIG_MAP = {
'user' : ('cn=config', 'nsslapd-localuser'),
'group' : ('cn=config','nsslapd-localuser'), # Is this correct?
'schema_dir' : ('cn=config','nsslapd-schemadir'),
'cert_dir' : ('cn=config','nsslapd-certdir'),
'lock_dir' : ('cn=config','nsslapd-lockdir'),
'inst_dir' : ('cn=config','nsslapd-instancedir'),
'db_dir' : ('cn=config,cn=ldbm database,cn=plugins,cn=config', 'nsslapd-directory'),
'backup_dir': ('cn=config','nsslapd-bakdir'),
'ldif_dir': ('cn=config','nsslapd-ldifdir'),
'error_log' : ('cn=config', 'nsslapd-errorlog'),
'access_log' : ('cn=config', 'nsslapd-accesslog'),
'audit_log' : ('cn=config', 'nsslapd-auditlog'),
}
SECTION = 'slapd'
class Paths(object):
def __init__(self, serverid=None, instance=None):
"""
Parses and uses a set of default paths from wellknown locations. The list
of keys available is from the MUST attribute in this module.
To use this module:
p = Paths()
p.bindir
If the defaults.inf is NOT in a wellknown path, this will throw IOError
on the first attribute access. If this does not have a value defaults.inf
it will raise KeyError that the defaults.inf is not capable of supporting
this tool.
This is lazy evaluated, so the file is read at the "last minute" then
the contents are cached. This means that remote tools that don't need
to know about paths, shouldn't need to have a copy of 389-ds-base
installed to remotely admin a server.
"""
self._defaults_cached = False
self._config = None
self._serverid = serverid
self._instance = instance
def _get_defaults_loc(self, search_paths):
## THIS IS HOW WE HANDLE A PREFIX INSTALL
prefix = os.getenv('PREFIX')
if prefix is not None:
spath = os.path.join(prefix, 'share/dirsrv/inf/defaults.inf')
if os.path.isfile(spath):
return spath
else:
raise IOError('defaults.inf not found in prefixed location %s' % spath)
for spath in search_paths:
if os.path.isfile(spath):
return spath
raise IOError('defaults.inf not found in any wellknown location!')
def _read_defaults(self):
spath = self._get_defaults_loc(DEFAULTS_PATH)
self._config = configparser.SafeConfigParser()
self._config.read([spath])
self._defaults_cached = True
def _validate_defaults(self):
if self._defaults_cached is False:
return False
for k in MUST:
if self._config.has_option(SECTION, k) is False:
raise KeyError('Invalid defaults.inf, missing key %s' % k)
return True
def __getattr__(self, name):
from lib389.utils import ensure_str
if self._defaults_cached is False:
self._read_defaults()
self._validate_defaults()
# Are we online? Is our key in the config map?
if name in CONFIG_MAP and self._instance is not None and self._instance.state == DIRSRV_STATE_ONLINE:
# Get the online value.
(dn, attr) = CONFIG_MAP[name]
ent = self._instance.getEntry(dn, attrlist=[attr,])
return ensure_str(ent.getValue(attr))
elif self._serverid is not None:
return ensure_str(self._config.get(SECTION, name).format(instance_name=self._serverid))
else:
return ensure_str(self._config.get(SECTION, name))
@property
def asan_enabled(self):
if self._defaults_cached is False:
self._read_defaults()
self._validate_defaults()
if self._config.has_option(SECTION, 'asan_enabled'):
if self._config.get(SECTION, 'asan_enabled') == '1':
return True
return False
@property
def with_systemd(self):
if self._defaults_cached is False:
self._read_defaults()
self._validate_defaults()
if self._config.has_option(SECTION, 'with_systemd'):
if self._config.get(SECTION, 'with_systemd') == '1':
return True
return False
@property
def perl_enabled(self):
if self._defaults_cached is False:
self._read_defaults()
self._validate_defaults()
if self._config.has_option(SECTION, 'enable_perl'):
if self._config.get(SECTION, 'enable_perl') == 'no':
return False
return True
|