Files
sentinel/systemd_notifier.rb
T

57 lines
2.0 KiB
Ruby
Raw Normal View History

# <<*>> -^v- SNOWARE APPLICATION
# usage: Notify systemd.
# author: S.A.
# time: 2026-06-07
# Copyright (c) [2026] [S.A. SNOWARE-SCU]
# [MineSentinel] is licensed under Mulan PubL v2.
# You can use this software according to the terms and conditions of the Mulan PubL v2.
# You may obtain a copy of Mulan PubL v2 at:
# http://license.coscl.org.cn/MulanPubL-2.0
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PubL v2 for more details.
# frozen_string_literal: true
class SystemdNotifier
require_relative 'method_executor'
public
@notify_socket = ENV["NOTIFY_SOCKET"]
@watchdog_usec = (ENV["WATCHDOG_USEC"] || '0').to_i
unless @notify_socket && File.socket?(@notify_socket)
MethodExecutor.record("error", "heartbeat", "NOTIFY_SOCKET is not set or is not a socket, am I a service?")
@enable_heartbeat = false
else
2026-06-08 07:41:13 +08:00
MethodExecutor.record("debug", "heartbeat", "Found NOTIFY_SOCKET, enabling heartbeat")
@enable_heartbeat = true
2026-06-08 08:10:18 +08:00
# Fix(2026-06-08): 将 UNIXSocket(SOCK_STREAM) 改为 SOCK_DGRAM
# systemd NOTIFY_SOCKET 是 datagram socket,用 stream socket 连接会报
# Protocol wrong type for socket (Errno::EPROTOTYPE)
@socket = Socket.new(Socket::AF_UNIX, Socket::SOCK_DGRAM)
@socket.connect(Socket.pack_sockaddr_un(@notify_socket))
2026-06-08 07:41:13 +08:00
MethodExecutor.record("debug", "heartbeat", "Heartbeat socket opened")
end
# @return [Boolean]
def enabled?
@enable_heartbeat
end
# @param message [String]
# @return [void]
2026-06-08 07:54:55 +08:00
def self.notify(message)
return unless @enable_heartbeat
begin
@socket.send(message, 0)
2026-06-08 07:41:13 +08:00
MethodExecutor.record("debug", "heartbeat", "Heartbeat sent: #{message}")
rescue => e
MethodExecutor.record("error", "heartbeat", "Failed to send heartbeat: #{e}")
@enable_heartbeat = false
end
end
end