lib/runit-man/service_status.rb in runit-man-1.8.3 vs lib/runit-man/service_status.rb in runit-man-1.8.4

- old
+ new

@@ -1,52 +1,78 @@ -class ServiceStatus - def initialize(data) - # status in daemontools supervise format - # look at runit's sv.c for details - data = !data.nil? && data.length == 20 ? data : nil - @raw = data.nil? ? nil : data.unpack('NNxxxxVxa1CC') - end - - def down? - status_byte == 0 - end - - def run? - status_byte == 1 - end - - def finish? - status_byte == 2 - end - - def pid - @pid ||= down? ? nil : @raw[2] - end - - def started_at - # from TAI to Unix - @started_at ||= @raw ? Time.at((@raw[0] << 32) + @raw[1] - 4611686018427387914) : nil - end - - def uptime - @uptime ||= down? ? nil : Time.now - started_at - end - - def want_up? - @raw && !pid && @raw[3] == 'u' - end - - def want_down? - pid && @raw[3] == 'd' - end - - def got_term? - pid && @raw[4] != 0 - end - -private - def status_byte - @status_byte ||= @raw ? @raw[5] : 0 - end - -end - +class ServiceStatus + STATUS_SIZE = 20 + # state + S_DOWN = 0 + S_RUN = 1 + S_FINISH = 2 + + def initialize(data) + # status in daemontools supervise format + # look at runit's sv.c for details + data = (!data.nil? && data.length == STATUS_SIZE) ? data : nil + @raw = data.nil? ? nil : data.unpack('NNxxxxVxa1CC') + end + + def inactive? + @raw.nil? + end + + def down? + status_byte == S_DOWN + end + + def run? + status_byte == S_RUN + end + + def finish? + status_byte == S_FINISH + end + + def pid + @pid ||= down? ? nil : @raw[2] + end + + def started_at + # from TAI to Unix + @started_at ||= @raw ? Time.at((@raw[0] << 32) + @raw[1] - 4611686018427387914) : nil + end + + def uptime + @uptime ||= down? ? nil : Time.now - started_at + end + + def want_up? + @raw && !pid && @raw[3] == 'u' + end + + def want_down? + pid && @raw[3] == 'd' + end + + def got_term? + pid && @raw[4] != 0 + end + + def to_s + # try to mimics stat behaviour to minimize readings + result = status_string + result += ', got TERM' if got_term? + result += ', want down' if want_down? + result += ', want up' if want_up? + result + end + +private + def status_byte + @status_byte ||= @raw ? @raw[5] : 0 + end + + def status_string + case status_byte + when S_DOWN then 'down' + when S_RUN then 'run' + when S_FINISH then 'finish' + end + end +end +