This is an automated email from the ASF dual-hosted git repository.

martinzink pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 3776bd071c3728c438a9841eba5510b2dfa7cd75
Author: Adam Debreceni <adebrec...@apache.org>
AuthorDate: Tue Mar 12 13:50:49 2024 +0100

    MINIFICPP-2296 - Install service on macOS
    
    Closes #1726
    Signed-off-by: Martin Zink <martinz...@apache.org>
---
 bin/minifi.plist |  25 +++++++++++
 bin/minifi.sh    | 128 +++++++++++++++++++++++++++++++++++++++++++------------
 2 files changed, 126 insertions(+), 27 deletions(-)

diff --git a/bin/minifi.plist b/bin/minifi.plist
new file mode 100644
index 000000000..567229c6c
--- /dev/null
+++ b/bin/minifi.plist
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
+<plist version="1.0">
+<dict>
+    <key>Label</key>
+    <string>org.apache.nifi.minifi</string>
+    <key>ProgramArguments</key>
+    <array>
+        <string>/opt/minifi-cpp/bin/minifi</string>
+    </array>
+    <key>EnvironmentVariables</key>
+    <dict>
+        <key>MINIFI_HOME</key>
+        <string>/opt/minifi-cpp</string>
+    </dict>
+    <key>RunAtLoad</key>
+    <true/>
+    <key>KeepAlive</key>
+    <false/>
+    <key>StandardOutPath</key>
+    <string>/var/log/minifi.log</string>
+    <key>StandardErrorPath</key>
+    <string>/var/log/minifi.err</string>
+</dict>
+</plist>
diff --git a/bin/minifi.sh b/bin/minifi.sh
index 33a395a53..b3f15ab68 100755
--- a/bin/minifi.sh
+++ b/bin/minifi.sh
@@ -54,18 +54,35 @@ detectOS() {
          export LDR_CNTRL=MAXDATA=0xB0000000@DSA
          echo ${LDR_CNTRL}
     fi
+
+    if [ "${cygwin}" = "true" ]; then
+       echo 'Apache MiNiFi as a service is not supported on Cygwin.'
+       exit 1
+    fi
 }
 
-install() {
-    detectOS
-    if [ "${darwin}" = "true"  ] || [ "${cygwin}" = "true" ]; then
-        echo 'Installing Apache MiNiFi as a service is not supported on OS X 
or Cygwin.'
+install_macos() {
+    target_dir="/Library/LaunchDaemons"
+    echo "Installing MiNiFi as a LaunchDaemon to ${target_dir}"
+    cp -fv "${bin_dir}"/minifi.plist "${target_dir}"
+    chmod 644 "${target_dir}"/minifi.plist
+    sed -i '' "s|/opt/minifi-cpp|${MINIFI_HOME}|g" "${target_dir}"/minifi.plist
+    launchctl load -w "${target_dir}"/minifi.plist
+}
+
+uninstall_macos() {
+    launchctl unload "/Library/LaunchDaemons/minifi.plist" 2>/dev/null
+    rm -fv "/Library/LaunchDaemons/minifi.plist" || :
+}
+
+check_service_installed_macos() {
+    if [ ! -f "/Library/LaunchDaemons/minifi.plist" ]; then
+        echo "MiNiFi is not installed as a service. Please run 'minifi.sh 
install' first."
         exit 1
     fi
+}
 
-    echo "Uninstalling any previous versions"
-    uninstall
-
+install_linux() {
     target_dir="/usr/local/lib/systemd/system"
     mkdir -p "${target_dir}" || die "Unable to create ${target_dir}. Cannot 
install MiNiFi as a service."
 
@@ -77,13 +94,7 @@ install() {
     systemctl enable minifi.service
 }
 
-uninstall() {
-    detectOS
-    if [ "${darwin}" = "true"  ] || [ "${cygwin}" = "true" ]; then
-        echo 'Apache MiNiFi as a service is not supported on OS X or Cygwin.'
-        exit 1
-    fi
-
+uninstall_linux() {
     # Uninstall legacy init.d service files, if exists
     rm -fv "/etc/init.d/minifi" || :
     rm -fv "/etc/rc2.d/S65minifi" || :
@@ -94,39 +105,102 @@ uninstall() {
     systemctl daemon-reload
 }
 
-check_service_installed() {
+check_service_installed_linux() {
     if [ ! -f "/usr/local/lib/systemd/system/minifi.service" ]; then
         echo "MiNiFi is not installed as a service. Please run 'minifi.sh 
install' first."
         exit 1
     fi
 }
 
+install() {
+    echo "Uninstalling any previous versions"
+    uninstall
+
+    detectOS
+    if [ "${darwin}" = "true"  ]; then
+      install_macos
+    else
+      install_linux
+    fi
+}
+
+uninstall() {
+    detectOS
+    if [ "${darwin}" = "true"  ]; then
+      uninstall_macos
+    else
+      uninstall_linux
+    fi
+}
+
+check_service_installed() {
+    detectOS
+    if [ "${darwin}" = "true"  ]; then
+      check_service_installed_macos
+    else
+      check_service_installed_linux
+    fi
+}
+
+start_service() {
+    check_service_installed
+    if [ "${darwin}" = "true"  ]; then
+      launchctl start org.apache.nifi.minifi
+    else
+      systemctl start minifi.service
+    fi
+    echo "MiNiFi started"
+}
+
+stop_service() {
+    check_service_installed
+    if [ "${darwin}" = "true"  ]; then
+      launchctl stop org.apache.nifi.minifi
+    else
+      systemctl stop minifi.service
+    fi
+    echo "MiNiFi stopped"
+}
+
+restart_service() {
+    check_service_installed
+    if [ "${darwin}" = "true"  ]; then
+      launchctl stop org.apache.nifi.minifi
+      launchctl start org.apache.nifi.minifi
+    else
+      systemctl restart minifi.service
+    fi
+    echo "MiNiFi restarted"
+}
+
+status_service() {
+    check_service_installed
+    if [ "${darwin}" = "true"  ]; then
+      launchctl list | grep org.apache.nifi.minifi
+    else
+      systemctl status minifi.service
+    fi
+}
+
 case "$1" in
     start)
-      check_service_installed
-      systemctl start minifi.service
-      echo "MiNiFi started"
+      start_service
       ;;
     stop)
-      check_service_installed
-      systemctl stop minifi.service
-      echo "MiNiFi stopped"
+      stop_service
       ;;
     run)
       exec "${minifi_executable}"
       ;;
     status)
-      check_service_installed
-      systemctl status minifi.service
+      status_service
       ;;
     restart)
-      check_service_installed
-      systemctl restart minifi.service
-      echo "MiNiFi restarted"
+      restart_service
       ;;
     install)
       install "$@"
-      echo "Service minifi installed. Please start it using 'minifi.sh start' 
or 'systemctl start minifi.service'"
+      echo "Service minifi installed. Please start it using 'minifi.sh start'"
       ;;
     uninstall)
       uninstall "$@"

Reply via email to