mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
dc7b48c404
Fix a problem where ctdb_killtcp (almost always) fails to capture packets with --enable-pcap and libpcap ≥ 1.9.1. The problem is due to a gradual change in libpcap semantics when using pcap_get_selectable_fd(3PCAP) to get a file descriptor and then using that file descriptor in non-blocking mode. pcap_set_immediate_mode(3PCAP) says: pcap_set_immediate_mode() sets whether immediate mode should be set on a capture handle when the handle is activated. In immediate mode, packets are always delivered as soon as they arrive, with no buffering. and On Linux, with previous releases of libpcap, capture devices are always in immediate mode; however, in 1.5.0 and later, they are, by default, not in immediate mode, so if pcap_set_immediate_mode() is available, it should be used. However, it wasn't until libpcap commit 2ade7676101366983bd4f86bc039ffd25da8c126 (before libpcap 1.9.1) that it became a requirement to use pcap_set_immediate_mode(), even with a timeout of 0. More explanation in this libpcap issue comment: https://github.com/the-tcpdump-group/libpcap/issues/860#issuecomment-541204548 Do a configure check for pcap_set_immediate_mode() even though it has existed for 10 years. It is easy enough. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15451 Signed-off-by: Martin Schwenke <mschwenke@ddn.com> Reviewed-by: Amitay Isaacs <amitay@gmail.com> Autobuild-User(master): Amitay Isaacs <amitay@samba.org> Autobuild-Date(master): Tue Aug 15 10:53:52 UTC 2023 on atb-devel-224
1330 lines
53 KiB
Python
1330 lines
53 KiB
Python
#!/usr/bin/env python
|
|
|
|
APPNAME = 'ctdb'
|
|
|
|
import sys, os
|
|
|
|
# find the buildtools directory
|
|
top = '.'
|
|
while not os.path.exists(top+'/buildtools') and len(top.split('/')) < 5:
|
|
top = top + '/..'
|
|
sys.path.insert(0, top + '/buildtools/wafsamba')
|
|
|
|
out = 'bin'
|
|
|
|
from waflib import Options, Logs, Errors, Context
|
|
import wafsamba
|
|
from wafsamba import samba_dist, samba_utils
|
|
from samba_utils import MODE_644, MODE_744, MODE_755, MODE_777
|
|
|
|
if os.path.isfile('./VERSION'):
|
|
vdir = '.'
|
|
elif os.path.isfile('../VERSION'):
|
|
vdir = '..'
|
|
else:
|
|
Logs.error("VERSION file not found")
|
|
|
|
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
|
|
third_party/socket_wrapper:third_party/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
|
|
lib/async_req:lib/async_req
|
|
lib/pthreadpool:lib/pthreadpool
|
|
lib/messaging:lib/messaging
|
|
buildtools:buildtools third_party/waf:third_party/waf''')
|
|
|
|
manpages_binary = [
|
|
'ctdb.1',
|
|
'ctdbd.1',
|
|
'ltdbtool.1',
|
|
'ping_pong.1'
|
|
]
|
|
|
|
manpages_misc = [
|
|
'ctdb_diagnostics.1',
|
|
'onnode.1',
|
|
'ctdb.conf.5',
|
|
'ctdb-script.options.5',
|
|
'ctdb.sysconfig.5',
|
|
'ctdb.7',
|
|
'ctdb-statistics.7',
|
|
'ctdb-tunables.7',
|
|
]
|
|
|
|
manpages_etcd = [
|
|
'ctdb-etcd.7',
|
|
]
|
|
|
|
manpages_ceph = [
|
|
'ctdb_mutex_ceph_rados_helper.7',
|
|
]
|
|
|
|
VERSION = ''
|
|
|
|
def get_version():
|
|
import samba_version
|
|
env = samba_utils.LOAD_ENVIRONMENT()
|
|
|
|
return samba_version.samba_version_file('%s/VERSION' % vdir, vdir, env)
|
|
|
|
def get_version_string():
|
|
if Context.g_module.VERSION:
|
|
return Context.g_module.VERSION
|
|
version = get_version()
|
|
Context.g_module.VERSION = version.STRING.replace('-', '.')
|
|
return Context.g_module.VERSION
|
|
|
|
def 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('--enable-etcd-reclock',
|
|
help=("Enable etcd recovery lock helper (default=no)"),
|
|
action="store_true", dest='ctdb_etcd_reclock', default=False)
|
|
opt.add_option('--enable-pcap',
|
|
help=("Use pcap for packet capture (default=no)"),
|
|
action="store_true", dest='ctdb_pcap', default=False)
|
|
|
|
opt.add_option('--with-libcephfs',
|
|
help=("Directory under which libcephfs is installed"),
|
|
action="store", dest='libcephfs_dir', default=None)
|
|
opt.add_option('--enable-ceph-reclock',
|
|
help=("Enable Ceph CTDB recovery lock helper (default=no)"),
|
|
action="store_true", dest='ctdb_ceph_reclock', 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')
|
|
|
|
conf.CHECK_HEADERS(headers='''sys/socket.h
|
|
netinet/in.h
|
|
netinet/if_ether.h
|
|
netinet/ip.h
|
|
netinet/ip6.h
|
|
netinet/icmp6.h''',
|
|
together=True)
|
|
|
|
conf.CHECK_CODE('int s = socket(AF_PACKET, SOCK_RAW, 0);',
|
|
define='HAVE_AF_PACKET',
|
|
headers='sys/socket.h linux/if_packet.h')
|
|
|
|
conf.CHECK_CODE('struct sockaddr_ll sall; sall.sll_family = AF_PACKET;',
|
|
define='HAVE_PACKETSOCKET',
|
|
headers='sys/socket.h linux/if_packet.h')
|
|
|
|
conf.CHECK_CODE('''pthread_mutex_t m;
|
|
int pid = 0;
|
|
m.__data.__owner = pid;
|
|
''',
|
|
'HAVE_PTHREAD_INTERNAL_MUTEX_OWNER',
|
|
headers='pthread.h',
|
|
msg='Checking for internal POSIX mutex owner field')
|
|
if not conf.env.HAVE_PTHREAD_INTERNAL_MUTEX_OWNER:
|
|
# This is unsupported - please see note in debug_locks.sh
|
|
Logs.info('Building without unsupported mutex debugging hack')
|
|
|
|
if conf.env.standalone_ctdb:
|
|
conf.SAMBA_CHECK_PERL(mandatory=True)
|
|
|
|
# This is just for consistency and to check the version for the
|
|
# build system, see Options.options.disable_python = True above
|
|
conf.SAMBA_CHECK_PYTHON()
|
|
conf.SAMBA_CHECK_PYTHON_HEADERS()
|
|
|
|
# We just want gnutls_rnd for rand subsystem
|
|
conf.CHECK_FUNCS_IN('gnutls_rnd', 'gnutls')
|
|
|
|
|
|
if conf.CHECK_FOR_THIRD_PARTY():
|
|
conf.RECURSE('third_party/popt')
|
|
if conf.env.standalone_ctdb or conf.CONFIG_GET('ENABLE_SELFTEST'):
|
|
conf.RECURSE('third_party/socket_wrapper')
|
|
conf.env.SOCKET_WRAPPER_SO_PATH = conf.CONFIG_GET('LIBSOCKET_WRAPPER_SO_PATH')
|
|
else:
|
|
if not conf.CHECK_POPT():
|
|
raise Errors.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.env.SOCKET_WRAPPER_SO_PATH = ''
|
|
|
|
|
|
if conf.env.standalone_ctdb or conf.CONFIG_GET('ENABLE_SELFTEST'):
|
|
if not conf.CHECK_SOCKET_WRAPPER():
|
|
raise Errors.WafError('socket_wrapper package has not been found.\nIf third_party is installed, check that it is in the proper place.')
|
|
else:
|
|
conf.define('USING_SYSTEM_SOCKET_WRAPPER', 1)
|
|
conf.env.SOCKET_WRAPPER_SO_PATH = conf.CONFIG_GET('LIBSOCKET_WRAPPER_SO_PATH')
|
|
|
|
conf.RECURSE('lib/util')
|
|
|
|
conf.RECURSE('lib/talloc')
|
|
conf.RECURSE('lib/tevent')
|
|
conf.RECURSE('lib/tdb')
|
|
|
|
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')
|
|
conf.CHECK_FUNCS('getrusage', headers="sys/time.h sys/resource.h")
|
|
|
|
if not conf.CHECK_VARIABLE('ETIME', headers='errno.h'):
|
|
conf.DEFINE('ETIME', 'ETIMEDOUT')
|
|
|
|
if Options.options.ctdb_pcap or not sys.platform.startswith('linux'):
|
|
conf.DEFINE('ENABLE_PCAP', 1)
|
|
if not conf.env.ENABLE_PCAP:
|
|
conf.SET_TARGET_TYPE('pcap', 'EMPTY')
|
|
else:
|
|
conf.find_program('pcap-config', var='PCAP_CONFIG')
|
|
if conf.env.PCAP_CONFIG:
|
|
conf.CHECK_CFG(path=conf.env.PCAP_CONFIG,
|
|
args="--cflags --libs",
|
|
package="",
|
|
uselib_store="PCAP")
|
|
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)
|
|
conf.CHECK_FUNCS_IN('pcap_set_immediate_mode', 'pcap', headers='pcap.h')
|
|
|
|
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:
|
|
conf.CHECK_TYPE_IN('__pmID_int', 'pcp/pmapi.h pcp/impl.h')
|
|
have_pmda = True
|
|
else:
|
|
Logs.error("PMDA support not available")
|
|
sys.exit(1)
|
|
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")
|
|
sys.exit(1)
|
|
if have_infiniband:
|
|
Logs.info('Building with Infiniband support')
|
|
conf.define('HAVE_INFINIBAND', 1)
|
|
conf.define('USE_INFINIBAND', 1)
|
|
|
|
have_etcd_reclock = False
|
|
if Options.options.ctdb_etcd_reclock:
|
|
try:
|
|
conf.check_python_module('etcd')
|
|
have_etcd_reclock = True
|
|
except:
|
|
Logs.error('etcd support not available')
|
|
sys.exit(1)
|
|
if have_etcd_reclock:
|
|
Logs.info('Building with etcd support')
|
|
conf.env.etcd_reclock = have_etcd_reclock
|
|
|
|
if Options.options.libcephfs_dir:
|
|
Logs.error('''--with-libcephfs no longer supported, please use compiler
|
|
flags instead, e.g. GCC LIBRARY_PATH and C_INCLUDE_PATH''')
|
|
sys.exit(1)
|
|
|
|
if Options.options.ctdb_ceph_reclock:
|
|
if (conf.CHECK_HEADERS('rados/librados.h', False, False, 'rados') and
|
|
conf.CHECK_LIB('rados', shlib=True)):
|
|
Logs.info('Building with Ceph librados recovery lock support')
|
|
conf.define('HAVE_LIBRADOS', 1)
|
|
else:
|
|
Logs.error("Missing librados for Ceph recovery lock support")
|
|
sys.exit(1)
|
|
|
|
conf.env.CTDB_BINDIR = os.path.join(conf.env.EXEC_PREFIX, 'bin')
|
|
conf.env.CTDB_DATADIR = os.path.join(conf.env.EXEC_PREFIX, 'share/ctdb')
|
|
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_DATADIR=\"%s\"
|
|
-DCTDB_ETCDIR=\"%s\"
|
|
-DCTDB_VARDIR=\"%s\"
|
|
-DCTDB_RUNDIR=\"%s\"''' % (
|
|
conf.env.CTDB_HELPER_BINDIR,
|
|
conf.env.CTDB_LOGDIR,
|
|
conf.env.CTDB_DATADIR,
|
|
conf.env.CTDB_ETCDIR,
|
|
conf.env.CTDB_VARDIR,
|
|
conf.env.CTDB_RUNDIR))
|
|
|
|
conf.env.CTDB_TEST_DATADIR = os.path.join(conf.env.CTDB_DATADIR, 'tests')
|
|
conf.env.CTDB_TEST_LIBEXECDIR = os.path.join(conf.env.LIBEXECDIR, '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 Context.g_module.top == '.':
|
|
# 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 = []
|
|
manpages = manpages_binary + manpages_misc
|
|
if conf.env.etcd_reclock:
|
|
manpages += manpages_etcd
|
|
if conf.env.HAVE_LIBRADOS:
|
|
manpages += manpages_ceph
|
|
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'
|
|
|
|
if bld.env.standalone_ctdb:
|
|
bld.SAMBA_MKVERSION('version.h', '%s/VERSION' % vdir)
|
|
|
|
bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
|
|
|
|
bld.RECURSE('lib/replace')
|
|
if bld.CHECK_FOR_THIRD_PARTY():
|
|
bld.RECURSE('third_party/popt')
|
|
if bld.env.standalone_ctdb or bld.CONFIG_GET('SOCKET_WRAPPER'):
|
|
bld.RECURSE('third_party/socket_wrapper')
|
|
|
|
bld.RECURSE('lib/tdb_wrap')
|
|
bld.RECURSE('lib/util')
|
|
bld.RECURSE('lib/async_req')
|
|
bld.RECURSE('lib/pthreadpool')
|
|
bld.RECURSE('lib/messaging')
|
|
|
|
bld.RECURSE('lib/talloc')
|
|
bld.RECURSE('lib/tevent')
|
|
bld.RECURSE('lib/tdb')
|
|
|
|
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'
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-system',
|
|
source=bld.SUBDIR('common',
|
|
'system_socket.c system.c'),
|
|
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
|
|
sock_io.c'''),
|
|
includes='include',
|
|
deps='''replace popt talloc tevent tdb popt ctdb-system
|
|
ctdb-protocol-util''')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-util',
|
|
source=bld.SUBDIR('common',
|
|
'''cmdline.c
|
|
comm.c
|
|
conf.c
|
|
db_hash.c
|
|
event_script.c
|
|
hash_count.c
|
|
line.c
|
|
logging.c
|
|
path.c
|
|
pidfile.c
|
|
pkt_read.c
|
|
pkt_write.c
|
|
rb_tree.c
|
|
reqid.c
|
|
run_event.c
|
|
run_proc.c
|
|
sock_client.c
|
|
srvid.c
|
|
tmon.c
|
|
tunable.c
|
|
'''),
|
|
deps='''samba-util
|
|
LIBASYNC_REQ
|
|
sys_rw
|
|
tevent-util
|
|
replace
|
|
talloc
|
|
tevent
|
|
tdb
|
|
popt
|
|
''')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-logging-conf',
|
|
source='common/logging_conf.c',
|
|
deps='ctdb-util talloc')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-protocol-basic',
|
|
source=bld.SUBDIR('protocol', 'protocol_basic.c'),
|
|
deps='talloc tdb')
|
|
|
|
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_keepalive.c
|
|
protocol_tunnel.c
|
|
protocol_client.c
|
|
protocol_debug.c
|
|
protocol_sock.c'''),
|
|
deps='ctdb-protocol-basic replace talloc tdb')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-protocol-util',
|
|
source='protocol/protocol_util.c',
|
|
deps='ctdb-util replace talloc tdb')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-client',
|
|
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
|
|
client_tunnel.c
|
|
'''),
|
|
deps='''ctdb-protocol
|
|
ctdb-util
|
|
samba-util
|
|
replace
|
|
talloc
|
|
tevent
|
|
tdb
|
|
tdb-wrap
|
|
''')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-server-util',
|
|
source=bld.SUBDIR('common',
|
|
'''sock_daemon.c'''),
|
|
deps='''samba-util ctdb-util ctdb-system tevent-util
|
|
LIBASYNC_REQ replace talloc tevent''')
|
|
|
|
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-util replace talloc tevent')
|
|
|
|
bld.SAMBA_BINARY('ctdb-path',
|
|
source='common/path_tool.c',
|
|
cflags='-DCTDB_PATH_TOOL',
|
|
deps='''ctdb-util samba-util talloc replace popt''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-cluster-conf',
|
|
source='cluster/cluster_conf.c',
|
|
deps='ctdb-util')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-database-conf',
|
|
source='database/database_conf.c',
|
|
deps='ctdb-util')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-event-conf',
|
|
source='event/event_conf.c',
|
|
deps='ctdb-util')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-failover-conf',
|
|
source='failover/failover_conf.c',
|
|
deps='ctdb-util')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-legacy-conf',
|
|
source='server/legacy_conf.c',
|
|
deps='ctdb-util')
|
|
|
|
bld.SAMBA_BINARY('ctdb-config',
|
|
source='common/conf_tool.c',
|
|
cflags='-DCTDB_CONF_TOOL',
|
|
deps='''ctdb-logging-conf
|
|
ctdb-event-conf
|
|
ctdb-cluster-conf
|
|
ctdb-database-conf
|
|
ctdb-failover-conf
|
|
ctdb-legacy-conf
|
|
ctdb-util samba-util talloc replace popt''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-event-protocol',
|
|
source=bld.SUBDIR('event',
|
|
'''event_protocol.c
|
|
event_protocol_util.c
|
|
'''),
|
|
deps='ctdb-protocol-basic')
|
|
|
|
bld.SAMBA_LIBRARY('ctdb-event-client',
|
|
source='event/event_client.c',
|
|
deps='ctdb-event-protocol ctdb-util tevent talloc',
|
|
private_library=True)
|
|
|
|
bld.SAMBA_BINARY('ctdb-eventd',
|
|
source=bld.SUBDIR('event',
|
|
'''event_cmd.c
|
|
event_config.c
|
|
event_context.c
|
|
event_daemon.c
|
|
event_request.c
|
|
'''),
|
|
deps='''ctdb-event-protocol
|
|
ctdb-event-conf ctdb-logging-conf
|
|
ctdb-server-util samba-util ctdb-util
|
|
talloc tevent replace popt''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb-event',
|
|
source='event/event_tool.c',
|
|
cflags='-DCTDB_EVENT_TOOL',
|
|
deps='''ctdb-event-client ctdb-event-protocol
|
|
ctdb-util samba-util talloc replace''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdbd',
|
|
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_cluster_mutex.c
|
|
ctdb_logging.c
|
|
ctdb_uptime.c
|
|
ctdb_vacuum.c ctdb_banning.c
|
|
ctdb_statistics.c
|
|
ctdb_update_record.c
|
|
ctdb_lock.c ctdb_fork.c
|
|
ctdb_tunnel.c ctdb_client.c
|
|
ctdb_config.c
|
|
'''),
|
|
includes='include',
|
|
deps='''ctdb-common ctdb-system ctdb-protocol
|
|
ctdb-tcp ctdb-util replace sys_rw popt
|
|
ctdb-logging-conf
|
|
ctdb-cluster-conf
|
|
ctdb-database-conf
|
|
ctdb-event-conf
|
|
ctdb-failover-conf
|
|
ctdb-legacy-conf
|
|
ctdb-event-protocol
|
|
talloc tevent tdb-wrap tdb talloc_report''' +
|
|
ib_deps,
|
|
install_path='${SBINDIR}',
|
|
manpages='ctdbd.1')
|
|
|
|
bld.SAMBA_BINARY('ctdb',
|
|
source='tools/ctdb.c',
|
|
deps='''ctdb-client ctdb-protocol ctdb-protocol-util
|
|
ctdb-util ctdb-system samba-util sys_rw popt''',
|
|
install_path='${BINDIR}',
|
|
manpages='ctdb.1')
|
|
|
|
bld.SAMBA_BINARY('ctdb_killtcp',
|
|
source='tools/ctdb_killtcp.c',
|
|
deps='''ctdb-protocol-util 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 sys_rw ctdb-system tevent-util
|
|
talloc tevent tdb''',
|
|
includes='include',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_recovery_helper',
|
|
source='server/ctdb_recovery_helper.c',
|
|
deps='''ctdb-client ctdb-protocol ctdb-util
|
|
samba-util sys_rw replace tdb''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_takeover_helper',
|
|
source='server/ctdb_takeover_helper.c',
|
|
deps='''ctdb-client ctdb-protocol ctdb-util
|
|
samba-util sys_rw replace ctdb-ipalloc popt''',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_mutex_fcntl_helper',
|
|
source='server/ctdb_mutex_fcntl_helper.c',
|
|
deps='''sys_rw ctdb-system tevent-util ctdb-util
|
|
talloc tevent
|
|
''',
|
|
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 = 'grep -Fv "register int32_t *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 tirpc',
|
|
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_PTHREAD_INTERNAL_MUTEX_OWNER:
|
|
bld.SAMBA_BINARY('tdb_mutex_check',
|
|
source='utils/tdb/tdb_mutex_check.c',
|
|
deps='tdb pthread',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
if bld.env.HAVE_PMDA:
|
|
bld.SAMBA_BINARY('pmdactdb',
|
|
source='utils/pmda/pmda_ctdb.c',
|
|
deps='''ctdb-client ctdb-protocol ctdb-util
|
|
samba-util 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')
|
|
|
|
if bld.env.HAVE_LIBRADOS:
|
|
bld.SAMBA_BINARY('ctdb_mutex_ceph_rados_helper',
|
|
source='utils/ceph/ctdb_mutex_ceph_rados_helper.c',
|
|
deps='talloc tevent rados',
|
|
includes='include',
|
|
install_path='${CTDB_HELPER_BINDIR}')
|
|
|
|
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_expr7 = 's|/usr/local/bin|%s|g' % (bld.env.BINDIR)
|
|
sed_expr8 = 's|/usr/local/share/ctdb|%s|g' % (bld.env.CTDB_DATADIR)
|
|
sed_cmdline = '-e "%s" ' * 8 % \
|
|
(sed_expr1, sed_expr2, sed_expr3, sed_expr4, sed_expr5,
|
|
sed_expr6, sed_expr7, sed_expr8)
|
|
|
|
manpages_extra = list(manpages_misc)
|
|
if bld.env.etcd_reclock:
|
|
manpages_extra += manpages_etcd
|
|
if bld.env.HAVE_LIBRADOS:
|
|
manpages_extra += manpages_ceph
|
|
for f in manpages_binary + manpages_extra:
|
|
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(' '.join(manpages_extra), 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=MODE_755)
|
|
|
|
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=MODE_755)
|
|
|
|
if bld.env.etcd_reclock:
|
|
bld.SAMBA_GENERATOR('ctdb-etcd-lock',
|
|
source='utils/etcd/ctdb_etcd_lock',
|
|
target='ctdb_etcd_lock',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES('${CTDB_HELPER_BINDIR}', 'ctdb_etcd_lock',
|
|
destname='ctdb_etcd_lock', chmod=MODE_744)
|
|
|
|
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=MODE_755)
|
|
|
|
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=MODE_755)
|
|
|
|
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 & MODE_777
|
|
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': []}
|
|
for dirname, _subdirs, fnames in os.walk(path):
|
|
SUBDIR_MODE_callback(pd, dirname, fnames)
|
|
return pd['file_list']
|
|
|
|
event_script_subdirs = [
|
|
'events/legacy',
|
|
]
|
|
|
|
etc_subdirs = [
|
|
'nfs-checks.d'
|
|
]
|
|
|
|
if bld.env.standalone_ctdb:
|
|
configdir = 'config'
|
|
else:
|
|
configdir = 'ctdb/config'
|
|
|
|
for t in event_script_subdirs:
|
|
bld.INSTALL_DIR(os.path.join(bld.env.CTDB_ETCDIR, t))
|
|
files = SUBDIR_MODE('%s/%s' % (configdir, t), trim_path=configdir)
|
|
for fmode in files:
|
|
bld.INSTALL_FILES(bld.env.CTDB_DATADIR, 'config/%s' % fmode[0],
|
|
destname=fmode[0], chmod=fmode[1])
|
|
|
|
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])
|
|
|
|
# If this is a direct install and there are no event scripts
|
|
# linked/enabled then enable some standard ones
|
|
if os.environ.get('DESTDIR') is None:
|
|
fmt = 'events/legacy/%s.script'
|
|
required_script = '00.ctdb'
|
|
required_path = os.path.join(bld.env.CTDB_ETCDIR,
|
|
fmt % (required_script))
|
|
if not os.path.islink(required_path) and \
|
|
not os.path.exists(required_path):
|
|
default_scripts = [ required_script,
|
|
'01.reclock',
|
|
'05.system',
|
|
'10.interface',
|
|
]
|
|
for t in default_scripts:
|
|
tgt = os.path.join(bld.env.CTDB_DATADIR, fmt % (t))
|
|
name = os.path.join(bld.env.CTDB_ETCDIR, fmt % (t))
|
|
bld.symlink_as(name, tgt)
|
|
|
|
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',
|
|
'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=MODE_755)
|
|
|
|
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}/events/notification',
|
|
'config/notification.README',
|
|
destname='README')
|
|
|
|
bld.INSTALL_DIR(bld.env.CTDB_LOGDIR)
|
|
bld.INSTALL_DIR(bld.env.CTDB_RUNDIR)
|
|
bld.INSTALL_DIR(bld.env.CTDB_VARDIR)
|
|
|
|
for d in ['volatile', 'persistent', 'state']:
|
|
bld.INSTALL_DIR(os.path.join(bld.env.CTDB_VARDIR, d))
|
|
|
|
#
|
|
# Test-only below this point
|
|
#
|
|
|
|
if not bld.env.standalone_ctdb and not bld.CONFIG_GET('ENABLE_SELFTEST'):
|
|
return
|
|
|
|
bld.SAMBA_BINARY('errcode',
|
|
source='tests/src/errcode.c',
|
|
deps='replace',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('sigcode',
|
|
source='tests/src/sigcode.c',
|
|
deps='replace',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
# Unit tests
|
|
ctdb_util_tests = [
|
|
'cmdline_test',
|
|
'comm_client_test',
|
|
'comm_server_test',
|
|
'comm_test',
|
|
'conf_test',
|
|
'db_hash_test',
|
|
'event_script_test',
|
|
'hash_count_test',
|
|
'line_test',
|
|
'pidfile_test',
|
|
'pkt_read_test',
|
|
'pkt_write_test',
|
|
'run_event_test',
|
|
'run_proc_test',
|
|
'sock_io_test',
|
|
'srvid_test',
|
|
'tunable_test',
|
|
]
|
|
|
|
for target in ctdb_util_tests:
|
|
src = 'tests/src/' + target + '.c'
|
|
|
|
bld.SAMBA_BINARY(target,
|
|
source=src,
|
|
deps='''ctdb-tests-backtrace
|
|
LIBASYNC_REQ
|
|
samba-util
|
|
sys_rw
|
|
tevent-util
|
|
talloc
|
|
tevent
|
|
tdb
|
|
popt
|
|
''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('reqid_test',
|
|
source='tests/src/reqid_test.c',
|
|
deps='samba-util talloc',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('rb_test',
|
|
source='tests/src/rb_test.c',
|
|
deps='samba-util talloc',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_packet_parse',
|
|
source='tests/src/ctdb_packet_parse.c',
|
|
deps='talloc tevent tdb ctdb-protocol',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('system_socket_test',
|
|
source='tests/src/system_socket_test.c',
|
|
deps='''ctdb-tests-backtrace
|
|
talloc
|
|
ctdb-protocol-util
|
|
pcap
|
|
''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('porting_tests',
|
|
source='tests/src/porting_tests.c',
|
|
deps='samba-util ctdb-system popt',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('sock_daemon_test',
|
|
source='tests/src/sock_daemon_test.c',
|
|
deps='''ctdb-system talloc tevent tevent-util
|
|
LIBASYNC_REQ samba-util sys_rw''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_io_test',
|
|
source='tests/src/ctdb_io_test.c',
|
|
deps='''talloc tevent tdb samba-util sys_rw''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb-db-test',
|
|
source='tests/src/db_test_tool.c',
|
|
cflags='-DCTDB_DB_TEST_TOOL',
|
|
deps='''ctdb-client ctdb-protocol
|
|
ctdb-util samba-util talloc tevent replace''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
for target in ['tmon_ping_test', 'tmon_test']:
|
|
src = 'tests/src/' + target + '.c'
|
|
|
|
bld.SAMBA_BINARY(target,
|
|
source=src,
|
|
deps='''ctdb-util
|
|
ctdb-tests-backtrace
|
|
LIBASYNC_REQ
|
|
samba-util
|
|
sys_rw
|
|
tevent-util
|
|
talloc
|
|
tevent
|
|
tdb
|
|
popt
|
|
''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-protocol-tests-basic',
|
|
source=bld.SUBDIR('tests/src',
|
|
'protocol_common_basic.c'),
|
|
deps='samba-util replace talloc')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-protocol-tests-common',
|
|
source=bld.SUBDIR('tests/src',
|
|
'''protocol_common.c
|
|
protocol_common_ctdb.c
|
|
'''),
|
|
deps='ctdb-protocol-tests-basic replace talloc tdb')
|
|
|
|
bld.SAMBA_BINARY('protocol_basic_test',
|
|
source=bld.SUBDIR('tests/src', 'protocol_basic_test.c'),
|
|
deps='ctdb-protocol-tests-basic talloc',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
ctdb_protocol_tests = [
|
|
'protocol_types_test',
|
|
'protocol_ctdb_test',
|
|
'protocol_util_test',
|
|
'protocol_types_compat_test',
|
|
'protocol_ctdb_compat_test',
|
|
]
|
|
|
|
for target in ctdb_protocol_tests:
|
|
src = 'tests/src/' + target + '.c'
|
|
|
|
bld.SAMBA_BINARY(target,
|
|
source=src,
|
|
deps='''ctdb-protocol-tests-common
|
|
samba-util ctdb-util talloc tdb''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('event_protocol_test',
|
|
source='event/event_protocol_test.c',
|
|
deps='''ctdb-protocol-tests-basic
|
|
ctdb-protocol-basic talloc''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-tests-common',
|
|
source=bld.SUBDIR('tests/src',
|
|
'''cluster_wait.c
|
|
test_options.c
|
|
'''),
|
|
deps='''ctdb-client
|
|
samba-util
|
|
replace
|
|
popt
|
|
talloc
|
|
tevent
|
|
tdb''')
|
|
|
|
bld.SAMBA_SUBSYSTEM('ctdb-tests-backtrace',
|
|
source=bld.SUBDIR('tests/src',
|
|
'test_backtrace.c'),
|
|
deps='''samba-util
|
|
replace''')
|
|
|
|
# Test binaries
|
|
ctdb_tests = [
|
|
'g_lock_loop',
|
|
'message_ring',
|
|
'fetch_ring',
|
|
'fetch_loop',
|
|
'fetch_loop_key',
|
|
'fetch_readonly',
|
|
'fetch_readonly_loop',
|
|
'transaction_loop',
|
|
'update_record',
|
|
'update_record_persistent',
|
|
'lock_tdb',
|
|
'dummy_client',
|
|
'tunnel_test',
|
|
'tunnel_cmd',
|
|
]
|
|
|
|
for target in ctdb_tests:
|
|
src = 'tests/src/' + target + '.c'
|
|
|
|
bld.SAMBA_BINARY(target,
|
|
source=src,
|
|
includes='include',
|
|
deps='''ctdb-client ctdb-protocol ctdb-util
|
|
samba-util ctdb-tests-common''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('ctdb_takeover_tests',
|
|
source='''tests/src/ctdb_takeover_tests.c
|
|
tests/src/ipalloc_read_known_ips.c''',
|
|
deps='''replace popt tdb tevent talloc ctdb-system
|
|
samba-util tdb-wrap talloc_report
|
|
ctdb-ipalloc ctdb-protocol ctdb-util''',
|
|
includes='include',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('fake_ctdbd',
|
|
source='''tests/src/fake_ctdbd.c
|
|
tests/src/ipalloc_read_known_ips.c''',
|
|
deps='''ctdb-util ctdb-protocol ctdb-protocol-util
|
|
ctdb-system samba-util tevent-util
|
|
LIBASYNC_REQ popt''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
bld.SAMBA_BINARY('cluster_mutex_test',
|
|
source='tests/src/cluster_mutex_test.c',
|
|
deps='''ctdb-tests-backtrace
|
|
samba-util
|
|
talloc
|
|
tevent
|
|
''',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
if bld.env.HAVE_INFINIBAND:
|
|
bld.SAMBA_BINARY('ibwrapper_test',
|
|
source='ib/ibwrapper_test.c',
|
|
includes='include',
|
|
deps='replace talloc ctdb-common sys_rw' +
|
|
ib_deps,
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
if bld.env.HAVE_ROBUST_MUTEXES and sys.platform.startswith('linux') and bld.env.DEVELOPER:
|
|
bld.SAMBA_BINARY('test_mutex_raw',
|
|
source='tests/src/test_mutex_raw.c',
|
|
deps='pthread',
|
|
install_path='${CTDB_TEST_LIBEXECDIR}')
|
|
|
|
test_subdirs = [
|
|
'CLUSTER',
|
|
'INTEGRATION',
|
|
'UNIT',
|
|
'etc-ctdb'
|
|
]
|
|
|
|
if bld.env.standalone_ctdb:
|
|
testdir = 'tests'
|
|
else:
|
|
testdir = 'ctdb/tests'
|
|
|
|
for t in test_subdirs:
|
|
files = SUBDIR_MODE('%s/%s' % (testdir, t), trim_path=testdir)
|
|
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, excluding files that need munging
|
|
test_scripts = [
|
|
'cluster.bash',
|
|
'common.sh',
|
|
'integration.bash',
|
|
'integration_local_daemons.bash',
|
|
'integration_real_cluster.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))
|
|
|
|
bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR,
|
|
'tests/scripts/test_wrap',
|
|
destname='scripts/test_wrap',
|
|
chmod=MODE_755)
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-test-script-install-paths',
|
|
source='tests/scripts/script_install_paths.sh',
|
|
target='script_install_paths.sh',
|
|
rule='sed %s ${SRC} > ${TGT}' % (sed_cmdline))
|
|
bld.INSTALL_FILES(bld.env.CTDB_TEST_DATADIR+"/scripts",
|
|
'script_install_paths.sh',
|
|
destname='script_install_paths.sh', chmod=MODE_644)
|
|
|
|
sed_expr1 = 's@^\\(%s\\)=.*@\\1=%s@' % (
|
|
'CTDB_TEST_DIR', bld.env.CTDB_TEST_DATADIR)
|
|
sed_expr2 = 's@^\\(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=MODE_755)
|
|
bld.symlink_as(os.path.join(bld.env.BINDIR, 'ctdb_run_cluster_tests'),
|
|
'ctdb_run_tests')
|
|
|
|
bld.SAMBA_GENERATOR('ctdb-local-daemons',
|
|
source='tests/local_daemons.sh',
|
|
target='ctdb_local_daemons.sh',
|
|
rule='sed -e "%s" -e "%s" ${SRC} > ${TGT}' % (
|
|
sed_expr1, sed_expr2))
|
|
bld.INSTALL_FILES('${BINDIR}', 'ctdb_local_daemons.sh',
|
|
destname='ctdb_local_daemons', chmod=MODE_755)
|
|
|
|
|
|
def testonly(ctx):
|
|
cmd = 'tests/run_tests.sh'
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('tests exited with exit status %d' % ret)
|
|
sys.exit(ret)
|
|
|
|
|
|
def test(ctx):
|
|
Options.commands.append('build')
|
|
Options.commands.append('testonly')
|
|
|
|
|
|
def autotest(ctx):
|
|
env = samba_utils.LOAD_ENVIRONMENT()
|
|
cmd = 'tests/run_tests.sh -eL -S %s' % env.SOCKET_WRAPPER_SO_PATH
|
|
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(get_version_string())
|
|
|
|
|
|
def manpages(ctx):
|
|
BASE_URL = 'http://docbook.sourceforge.net/release/xsl/current'
|
|
MAN_XSL = '%s/manpages/docbook.xsl' % BASE_URL
|
|
HTML_XSL = '%s/html/docbook.xsl' % BASE_URL
|
|
CMD_TEMPLATE = 'xsltproc --xinclude -o %s --nonet %s %s'
|
|
manpages = manpages_binary + manpages_misc + manpages_etcd + manpages_ceph
|
|
for t in manpages:
|
|
cmd = CMD_TEMPLATE % ('doc/%s' % t, MAN_XSL, 'doc/%s.xml' % t)
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('Command %s failed with exit status %d' % (cmd, ret))
|
|
sys.exit(ret)
|
|
|
|
cmd = CMD_TEMPLATE % ('doc/%s.html' % t, HTML_XSL, 'doc/%s.xml' % t)
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('Command %s failed with exit status %d' % (cmd, ret))
|
|
sys.exit(ret)
|
|
|
|
|
|
def distonly(ctx):
|
|
samba_dist.DIST_FILES('VERSION:VERSION', extend=True)
|
|
|
|
t = 'ctdb.spec'
|
|
sed_expr1 = 's/@VERSION@/%s/g' % get_version_string()
|
|
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)
|
|
|
|
manpages = manpages_binary + manpages_misc + manpages_etcd + manpages_ceph
|
|
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 dist():
|
|
Options.commands.append('manpages')
|
|
Options.commands.append('distonly')
|
|
|
|
|
|
def rpmonly(ctx):
|
|
opts = os.getenv('RPM_OPTIONS') or ''
|
|
cmd = 'rpmbuild -ta --clean --rmsource %s ctdb-%s.tar.gz' % \
|
|
(opts, get_version_string())
|
|
ret = samba_utils.RUN_COMMAND(cmd)
|
|
if ret != 0:
|
|
print('rpmbuild exited with exit status %d' % ret)
|
|
sys.exit(ret)
|
|
|
|
|
|
def rpm(ctx):
|
|
Options.commands.append('manpages')
|
|
Options.commands.append('distonly')
|
|
Options.commands.append('rpmonly')
|
|
|
|
|
|
def ctags(ctx):
|
|
"build 'tags' file using ctags"
|
|
source_root = os.path.dirname(Context.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)
|