Browse Source

Add basic support for dinit in our system service handling code. (#16836)

* Add basic dinit detection to install-service script.

* Add dinit service file for Netdata.

* Add service install support for dinit.
Austin S. Hemmelgarn 11 months ago
parent
commit
0401ac56f7
3 changed files with 76 additions and 1 deletions
  1. 5 0
      CMakeLists.txt
  2. 11 0
      system/dinit/netdata.in
  3. 60 1
      system/install-service.sh.in

+ 5 - 0
CMakeLists.txt

@@ -2333,6 +2333,11 @@ install(PROGRAMS
         ${CMAKE_BINARY_DIR}/system/runit/run
         DESTINATION usr/lib/netdata/system/runit)
 
+configure_file(system/dinit/netdata.in system/dinit/netdata @ONLY)
+install(FILES
+        ${CMAKE_BINARY_DIR}/system/dinit/netdata
+        DESTINATION usr/lib/netdata/system/dinit)
+
 configure_file(system/systemd/netdata.service.in system/systemd/netdata.service @ONLY)
 install(FILES
         ${CMAKE_BINARY_DIR}/system/systemd/netdata.service

+ 11 - 0
system/dinit/netdata.in

@@ -0,0 +1,11 @@
+# dinit service description for Netdata
+#
+# Currently only properly tested on Chimera Linux.
+
+type = bgprocess
+command = @sbindir_POST@/netdata -P @localstatedir_POST@/run/netdata.pid -D
+pid-file = @localstatedir_POST@/run/netdata.pid
+options = signal-process-only
+load-options = export-passwd-vars
+depends-on = early-fs-local.target
+after = network.target

+ 60 - 1
system/install-service.sh.in

@@ -29,7 +29,7 @@ DUMP_CMDS=0
 ENABLE="auto"
 EXPORT_CMDS=0
 INSTALL=1
-LINUX_INIT_TYPES="systemd openrc lsb initd runit"
+LINUX_INIT_TYPES="systemd openrc lsb initd runit dinit"
 PLATFORM="$(uname -s)"
 SHOW_SVC_TYPE=0
 SVC_SOURCE="@libsysdir_POST@"
@@ -562,6 +562,65 @@ runit_cmds() {
   NETDATA_STOP_CMD="sv stop netdata"
 }
 
+# =====================================================================
+# dinit support functions
+
+_check_dinit() {
+  # if /etc/dinit.d does not exist, it’s not dinit
+  [ ! -d /etc/dinit.d ] && echo "NO" && return 0
+
+  # if PID 1 is dinit, it’s dinit
+  [ "$(basename "$(readlink /proc/1/exe)" 2> /dev/null)" = "dinit" ] && echo "YES" && return 0
+
+  # if /run/dinitctl exists and is a socket, it’s dinit
+  [ -S /run/dinitctl ] && echo "YES" && return 0
+
+  # if the dinitctl command exists despite getting to this point, it’s dinit, but not booted as such
+  [ -n "$(command -v dinitctl 2>/dev/null || true)" ] && echo "OFFLINE" && return 0
+
+  echo "NO" && return 0
+}
+
+check_dinit() {
+  if [ -z "${IS_DINIT}" ]; then
+    IS_DINIT="$(_check_dinit)"
+  fi
+
+  echo "${IS_DINIT}"
+}
+
+_run_dinitctl() {
+  opts=''
+
+  if [ "$(check_dinit)" = "OFFLINE" ]; then
+    opts="-o"
+  fi
+
+  # shellcheck disable=SC2086
+  dinitctl ${opts} "${@}"
+}
+
+enable_dinit() {
+  _run_dinitctl enable netdata
+}
+
+enable_dinit() {
+  _run_dinitctl disable netdata
+}
+
+install_dinit_service() {
+  install_generic_service dinit/netdata "dinit" /etc/dinit.d enable_dinit disable_dinit
+}
+
+dinit_cmds() {
+  if [ "$(check_dinit)" = "YES" ]; then
+    NETDATA_START_CMD='dinitctl start netdata'
+    NETDATA_STOP_CMD='dinitct stop netdata'
+  else # Not booted using dinit, use external defaults by not providing commands.
+    warning "Detected dinit, but the system is not booted using dinit. Unable to provide commands to start or stop Netdata using the service manager."
+  fi
+}
+
 # =====================================================================
 # WSL support functions