mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
5cf3b7a1e3
This implements the type of fcntl locking that the recovery lock uses. The intent is to use it for multiple locks and allow the choice of helper to be configured. Signed-off-by: Martin Schwenke <martin@meltin.net> Reviewed-by: Amitay Isaacs <amitay@gmail.com>
893 lines
35 KiB
Python
Executable File
893 lines
35 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
APPNAME = 'ctdb'
|
|
|
|
blddir = 'bin'
|
|
|
|
import sys, os
|
|
|
|
# find the buildtools directory
|
|
srcdir = '.'
|
|
while not os.path.exists(srcdir+'/buildtools') and len(srcdir.split('/')) < 5:
|
|
srcdir = srcdir + '/..'
|
|
sys.path.insert(0, srcdir + '/buildtools/wafsamba')
|
|
|
|
import wafsamba, samba_dist, Options, Logs, Utils
|
|
import samba_utils, samba_version
|
|
|
|
env = samba_utils.LOAD_ENVIRONMENT()
|
|
if os.path.isfile('./VERSION'):
|
|
vdir = '.'
|
|
elif os.path.isfile('../VERSION'):
|
|
vdir = '..'
|
|
else:
|
|
Logs.error("VERSION file not found")
|
|
|
|
version = samba_version.samba_version_file('%s/VERSION' % vdir, vdir, env)
|
|
VERSION = version.STRING.replace('-', '.')
|
|
|
|
default_prefix = Options.default_prefix = '/usr/local'
|
|
|
|
samba_dist.DIST_DIRS('''ctdb:. lib/replace:lib/replace lib/talloc:lib/talloc
|
|
lib/tevent:lib/tevent lib/tdb:lib/tdb
|
|
lib/socket_wrapper:lib/socket_wrapper
|
|
third_party/popt:third_party/popt
|
|
lib/util:lib/util lib/tdb_wrap:lib/tdb_wrap
|
|
lib/ccan:lib/ccan libcli/util:libcli/util
|
|
buildtools:buildtools third_party/waf:third_party/waf''')
|
|
|
|
manpages = [
|
|
'ctdb.1',
|
|
'ctdb.7',
|
|
'ctdbd.1',
|
|
'ctdbd.conf.5',
|
|
'ctdbd_wrapper.1',
|
|
'ctdb-statistics.7',
|
|
'ctdb-tunables.7',
|
|
'ltdbtool.1',
|
|
'onnode.1',
|
|
'ping_pong.1'
|
|
]
|
|
|
|
|
|
def set_options(opt):
|
|
opt.PRIVATE_EXTENSION_DEFAULT('ctdb')
|
|
|
|
opt.RECURSE('lib/replace')
|
|
|
|
opt.RECURSE('lib/util')
|
|
|
|
opt.RECURSE('lib/talloc')
|
|
opt.RECURSE('lib/tevent')
|
|
opt.RECURSE('lib/tdb')
|
|
|
|
opt.add_option('--enable-infiniband',
|
|
help=("Turn on infiniband support (default=no)"),
|
|
action="store_true", dest='ctdb_infiniband', default=False)
|
|
opt.add_option('--enable-pmda',
|
|
help=("Turn on PCP pmda support (default=no)"),
|
|
action="store_true", dest='ctdb_pmda', default=False)
|
|
|
|
opt.add_option('--with-logdir',
|
|
help=("Path to log directory"),
|
|
action="store", dest='ctdb_logdir', default=None)
|
|
opt.add_option('--with-socketpath',
|
|
help=("path to CTDB daemon socket"),
|
|
action="store", dest='ctdb_sockpath', default=None)
|
|
|
|
|
|
def configure(conf):
|
|
|
|
# No need to build python bindings for talloc/tevent/tdb
|
|
if conf.IN_LAUNCH_DIR():
|
|
conf.env.standalone_ctdb = True
|
|
Options.options.disable_python = True
|
|
|
|
conf.RECURSE('lib/replace')
|
|
|
|
if conf.env.standalone_ctdb:
|
|
conf.SAMBA_CHECK_PERL(mandatory=True)
|
|
|
|
conf.SAMBA_CHECK_PYTHON(mandatory=True, version=(2,5,0))
|
|
conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=True)
|
|
|
|
if conf.CHECK_FOR_THIRD_PARTY():
|
|
conf.RECURSE('third_party/popt')
|
|
else:
|
|
if not conf.CHECK_POPT():
|
|
raise Utils.WafError('popt development packages have not been found\nIf third_party is installed, check that it is in the proper place.')
|
|
else:
|
|
conf.define('USING_SYSTEM_POPT', 1)
|
|
|
|
conf.RECURSE('lib/util')
|
|
|
|
conf.RECURSE('lib/talloc')
|
|
conf.RECURSE('lib/tevent')
|
|
conf.RECURSE('lib/tdb')
|
|
if conf.env.standalone_ctdb or conf.CONFIG_GET('ENABLE_SELFTEST'):
|
|
conf.RECURSE('lib/socket_wrapper')
|
|
|
|
conf.CHECK_HEADERS('sched.h')
|
|
conf.CHECK_HEADERS('procinfo.h')
|
|
if sys.platform.startswith('aix') and not conf.CHECK_FUNCS('thread_setsched'):
|
|
Logs.error('Need thread_setsched() on AIX')
|
|
sys.exit(1)
|
|
elif not conf.CHECK_FUNCS('sched_setscheduler'):
|
|
Logs.error('Need sched_setscheduler()')
|
|
sys.exit(1)
|
|
conf.CHECK_FUNCS('mlockall')
|
|
|
|
if not conf.CHECK_VARIABLE('ETIME', headers='errno.h'):
|
|
conf.DEFINE('ETIME', 'ETIMEDOUT')
|
|
|
|
if sys.platform.startswith('linux'):
|
|
conf.SET_TARGET_TYPE('pcap', 'EMPTY')
|
|
else:
|
|
if not conf.CHECK_HEADERS('pcap.h'):
|
|
Logs.error('Need libpcap')
|
|
sys.exit(1)
|
|
if not conf.CHECK_FUNCS_IN('pcap_open_live', 'pcap', headers='pcap.h'):
|
|
Logs.error('Need libpcap')
|
|
sys.exit(1)
|
|
|
|
if not conf.CHECK_FUNCS_IN('backtrace backtrace_symbols', 'execinfo',
|
|
checklibc=True, headers='execinfo.h'):
|
|
Logs.error('backtrace support not available')
|
|
|
|
have_pmda = False
|
|
if Options.options.ctdb_pmda:
|
|
pmda_support = True
|
|
|
|
if not conf.CHECK_HEADERS('pcp/pmapi.h pcp/impl.h pcp/pmda.h',
|
|
together=True):
|
|
pmda_support = False
|
|
if not conf.CHECK_FUNCS_IN('pmProgname', 'pcp'):
|
|
pmda_support = False
|
|
if not conf.CHECK_FUNCS_IN('pmdaDaemon', 'pcp_pmda'):
|
|
pmda_support = False
|
|
if pmda_support:
|
|
have_pmda = True
|
|
else:
|
|
Logs.error("PMDA support not available")
|
|
if have_pmda:
|
|
Logs.info('Building with PMDA support')
|
|
conf.define('HAVE_PMDA', 1)
|
|
conf.env.CTDB_PMDADIR = os.path.join(conf.env.LOCALSTATEDIR,
|
|
'lib/pcp/pmdas/ctdb')
|
|
|
|
have_infiniband = False
|
|
if Options.options.ctdb_infiniband:
|
|
ib_support = True
|
|
|
|
if not conf.CHECK_HEADERS('infiniband/verbs.h rdma/rdma_cma.h'):
|
|
ib_support = False
|
|
if not conf.CHECK_FUNCS_IN('ibv_create_qp', 'ibverbs'):
|
|
ib_support = False
|
|
if not conf.CHECK_FUNCS_IN('rdma_connect', 'rdmacm'):
|
|
ib_support = False
|
|
if ib_support:
|
|
have_infiniband = True
|
|
else:
|
|
Logs.error("Infiniband support not available")
|
|
if have_infiniband:
|
|
Logs.info('Building with Infiniband support')
|
|
conf.define('HAVE_INFINIBAND', 1)
|
|
conf.define('USE_INFINIBAND', 1)
|
|
|
|
conf.env.CTDB_BINDIR = os.path.join(conf.env.EXEC_PREFIX, 'bin')
|
|
conf.env.CTDB_ETCDIR = os.path.join(conf.env.SYSCONFDIR, 'ctdb')
|
|
conf.env.CTDB_VARDIR = os.path.join(conf.env.LOCALSTATEDIR, 'lib/ctdb')
|
|
conf.env.CTDB_RUNDIR = os.path.join(conf.env.LOCALSTATEDIR, 'run/ctdb')
|
|
conf.env.CTDB_HELPER_BINDIR = os.path.join(conf.env.LIBEXECDIR, 'ctdb')
|
|
|
|
if Options.options.ctdb_logdir:
|
|
conf.env.CTDB_LOGDIR = Options.options.ctdb_logdir
|
|
else:
|
|
conf.env.CTDB_LOGDIR = os.path.join(conf.env.LOCALSTATEDIR, 'log')
|
|
|
|
if Options.options.ctdb_sockpath:
|
|
conf.env.CTDB_SOCKPATH = Options.options.ctdb_sockpath
|
|
else:
|
|
conf.env.CTDB_SOCKPATH = os.path.join(conf.env.CTDB_RUNDIR,
|
|
'ctdbd.socket')
|
|
conf.define('CTDB_SOCKET', conf.env.CTDB_SOCKPATH)
|
|
|
|
conf.ADD_CFLAGS('''-DCTDB_HELPER_BINDIR=\"%s\"
|
|
-DLOGDIR=\"%s\"
|
|
-DCTDB_ETCDIR=\"%s\"
|
|
-DCTDB_VARDIR=\"%s\"
|
|
-DCTDB_RUNDIR=\"%s\"''' % (
|
|
conf.env.CTDB_HELPER_BINDIR,
|
|
conf.env.CTDB_LOGDIR,
|
|
conf.env.CTDB_ETCDIR,
|
|
conf.env.CTDB_VARDIR,
|
|
conf.env.CTDB_RUNDIR))
|
|
|
|
conf.env.CTDB_TEST_DATADIR = os.path.join(conf.env.EXEC_PREFIX,
|
|
'share/ctdb-tests')
|
|
conf.env.CTDB_TEST_LIBDIR = os.path.join(conf.env.LIBDIR, 'ctdb-tests')
|
|
|
|
# Allow unified compilation and separate compilation of utilities
|
|
# to find includes
|
|
if not conf.env.standalone_ctdb:
|
|
conf.ADD_EXTRA_INCLUDES('#include/public #ctdb/include #ctdb')
|
|
else:
|
|
if srcdir == '.':
|
|
# Building from tarball
|
|
conf.ADD_EXTRA_INCLUDES('#include')
|
|
else:
|
|
# Building standalone CTDB from within Samba tree
|
|
conf.ADD_EXTRA_INCLUDES('#ctdb/include')
|
|
conf.ADD_EXTRA_INCLUDES('#ctdb')
|
|
conf.ADD_EXTRA_INCLUDES('#lib #lib/replace')
|
|
|
|
conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True)
|
|
conf.DEFINE('SAMBA_UTIL_CORE_ONLY', 1, add_to_cflags=True)
|
|
conf.SAMBA_CONFIG_H()
|
|
|
|
if 'XSLTPROC_MANPAGES' in conf.env and conf.env['XSLTPROC_MANPAGES']:
|
|
conf.env.ctdb_generate_manpages = True
|
|
else:
|
|
conf.env.ctdb_generate_manpages = False
|
|
|
|
Logs.info("xsltproc unavailable, checking for pre-built manpages")
|
|
conf.env.ctdb_prebuilt_manpages = []
|
|
for m in manpages:
|
|
if os.path.exists(os.path.join("doc", m)):
|
|
Logs.info(" %s: yes" % (m))
|
|
conf.env.ctdb_prebuilt_manpages.append(m)
|
|
else:
|
|
Logs.info(" %s: no" % (m))
|
|
|
|
def build(bld):
|
|
if bld.env.standalone_ctdb:
|
|
# enable building of public headers in the build tree
|
|
bld.env.build_public_headers = 'include/public'
|
|
|
|
version_h = samba_utils.os_path_relpath(os.path.join(Options.launch_dir,
|
|
"version.h"),
|
|
bld.curdir)
|
|
|
|
if bld.env.standalone_ctdb:
|
|
ctdb_mkversion = '../packaging/mkversion.sh'
|
|
t = bld.SAMBA_GENERATOR('ctdb-version-header',
|
|
target='include/ctdb_version.h',
|
|
rule='%s ${TGT} %s' % (ctdb_mkversion, VERSION),
|
|
dep_vars=['VERSION'])
|
|
t.env.VERSION = VERSION
|
|
|
|
t = bld.SAMBA_GENERATOR('ctdb-samba-version-header',
|
|
target=version_h,
|
|
rule='printf "#include \\"ctdb_version.h\\" \\n#define SAMBA_VERSION_STRING CTDB_VERSION_STRING\\n" > ${TGT}',
|
|
dep_vars=['VERSION'])
|
|
t.env.VERSION = VERSION
|
|
else:
|
|
t = bld.SAMBA_GENERATOR('ctdb-samba-version-header',
|
|
target='include/ctdb_version.h',
|
|
rule='printf "#include \\"%s\\" \\n#define CTDB_VERSION_STRING SAMBA_VERSION_STRING\\n" > ${TGT}' % version_h,
|
|
dep_vars=['VERSION'])
|
|
t.env.VERSION = VERSION
|
|
|
|
bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
|
|
|
|
bld.RECURSE('lib/replace')
|
|
if bld.CHECK_FOR_THIRD_PARTY():
|
|
bld.RECURSE('third_party/popt')
|
|
|
|
bld.RECURSE('lib/tdb_wrap')
|
|
bld.RECURSE('lib/util')
|
|
|
|
bld.RECURSE('lib/talloc')
|
|
bld.RECURSE('lib/tevent')
|
|
bld.RECURSE('lib/tdb')
|
|
if bld.env.standalone_ctdb or bld.CONFIG_GET('SOCKET_WRAPPER'):
|
|
bld.RECURSE('lib/socket_wrapper')
|
|
|
|
if bld.env.standalone_ctdb:
|
|
# If a combined build is implemented, CTDB will want to
|
|
# build against samba-util rather than samba-util-core.
|
|
# Similarly, other Samba subsystems expect samba-util. So,
|
|
# for a standalone build, just define a fake samba-util
|
|
# subsystem that pulls in samba-util-core.
|
|
bld.SAMBA_SUBSYSTEM('samba-util',
|
|
source='',
|
|
deps='samba-util-core')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-tcp',
|
|
source=bld.SUBDIR('tcp',
|
|
'tcp_connect.c tcp_init.c tcp_io.c'),
|
|
includes='include',
|
|
deps='replace tdb talloc tevent')
|
|
|
|
ib_deps = ''
|
|
if bld.env.HAVE_INFINIBAND:
|
|
bld.SAMBA_SUBSYSTEM('ctdb-ib',
|
|
source=bld.SUBDIR('ib',
|
|
'''ibwrapper.c ibw_ctdb.c
|
|
ibw_ctdb_init.c'''),
|
|
includes='include',
|
|
deps='replace talloc tevent tdb')
|
|
ib_deps = ' ctdb-ib rdmacm ibverbs'
|
|
|
|
if sys.platform.startswith('linux'):
|
|
CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_linux.c')
|
|
elif sys.platform.startswith('aix'):
|
|
CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_aix.c')
|
|
elif sys.platform.startswith('freebsd'):
|
|
CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_freebsd.c')
|
|
elif sys.platform.startswith('gnukfreebsd'):
|
|
CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_kfreebsd.c')
|
|
elif sys.platform == 'gnu':
|
|
CTDB_SYSTEM_SRC = bld.SUBDIR('common', 'system_gnu.c')
|
|
else:
|
|
Logs.error("Platform %s not supported" % sys.platform)
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-system',
|
|
source=bld.SUBDIR('common',
|
|
'system_common.c system_util.c') +
|
|
CTDB_SYSTEM_SRC,
|
|
includes='include',
|
|
deps='replace talloc tevent tdb pcap samba-util')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-common',
|
|
source=bld.SUBDIR('common',
|
|
'''ctdb_io.c ctdb_util.c ctdb_ltdb.c
|
|
cmdline.c'''),
|
|
includes='include',
|
|
deps='replace popt talloc tevent tdb popt ctdb-system')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-util',
|
|
source=bld.SUBDIR('common',
|
|
'''db_hash.c srvid.c reqid.c
|
|
pkt_read.c pkt_write.c comm.c
|
|
logging.c rb_tree.c'''),
|
|
deps='replace talloc tevent tdb tevent-unix-util')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-protocol',
|
|
source=bld.SUBDIR('protocol',
|
|
'''protocol_header.c protocol_packet.c
|
|
protocol_types.c protocol_call.c
|
|
protocol_message.c
|
|
protocol_control.c
|
|
protocol_client.c
|
|
protocol_debug.c
|
|
protocol_util.c'''),
|
|
includes='include',
|
|
deps='replace talloc tdb')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-client',
|
|
source=bld.SUBDIR('client', 'ctdb_client.c'),
|
|
includes='include',
|
|
deps='''replace popt talloc tevent tdb
|
|
samba-util tdb-wrap ctdb-util''')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-client2',
|
|
source=bld.SUBDIR('client',
|
|
'''client_connect.c client_call.c
|
|
client_message.c client_control.c
|
|
client_message_sync.c
|
|
client_control_sync.c
|
|
client_db.c client_util.c
|
|
'''),
|
|
includes='include',
|
|
deps='replace talloc tevent tdb tdb-wrap')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-ipalloc',
|
|
source=bld.SUBDIR('server',
|
|
'''ipalloc_deterministic.c
|
|
ipalloc_nondeterministic.c
|
|
ipalloc_lcp2.c
|
|
ipalloc_common.c
|
|
ipalloc.c
|
|
'''),
|
|
includes='include',
|
|
deps='ctdb-protocol replace talloc tevent')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-server',
|
|
source='server/ctdbd.c ' +
|
|
bld.SUBDIR('server',
|
|
'''ctdb_daemon.c ctdb_recoverd.c
|
|
ctdb_recover.c ctdb_freeze.c
|
|
ctdb_tunables.c ctdb_monitor.c
|
|
ctdb_server.c ctdb_control.c
|
|
ctdb_call.c ctdb_ltdb_server.c
|
|
ctdb_traverse.c eventscript.c
|
|
ctdb_takeover.c
|
|
ctdb_persistent.c ctdb_keepalive.c
|
|
ctdb_logging.c
|
|
ctdb_logging_syslog.c
|
|
ctdb_logging_file.c
|
|
ctdb_uptime.c
|
|
ctdb_vacuum.c ctdb_banning.c
|
|
ctdb_statistics.c
|
|
ctdb_update_record.c
|
|
ctdb_lock.c ctdb_fork.c'''),
|
|
includes='include',
|
|
deps='ctdb-ipalloc replace popt talloc tevent tdb talloc_report')
|
|
|
|
bld.SAMBA_BINARY('ctdbd',
|
|
source='',
|
|
deps='''ctdb-server ctdb-client ctdb-common
|
|
ctdb-system ctdb-tcp ctdb-util''' +
|
|
ib_deps,
|
|
install_path='${SBINDIR}',
|
|
manpages='ctdbd.1')
|
|
|
|
bld.SAMBA_BINARY('ctdb',
|
|
source='tools/ctdb.c',
|
|
deps='ctdb-client ctdb-common ctdb-system ctdb-util',
|
|
includes='include',
|
|
install_path='${BINDIR}',
|
|
manpages='ctdb.1')
|
|
|
|
bld.SAMBA_BINARY('ctdb_killtcp',
|
|
source='tools/ctdb_killtcp.c',
|
|
deps='''ctdb-protocol ctdb-util ctdb-system
|
|
samba-util replace''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ltdbtool',
|
|
source='tools/ltdbtool.c',
|
|
includes='include',
|
|
deps='tdb',
|
|
install_path='${BINDIR}',
|
|
manpages='ltdbtool.1')
|
|
|
|
bld.SAMBA_BINARY('ctdb_lock_helper',
|
|
source='server/ctdb_lock_helper.c',
|
|
deps='samba-util ctdb-system talloc tdb',
|
|
includes='include',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_event_helper',
|
|
source='server/ctdb_event_helper.c',
|
|
includes='include',
|
|
deps='samba-util ctdb-system replace tdb',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_recovery_helper',
|
|
source='server/ctdb_recovery_helper.c',
|
|
deps='''ctdb-client2 ctdb-protocol ctdb-util
|
|
samba-util replace tdb''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_mutex_fcntl_helper',
|
|
source='server/ctdb_mutex_fcntl_helper.c',
|
|
deps='ctdb-system',
|
|
includes='include',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-smnotify-h',
|
|
source='utils/smnotify/smnotify.x',
|
|
target='utils/smnotify/smnotify.h',
|
|
rule='rpcgen -h ${SRC} > ${TGT}')
|
|
|
|
xdr_buf_hack = 'sed -e "s@^\([ \t]*register int32_t \*buf\);@\\1 = buf;@"'
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-smnotify-x',
|
|
source='utils/smnotify/smnotify.x',
|
|
target='utils/smnotify/gen_xdr.c',
|
|
rule='rpcgen -c ${SRC} | ' + xdr_buf_hack + ' > ${TGT}')
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-smnotify-c',
|
|
source='utils/smnotify/smnotify.x',
|
|
target='utils/smnotify/gen_smnotify.c',
|
|
rule='rpcgen -l ${SRC} > ${TGT}')
|
|
|
|
bld.SAMBA_BINARY('smnotify',
|
|
source=bld.SUBDIR('utils/smnotify',
|
|
'smnotify.c gen_smnotify.c gen_xdr.c'),
|
|
deps='ctdb-smnotify-h ctdb-smnotify-c ctdb-smnotify-x popt',
|
|
includes='utils utils/smnotify',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ping_pong',
|
|
source='utils/ping_pong/ping_pong.c',
|
|
deps='',
|
|
install_path='${BINDIR}',
|
|
manpages='ping_pong.1')
|
|
|
|
if bld.env.HAVE_PMDA:
|
|
bld.SAMBA_BINARY('pmdactdb',
|
|
source='utils/pmda/pmda_ctdb.c',
|
|
includes='include',
|
|
deps='ctdb-client ctdb-common pcp_pmda pcp',
|
|
install_path='${CTDB_PMDADIR}')
|
|
bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/Install',
|
|
destname='Install')
|
|
bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/Remove',
|
|
destname='Remove')
|
|
bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/pmns',
|
|
destname='pmns')
|
|
bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/domain.h',
|
|
destname='domain.h')
|
|
bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/help',
|
|
destname='help')
|
|
bld.INSTALL_FILES('${CTDB_PMDADIR}', 'utils/pmda/README',
|
|
destname='README')
|
|
|
|
sed_expr1 = 's|/usr/local/var/lib/ctdb|%s|g' % (bld.env.CTDB_VARDIR)
|
|
sed_expr2 = 's|/usr/local/etc/ctdb|%s|g' % (bld.env.CTDB_ETCDIR)
|
|
sed_expr3 = 's|/usr/local/var/log|%s|g' % (bld.env.CTDB_LOGDIR)
|
|
sed_expr4 = 's|/usr/local/var/run/ctdb|%s|g' % (bld.env.CTDB_RUNDIR)
|
|
sed_expr5 = 's|/usr/local/sbin|%s|g' % (bld.env.SBINDIR)
|
|
sed_expr6 = 's|/usr/local/libexec/ctdb|%s|g' % (bld.env.CTDB_HELPER_BINDIR)
|
|
sed_cmdline = '-e "%s" -e "%s" -e "%s" -e "%s" -e "%s" -e "%s"' % \
|
|
(sed_expr1, sed_expr2, sed_expr3, sed_expr4, sed_expr5,
|
|
sed_expr6)
|
|
|
|
for f in manpages:
|
|
x = '%s.xml' % (f)
|
|
bld.SAMBA_GENERATOR(x,
|
|
source=os.path.join('doc', x),
|
|
target=x,
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
|
|
if bld.env.ctdb_generate_manpages:
|
|
bld.MANPAGES('''onnode.1 ctdbd_wrapper.1 ctdbd.conf.5
|
|
ctdb.7 ctdb-statistics.7 ctdb-tunables.7''',
|
|
True)
|
|
else:
|
|
for m in bld.env.ctdb_prebuilt_manpages:
|
|
bld.SAMBA_GENERATOR(m,
|
|
source=os.path.join("doc", m),
|
|
target=m,
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${MANDIR}/man%s' % m[-1], m)
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-onnode',
|
|
source='tools/onnode',
|
|
target='onnode',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${BINDIR}', 'onnode',
|
|
destname='onnode', chmod=0755)
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-diagnostics',
|
|
source='tools/ctdb_diagnostics',
|
|
target='ctdb_diagnostics',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${BINDIR}', 'ctdb_diagnostics',
|
|
destname='ctdb_diagnostics', chmod=0755)
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-natgw',
|
|
source='tools/ctdb_natgw',
|
|
target='ctdb_natgw',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${CTDB_HELPER_BINDIR}', 'ctdb_natgw',
|
|
destname='ctdb_natgw', chmod=0755)
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-lvs',
|
|
source='tools/ctdb_lvs',
|
|
target='ctdb_lvs',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${CTDB_HELPER_BINDIR}', 'ctdb_lvs',
|
|
destname='ctdb_lvs', chmod=0755)
|
|
|
|
bld.SAMBA_GENERATOR('ctdbd-wrapper',
|
|
source='config/ctdbd_wrapper',
|
|
target='ctdbd_wrapper',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${SBINDIR}', 'ctdbd_wrapper',
|
|
destname='ctdbd_wrapper', chmod=0755)
|
|
|
|
def SUBDIR_MODE_callback(arg, dirname, fnames):
|
|
for f in fnames:
|
|
fl = os.path.join(dirname, f)
|
|
if os.path.isdir(fl) or os.path.islink(fl):
|
|
continue
|
|
mode = os.lstat(fl).st_mode & 0777
|
|
if arg['trim_path']:
|
|
fl = samba_utils.os_path_relpath(fl, arg['trim_path'])
|
|
arg['file_list'].append([fl, mode])
|
|
|
|
def SUBDIR_MODE(path, trim_path=None):
|
|
pd = {'trim_path': trim_path, 'file_list': []}
|
|
os.path.walk(path, SUBDIR_MODE_callback, pd)
|
|
return pd['file_list']
|
|
|
|
etc_subdirs = [
|
|
'events.d',
|
|
'nfs-checks.d'
|
|
]
|
|
|
|
if bld.env.standalone_ctdb:
|
|
configdir = 'config'
|
|
else:
|
|
configdir = 'ctdb/config'
|
|
|
|
for t in etc_subdirs:
|
|
files = SUBDIR_MODE('%s/%s' % (configdir, t), trim_path=configdir)
|
|
for fmode in files:
|
|
bld.INSTALL_FILES(bld.env.CTDB_ETCDIR, 'config/%s' % fmode[0],
|
|
destname=fmode[0], chmod=fmode[1])
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-functions',
|
|
source='config/functions',
|
|
target='functions',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES(bld.env.CTDB_ETCDIR, 'functions', destname='functions')
|
|
|
|
etc_scripts = [
|
|
'ctdb-crash-cleanup.sh',
|
|
'debug-hung-script.sh',
|
|
'debug_locks.sh',
|
|
'gcore_trace.sh',
|
|
'nfs-linux-kernel-callout',
|
|
'notify.sh',
|
|
'statd-callout'
|
|
]
|
|
|
|
for t in etc_scripts:
|
|
bld.INSTALL_FILES(bld.env.CTDB_ETCDIR, 'config/%s' % t,
|
|
destname=t, chmod=0755)
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-sudoers',
|
|
source='config/ctdb.sudoers',
|
|
target='ctdb.sudoers',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${SYSCONFDIR}/sudoers.d', 'ctdb.sudoers',
|
|
destname='ctdb')
|
|
|
|
bld.INSTALL_FILES('${CTDB_ETCDIR}/notify.d', 'config/notify.d.README',
|
|
destname='README')
|
|
|
|
bld.install_dir(bld.env.CTDB_LOGDIR)
|
|
bld.install_dir(bld.env.CTDB_RUNDIR)
|
|
bld.install_dir(bld.env.CTDB_VARDIR)
|
|
|
|
# Unit tests
|
|
ctdb_unit_tests = [
|
|
'db_hash_test',
|
|
'srvid_test',
|
|
'pkt_read_test',
|
|
'pkt_write_test',
|
|
'comm_test',
|
|
'comm_server_test',
|
|
'comm_client_test',
|
|
'protocol_types_test',
|
|
'protocol_client_test',
|
|
]
|
|
|
|
for target in ctdb_unit_tests:
|
|
src = 'tests/src/' + target + '.c'
|
|
|
|
bld.SAMBA_BINARY(target,
|
|
source=src,
|
|
deps='talloc tevent tdb tevent-unix-util',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
bld.SAMBA_BINARY('reqid_test',
|
|
source='tests/src/reqid_test.c',
|
|
deps='samba-util',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_packet_parse',
|
|
source='tests/src/ctdb_packet_parse.c',
|
|
deps='talloc tevent tdb ctdb-protocol',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
# Test binaries
|
|
ctdb_tests = [
|
|
'rb_test',
|
|
'ctdb_bench',
|
|
'ctdb_fetch',
|
|
'ctdb_fetch_one',
|
|
'ctdb_fetch_readonly_once',
|
|
'ctdb_fetch_readonly_loop',
|
|
'ctdb_trackingdb_test',
|
|
'ctdb_update_record',
|
|
'ctdb_update_record_persistent',
|
|
'ctdb_store',
|
|
'ctdb_traverse',
|
|
'ctdb_randrec',
|
|
'ctdb_persistent',
|
|
'ctdb_porting_tests',
|
|
'ctdb_transaction',
|
|
'ctdb_lock_tdb'
|
|
]
|
|
|
|
for target in ctdb_tests:
|
|
src = 'tests/src/' + target + '.c'
|
|
|
|
bld.SAMBA_BINARY(target,
|
|
source=src,
|
|
includes='include',
|
|
deps='ctdb-client ctdb-common ctdb-util',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_takeover_tests',
|
|
source='tests/src/ctdb_takeover_tests.c',
|
|
deps='''replace popt tdb tevent talloc ctdb-system
|
|
samba-util tdb-wrap talloc_report
|
|
ctdb-protocol ctdb-util''' +
|
|
ib_deps,
|
|
includes='include',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_functest',
|
|
source='tests/src/ctdb_functest.c',
|
|
deps='''replace tdb tevent talloc popt ctdb-system
|
|
samba-util tdb-wrap ctdb-util''',
|
|
includes='include',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_stubtest',
|
|
source='tests/src/ctdb_test.c',
|
|
deps='''replace tdb tevent talloc popt ctdb-system
|
|
samba-util tdb-wrap ctdb-util''',
|
|
includes='include',
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
if bld.env.HAVE_INFINIBAND:
|
|
bld.SAMBA_BINARY('ibwrapper_test',
|
|
source='ib/ibwrapper_test.c',
|
|
includes='include',
|
|
deps='replace talloc ctdb-client ctdb-common' +
|
|
ib_deps,
|
|
install_path='${CTDB_TEST_LIBDIR}')
|
|
|
|
test_subdirs = [
|
|
'complex',
|
|
'cunit',
|
|
'events.d',
|
|
'eventscripts',
|
|
'onnode',
|
|
'simple',
|
|
'takeover',
|
|
'tool'
|
|
]
|
|
|
|
for t in test_subdirs:
|
|
files = SUBDIR_MODE('tests/%s' % t, trim_path='tests')
|
|
for fmode in files:
|
|
bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR, 'tests/%s' % fmode[0],
|
|
destname=fmode[0], chmod=fmode[1])
|
|
|
|
# Install tests/scripts directory without test_wrap
|
|
test_scripts = [
|
|
'common.sh',
|
|
'integration.bash',
|
|
'unit.sh'
|
|
]
|
|
|
|
for t in test_scripts:
|
|
bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR,
|
|
os.path.join('tests/scripts', t),
|
|
destname=os.path.join('scripts', t))
|
|
|
|
sed_expr = 's@^TEST_SCRIPTS_DIR=.*@&\\nexport TEST_BIN_DIR=\"%s\"@' % (
|
|
bld.env.CTDB_TEST_LIBDIR)
|
|
bld.SAMBA_GENERATOR('ctdb-test-wrap',
|
|
source='tests/scripts/test_wrap',
|
|
target='test_wrap',
|
|
rule='sed -e "%s" ${SRC} > ${TGT}' % sed_expr)
|
|
bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR+"/scripts", 'test_wrap',
|
|
destname='test_wrap', chmod=0755)
|
|
|
|
sed_expr1 = 's@^test_dir=.*@test_dir=%s\\nexport TEST_BIN_DIR=\"%s\"@' % (
|
|
bld.env.CTDB_TEST_DATADIR, bld.env.CTDB_TEST_LIBDIR)
|
|
sed_expr2 = 's@^\(export CTDB_TESTS_ARE_INSTALLED\)=false@\\1=true@'
|
|
bld.SAMBA_GENERATOR('ctdb-test-runner',
|
|
source='tests/run_tests.sh',
|
|
target='ctdb_run_tests.sh',
|
|
rule='sed -e "%s" -e "%s" ${SRC} > ${TGT}' % (
|
|
sed_expr1, sed_expr2))
|
|
bld.INSTALL_FILES('${BINDIR}', 'ctdb_run_tests.sh',
|
|
destname='ctdb_run_tests', chmod=0755)
|
|
bld.symlink_as(os.path.join(bld.env.BINDIR, 'ctdb_run_cluster_tests'),
|
|
'ctdb_run_tests')
|
|
|
|
test_eventscript_links = [
|
|
'events.d',
|
|
'functions',
|
|
'nfs-checks.d',
|
|
'nfs-linux-kernel-callout',
|
|
'statd-callout'
|
|
]
|
|
|
|
test_link_dir = os.path.join(bld.env.CTDB_TEST_DATADIR,
|
|
'eventscripts/etc-ctdb')
|
|
for t in test_eventscript_links:
|
|
bld.symlink_as(os.path.join(test_link_dir, t),
|
|
os.path.join(bld.env.CTDB_ETCDIR, t))
|
|
|
|
# Tests that use onnode need to overwrite link to in-tree
|
|
# functions file when installed
|
|
bld.symlink_as(os.path.join(bld.env.CTDB_TEST_DATADIR, 'onnode/functions'),
|
|
os.path.join(bld.env.CTDB_ETCDIR, 'functions'))
|
|
bld.symlink_as(os.path.join(bld.env.CTDB_TEST_DATADIR, 'simple/functions'),
|
|
os.path.join(bld.env.CTDB_ETCDIR, 'functions'))
|
|
|
|
# Need a link to nodes file because $CTDB_BASE is overridden
|
|
bld.symlink_as(os.path.join(bld.env.CTDB_TEST_DATADIR, 'simple/nodes'),
|
|
os.path.join(bld.env.CTDB_ETCDIR, 'nodes'))
|
|
|
|
|
|
def testonly(ctx):
|
|
cmd = 'tests/run_tests.sh -V tests/var'
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('tests exited with exit status %d' % ret)
|
|
sys.exit(ret)
|
|
|
|
|
|
def test(ctx):
|
|
import Scripting
|
|
Scripting.commands.append('build')
|
|
Scripting.commands.append('testonly')
|
|
|
|
|
|
def autotest(ctx):
|
|
ld = 'LD_PRELOAD=%s/bin/shared/libsocket-wrapper.so' % os.getcwd()
|
|
cmd = '%s tests/run_tests.sh -e -S -C' % ld
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('autotest exited with exit status %d' % ret)
|
|
sys.exit(ret)
|
|
|
|
|
|
def show_version(ctx):
|
|
print VERSION
|
|
|
|
|
|
def dist():
|
|
samba_dist.DIST_FILES('VERSION:VERSION', extend=True)
|
|
|
|
t = 'include/ctdb_version.h'
|
|
cmd = 'packaging/mkversion.sh %s %s' % (t, VERSION)
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('Command "%s" failed with exit status %d' % (cmd, ret))
|
|
sys.exit(ret)
|
|
samba_dist.DIST_FILES('ctdb/%s:%s' % (t, t), extend=True)
|
|
|
|
t = 'ctdb.spec'
|
|
sed_expr1 = 's/@VERSION@/%s/g' % VERSION
|
|
sed_expr2 = 's/@RELEASE@/%s/g' % '1'
|
|
cmd = 'sed -e "%s" -e "%s" packaging/RPM/ctdb.spec.in > %s' % (
|
|
sed_expr1, sed_expr2, t)
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('Command "%s" failed with exit status %d' % (cmd, ret))
|
|
sys.exit(ret)
|
|
samba_dist.DIST_FILES('ctdb/%s:%s' % (t, t), extend=True)
|
|
|
|
cmd = 'make -C doc'
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('Command "%s" failed with exit status %d' % (cmd, ret))
|
|
sys.exit(ret)
|
|
for t in manpages:
|
|
samba_dist.DIST_FILES('ctdb/doc/%s:doc/%s' % (t, t), extend=True)
|
|
samba_dist.DIST_FILES('ctdb/doc/%s.html:doc/%s.html' % (t, t),
|
|
extend=True)
|
|
|
|
samba_dist.dist()
|
|
|
|
|
|
def rpmonly(ctx):
|
|
opts = os.getenv('RPM_OPTIONS') or ''
|
|
cmd = 'rpmbuild -ta --clean --rmsource %s ctdb-%s.tar.gz' % (opts, VERSION)
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('rpmbuild exited with exit status %d' % ret)
|
|
sys.exit(ret)
|
|
|
|
|
|
def rpm(ctx):
|
|
import Scripting
|
|
Scripting.commands.append('dist')
|
|
Scripting.commands.append('rpmonly')
|
|
|
|
|
|
def ctags(ctx):
|
|
"build 'tags' file using ctags"
|
|
import Utils
|
|
source_root = os.path.dirname(Utils.g_module.root_path)
|
|
cmd = 'ctags $(find %s -name "*.[ch]")' % source_root
|
|
print("Running: %s" % cmd)
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('ctags failed with exit status %d' % ret)
|
|
sys.exit(ret)
|