diff --git a/.gitignore b/.gitignore index d3d77504cc8a66eafe9c94ecf187cd414d0f7dd0..d3935bdcacc13577fbad33eae5a2fd5c8dc459ea 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,8 @@ doc/www-data.in/_text/download.md doc/www-data.in/doc extra/rpm.spec extra/rpm/tarantool.rpm.spec +extra/dist/tarantool.service +extra/dist/tarantool.init include/tarantool/config.h src/trivia/config.h install_manifest.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index a3a1c472adcc6ece2c3cc695a351ac94bcbaf0f8..fd8dcac63c3157995fff317ab21ac1cfd1679a50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ include(cmake/compiler.cmake) include(cmake/simd.cmake) include(cmake/profile.cmake) include(cmake/FindReadline.cmake) +include(cmake/systemd.cmake) if (NOT READLINE_FOUND) message(FATAL_ERROR "readline library not found.") diff --git a/cmake/rpm.cmake b/cmake/rpm.cmake index 45e53f85c3cff7444bf25dea17f1f206c036fb7c..d01a879e8a0f194464cab4dfe1141978968d4817 100644 --- a/cmake/rpm.cmake +++ b/cmake/rpm.cmake @@ -48,6 +48,13 @@ if (RPMBUILD) WORKING_DIRECTORY ${PROJECT_BINARY_DIR} ) + add_custom_target(rpm_systemd + DEPENDS rpm_src + DEPENDS ${RPM_BUILDROOT} + COMMAND ${RPMBUILD} --buildroot ${RPM_BUILDROOT} --with systemd --rebuild ${PROJECT_BINARY_DIR}/tarantool-${VERSION}-${RELEASE}.src.rpm + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + ) + add_custom_target(rpm_scl_full_old DEPENDS ${RPM_BUILDROOT} DEPENDS ${PROJECT_BINARY_DIR}/${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.gz diff --git a/cmake/systemd.cmake b/cmake/systemd.cmake new file mode 100644 index 0000000000000000000000000000000000000000..c9a052c2e7682ea542985e2f3c54e304e3c03285 --- /dev/null +++ b/cmake/systemd.cmake @@ -0,0 +1,17 @@ +find_package(PkgConfig REQUIRED) + +pkg_check_modules(SYSTEMD "systemd") + +if (SYSTEMD_FOUND AND NOT SYSTEMD_SERVICES_INSTALL_DIR) + execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=systemdsystemunitdir systemd OUTPUT_VARIABLE SYSTEMD_SERVICES_INSTALL_DIR) + string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SERVICES_INSTALL_DIR "${SYSTEMD_SERVICES_INSTALL_DIR}") +endif(SYSTEMD_FOUND AND NOT SYSTEMD_SERVICES_INSTALL_DIR) + +if (NOT SYSTEMD_FOUND AND SYSTEMD_SERVICES_INSTALL_DIR) + message (FATAL_ERROR "Variable SYSTEMD_SERVICES_INSTALL_DIR is defined,") + message (FATAL_ERROR "but we can't find systemd using pkg-config") +endif(NOT SYSTEMD_FOUND AND SYSTEMD_SERVICES_INSTALL_DIR) + +if (SYSTEMD_FOUND) + message(STATUS "SYSTEMD_SERVICES_INSTALL_DIR: ${SYSTEMD_SERVICES_INSTALL_DIR}") +endif (SYSTEMD_FOUND) diff --git a/debian/tarantool-common.install b/debian/tarantool-common.install index 24890c9173c5353c5fa96887bc8104bd5a910c6a..efb24957995f5c378bbbe78b7abdd03380acb169 100644 --- a/debian/tarantool-common.install +++ b/debian/tarantool-common.install @@ -1,2 +1,2 @@ extra/dist/default.deb/tarantool /etc/default -extra/dist/dist.lua /usr/lib/tarantool +extra/dist/dist.lua /usr/bin/tarantool_ctl diff --git a/debian/tarantool-common.tarantool.init b/debian/tarantool-common.tarantool.init index ce760cce966c35d39e90c86ab13f15659d2f4dd7..3e8b3b2b53b0e8fe60186f6b8f5d3c1cf2c657bc 120000 --- a/debian/tarantool-common.tarantool.init +++ b/debian/tarantool-common.tarantool.init @@ -1 +1 @@ -../extra/dist/tarantool \ No newline at end of file +../extra/dist/tarantool.init \ No newline at end of file diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index c87cbccffd51f3d31f06a2d3d69afe210f1d9547..44d349ac3f80c7ffff30afc25aa0e51957dba9d9 100644 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -1,36 +1,4 @@ -# -# Scripts for a RPM package -# -if (ENABLE_RPM) - # chmod +x 655 - install (FILES dist/tarantool DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d/ - PERMISSIONS - OWNER_READ OWNER_WRITE - GROUP_READ GROUP_EXECUTE - WORLD_READ WORLD_EXECUTE) - install (FILES dist/default.rpm/tarantool DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/sysconfig/ - PERMISSIONS - OWNER_READ OWNER_WRITE - GROUP_READ GROUP_EXECUTE - WORLD_READ WORLD_EXECUTE) - install (FILES dist/dist.lua DESTINATION ${CMAKE_INSTALL_LIBDIR}/tarantool/ - PERMISSIONS - OWNER_READ OWNER_WRITE - GROUP_READ GROUP_EXECUTE - WORLD_READ WORLD_EXECUTE) -# # chmod +x 755 -# install (FILES tarantool_multi.sh DESTINATION bin -# PERMISSIONS -# OWNER_READ OWNER_WRITE OWNER_EXECUTE -# GROUP_READ GROUP_EXECUTE -# WORLD_READ WORLD_EXECUTE) -# # chmod +x 755 -# install (FILES tarantool_deploy.sh DESTINATION bin -# PERMISSIONS -# OWNER_READ OWNER_WRITE OWNER_EXECUTE -# GROUP_READ GROUP_EXECUTE -# WORLD_READ WORLD_EXECUTE) -endif() +add_subdirectory(dist) configure_file(rpm/tarantool.rpm.spec.in rpm/tarantool.rpm.spec @ONLY) @@ -40,7 +8,7 @@ if (TARGET_OS_DARWIN) # Also cmake doesn't support changing package id from 'com.' to 'org.' # Need chage to 'org.' after update lines this file: # https://github.com/Kitware/CMake/blob/v2.8.11.2/Source/CPack/cmCPackPackageMakerGenerator.cxx#L763 - # + # # ^^^ DO NOT CHANGE DARWIN_PACKAGE_ID BEFORE SEE URL ABOVE ^^^ # set (DARWIN_PACKAGE_ID "com") diff --git a/extra/dist/CMakeLists.txt b/extra/dist/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..14c372bf5058c9e747df193c55e0bbc938d66adb --- /dev/null +++ b/extra/dist/CMakeLists.txt @@ -0,0 +1,43 @@ +# +# Scripts for a RPM package +# +configure_file("tarantool.init.in" "tarantool.init") + +set(SYSV_INITD_PATH ${CMAKE_INSTALL_LIBDIR}/tarantool/tarantool.init) +configure_file("tarantool.service.in" "tarantool.service") + +if (ENABLE_RPM) + # chmod +x 655 + if (SYSTEMD_FOUND AND WITH_SYSTEMD) + message (STATUS "Building RPM with SYSTEMD") + install (FILES tarantool.service DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR} + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + install (FILES tarantool.init DESTINATION ${CMAKE_INSTALL_LIBDIR}/tarantool/ + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + else (SYSTEMD_FOUND AND WITH_SYSTEMD) + message (STATUS "Building RPM without SYSTEMD") + install (FILES tarantool.init DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d/ + RENAME tarantool + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + endif(SYSTEMD_FOUND AND WITH_SYSTEMD) + install (FILES default.rpm/tarantool DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/sysconfig/ + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + install (FILES dist.lua DESTINATION ${CMAKE_INSTALL_BINDIR} + RENAME tarantool_ctl + PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) +endif() diff --git a/extra/dist/default.deb/tarantool b/extra/dist/default.deb/tarantool index fd29a7260171edfe303a03b96bad98fb2b15201e..b840cda22cfa56a021f1887a464366806d7a0703 100644 --- a/extra/dist/default.deb/tarantool +++ b/extra/dist/default.deb/tarantool @@ -3,7 +3,7 @@ SNAPS=/var/lib/tarantool XLOGS=/var/lib/tarantool LOGS=/var/log/tarantool -PIDS=/var/pid/tarantool +PIDS=/var/run/tarantool USERNAME=tarantool INSTDIR=/etc/tarantool/instances.enabled diff --git a/extra/dist/default.rpm/tarantool b/extra/dist/default.rpm/tarantool index fd29a7260171edfe303a03b96bad98fb2b15201e..b840cda22cfa56a021f1887a464366806d7a0703 100644 --- a/extra/dist/default.rpm/tarantool +++ b/extra/dist/default.rpm/tarantool @@ -3,7 +3,7 @@ SNAPS=/var/lib/tarantool XLOGS=/var/lib/tarantool LOGS=/var/log/tarantool -PIDS=/var/pid/tarantool +PIDS=/var/run/tarantool USERNAME=tarantool INSTDIR=/etc/tarantool/instances.enabled diff --git a/extra/dist/dist.lua b/extra/dist/dist.lua index 9a5f6be69e1ba9c26d76b20f40e3100afbcadf80..5064686764a969a1ae2122f6b1daf7a57f9af893 100755 --- a/extra/dist/dist.lua +++ b/extra/dist/dist.lua @@ -115,6 +115,8 @@ for i = 0, 128 do end end +local force_cfg_console = fio.pathjoin(cfg.PIDS, instance .. '.control') + local force_cfg = { pid_file = fio.pathjoin(cfg.PIDS, instance .. '.pid'), wal_dir = fio.pathjoin(cfg.XLOGS, instance), @@ -122,7 +124,6 @@ local force_cfg = { snap_dir = fio.pathjoin(cfg.SNAPS, instance), username = cfg.USERNAME, logger = fio.pathjoin(cfg.LOGS, instance .. '.log'), - console = fio.pathjoin(cfg.PIDS, instance .. '.control'), background = true, } @@ -135,8 +136,8 @@ box.cfg = function(cfg) end local res = orig_cfg(cfg) - log.info('Run console at %s', force_cfg.console) - console.listen(force_cfg.console) + log.info('Run console at %s', force_cfg_console) + console.listen(force_cfg_console) return res end diff --git a/extra/dist/tarantool b/extra/dist/tarantool.init.in similarity index 73% rename from extra/dist/tarantool rename to extra/dist/tarantool.init.in index cccecc2707ddc75c895e4afa7a1007d7141f8621..c6053397e4855b714c0fa2cedd175b23f66834fe 100644 --- a/extra/dist/tarantool +++ b/extra/dist/tarantool.init.in @@ -13,22 +13,34 @@ # Author: Dmitry E. Oboukhov <unera@debian.org> -PATH=/sbin:/usr/sbin:/bin:/usr/bin +PATH=/sbin:/usr/sbin:/bin:/usr/bin:@CMAKE_INSTALL_BINDIR@ CONF_DIR=/etc/tarantool/instances.enabled SCRIPTNAME=/etc/init.d/tarantool -DAEMON=/usr/bin/tarantool -INSTANCES=`find $CONF_DIR -xtype f -name '*lua'` -DIST_LUA=/usr/lib/tarantool/dist.lua +DAEMON=@CMAKE_INSTALL_BINDIR@/tarantool +DIST_LUA=@CMAKE_INSTALL_BINDIR@/tarantool_ctl # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 +if [ -e "/lib/init/vars.sh" ]; then + . /lib/init/vars.sh +elif [ -e "/etc/rc.d/init.d/functions" ]; then + . /etc/rc.d/init.d/functions +fi + +if [ -e "/etc/sysconfig/tarantool" ]; then + . /etc/sysconfig/tarantool +elif [ -e "/etc/default/tarantool" ]; then + . /etc/default/tarantool +fi + +INSTANCES=`find $CONF_DIR -xtype f -name '*lua'` + if test -z "$INSTANCES"; then echo "tarantool: There are no instances (*.lua) in $CONF_DIR" exit 0 fi - # # Function that starts the daemon/service # @@ -75,10 +87,10 @@ case "$1" in do_stop do_start ;; - + *) - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 - exit 3 + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 ;; esac diff --git a/extra/dist/tarantool.service.in b/extra/dist/tarantool.service.in new file mode 100644 index 0000000000000000000000000000000000000000..cbcde05810b27e854ff4c5d3422b966415544c8b --- /dev/null +++ b/extra/dist/tarantool.service.in @@ -0,0 +1,36 @@ +# It's not recommended to modify this file in-place, because it will be +# overwritten during package upgrades. If you want to customize there're +# number of ways: + +# Recommended way: +# 1) Use "/etc/sysconfig/tarantool" or "/etc/default/tarantool" - +# They're supported by our start-stop utility - dist.lua + +# Usual way for RPM-based distros +# 2) Create a file "/etc/systemd/system/tarantool.service", +# containing +# .include /usr/lib/systemd/system/tarantool.service +# # Here're your changes +# +# For example, if you want to change CONF_DIR create +# "/etc/systemd/system/tarantool.service" containing: +# .include /usr/lib/systemd/system/tarantool.service +# [Service] +# Environment=CONF_DIR=/etc/tarantool/instances.other +# This will override the settings appearing below + +[Unit] +Description=Tarantool instances +After=network.target +Documentation=man:tarantool(1) + +[Service] +Type=forking +User=tarantool +Group=tarantool +OOMScoreAdjust=-1000 + +ExecStart=@SYSV_INITD_PATH@ start +ExecStop=@SYSV_INITD_PATH@ stop + +TimeoutSec=300 diff --git a/extra/rpm/tarantool.rpm.spec.in b/extra/rpm/tarantool.rpm.spec.in index 64f7edd8e6a5496b4c2107c53bd0db71b2597e23..0830ca47854be1617762b762e626fc704b061719 100644 --- a/extra/rpm/tarantool.rpm.spec.in +++ b/extra/rpm/tarantool.rpm.spec.in @@ -16,6 +16,11 @@ %bcond_without postgresql %bcond_without mysql +%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 +%global _with_systemd 1 +%endif +%bcond_with systemd + BuildRequires: readline-devel %if 0%{?rhel} < 7 && 0%{?rhel} > 0 @@ -32,6 +37,20 @@ BuildRequires: binutils-devel BuildRequires: perl-podlators %endif +Requires(pre): /usr/sbin/useradd +Requires(pre): /usr/sbin/groupadd +%if %{with systemd} +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +BuildRequires: systemd +%else +Requires(post): chkconfig +Requires(post): initscripts +Requires(preun): chkconfig +Requires(preun): initscripts +%endif + # Strange bug. # Fix according to http://www.jethrocarr.com/2012/05/23/bad-packaging-habits/ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -140,8 +159,22 @@ tarantool-sql-module. if rpm.expand("%{with "..obj.."}") then status = "ON" end - return " -D"..flag.."="..status + return cmake_key_value(flag, status) end + local function dev_with_kv (obj, key, value) + if rpm.expand("%{with "..obj.."}") then + return cmake_key_value(key, value) + end + return "" + end + local function dev_without (obj, flag) + local status = "ON" + if rpm.expand("%{without "..obj.."}") then + status = "OFF" + end + return cmake_key_value(flag, status) + end + local cmd = 'cmake' if is_rhel_old() then cmd = 'cmake28' @@ -165,6 +198,8 @@ tarantool-sql-module. .. ' %{?scl:-DENABLE_RPM_SCL=ON}' .. dev_with('postgresql', 'WITH_POSTGRESQL') .. dev_with('mysql', 'WITH_MYSQL') + .. dev_with('systemd', 'WITH_SYSTEMD') + .. dev_with_kv('systemd', 'SYSTEMD_SERVICES_INSTALL_DIR', '%{_unitdir}') print(wrap_with_toolset(cmd)) } @@ -173,16 +208,46 @@ tarantool-sql-module. print(wrap_with_toolset('make %{?_smp_mflags}\n')) } %install -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/tarantool/instances.enabled -make DESTDIR=%{buildroot} install +make VERBOSE=1 DESTDIR=%{buildroot} install + +%pre +/usr/sbin/groupadd -r tarantool > /dev/null 2>&1 || : +%if 0%{?rhel} < 6 +/usr/sbin/useradd -M -g tarantool -r -d /var/lib/tarantool -s /sbin/nologin\ + -c "Tarantool Server" tarantool > /dev/null 2>&1 || : +%else +/usr/sbin/useradd -M -N -g tarantool -r -d /var/lib/tarantool -s /sbin/nologin\ + -c "Tarantool Server" tarantool > /dev/null 2>&1 || : +%endif %post -chkconfig tarantool on -service tarantool start +mkdir -m 0755 -p %{_var}/run/tarantool/ +chown tarantool:tarantool %{_var}/run/tarantool/ +mkdir -m 0755 -p %{_var}/log/tarantool/ +chown tarantool:tarantool %{_var}/log/tarantool/ +mkdir -m 0755 -p %{_var}/lib/tarantool/ +chown tarantool:tarantool %{_var}/lib/tarantool/ +mkdir -m 0755 -p %{_sysconfdir}/tarantool/instances.enabled/ +chown tarantool:tarantool %{_sysconfdir}/tarantool/instances.enabled/ +%if %{with systemd} +%systemd_post tarantool.service +%else +chkconfig --add tarantool +/sbin/service tarantool start +%endif %preun -service tarantool stop -chkconfig tarantool off +%if %{with systemd} +%systemd_preun tarantool.service +%else +/sbin/service tarantool stop +chkconfig --del tarantool +%endif + +# %%postun +# %%if %%{with systemd} +# %%systemd_postun_with_restart tarantool.service +# %%endif %files %defattr(-,root,root,-) @@ -197,12 +262,16 @@ chkconfig tarantool off "%{_mandir}/man1/tarantool.1.gz" "%{_sysconfdir}/sysconfig/tarantool" + +%if %{with systemd} +"%{_unitdir}/tarantool.service" +"%{_libdir}/tarantool/tarantool.init" +%else "%{_sysconfdir}/init.d/tarantool" -%dir "%{_sysconfdir}/tarantool" -%dir "%{_sysconfdir}/tarantool/instances.enabled" +%endif %dir "%{_libdir}/tarantool/" -"%{_libdir}/tarantool/dist.lua" +"%{_bindir}/tarantool_ctl" %files sql-module %defattr(-,root,root,-)