diff --git a/.gitignore b/.gitignore index c361076..88e2cda 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ pkg/* .bundle .yardoc doc/* -Gemfile.lock \ No newline at end of file +Gemfile.lock +.idea/ diff --git a/lib/monit.rb b/lib/monit.rb index 0b5db5e..e47d8cd 100644 --- a/lib/monit.rb +++ b/lib/monit.rb @@ -1,3 +1,4 @@ +require "monit/constants" require "monit/httpd" require "monit/platform" require "monit/server" diff --git a/lib/monit/constants.rb b/lib/monit/constants.rb new file mode 100644 index 0000000..ff32fdd --- /dev/null +++ b/lib/monit/constants.rb @@ -0,0 +1,61 @@ +# Constants from monit sources: +# - monit.h +# - event.h +module Monit + MONITOR_NOT = 0 + MONITOR_YES = 1 + MONITOR_INIT = 2 + MONITOR_WAITING = 4 + + MONITORMODE_ACTIVE = 0 + MONITORMODE_PASSIVE = 1 + MONITORMODE_MANUAL = 2 + + PENDINGACTION_IGNORE = 0 + PENDINGACTION_ALERT = 1 + PENDINGACTION_RESTART = 2 + PENDINGACTION_STOP = 3 + PENDINGACTION_EXEC = 4 + PENDINGACTION_UNMONITOR = 5 + PENDINGACTION_START = 6 + PENDINGACTION_MONITOR = 7 + + STATE_SUCCEEDED = 0 + STATE_FAILED = 1 + STATE_CHANGED = 2 + STATE_CHANGEDNOT = 3 + STATE_INIT = 4 + + SERVICE_TYPE_FILESYSTEM = 0 + SERVICE_TYPE_DIRECTORY = 1 + SERVICE_TYPE_FILE = 2 + SERVICE_TYPE_PROCESS = 3 + SERVICE_TYPE_HOST = 4 + SERVICE_TYPE_SYSTEM = 5 + SERVICE_TYPE_FIFO = 6 + SERVICE_TYPE_PROGRAM = 7 + + STATUS_CHECKSUM = 0x1 + STATUS_RESOURCE = 0x2 + STATUS_TIMEOUT = 0x4 + STATUS_TIMESTAMP = 0x8 + STATUS_SIZE = 0x10 + STATUS_CONNECTION = 0x20 + STATUS_PERMISSION = 0x40 + STATUS_UID = 0x80 + STATUS_GID = 0x100 + STATUS_NONEXIST = 0x200 + STATUS_INVALID = 0x400 + STATUS_DATA = 0x800 + STATUS_EXEC = 0x1000 + STATUS_FSFLAG = 0x2000 + STATUS_ICMP = 0x4000 + STATUS_CONTENT = 0x8000 + STATUS_INSTANCE = 0x10000 + STATUS_ACTION = 0x20000 + STATUS_PID = 0x40000 + STATUS_PPID = 0x80000 + STATUS_HEARTBEAT = 0x100000 + STATUS_STATUS = 0x200000 + STATUS_UPTIME = 0x40000 +end diff --git a/lib/monit/service.rb b/lib/monit/service.rb index 8536e23..22acb30 100644 --- a/lib/monit/service.rb +++ b/lib/monit/service.rb @@ -50,6 +50,16 @@ def do(action) end end + def has_errors?(code = nil, exact = false) + if code.nil? or code == 0 + self.status.to_i != 0 and self.status_hint.to_i == 0 + elsif exact + self.status.to_i == code and self.status_hint.to_i == 0 + else + (self.status.to_i & code) != 0 and (self.status_hint.to_i & code) == 0 + end + end + private # Renames the Service type from "type" to "service_type" to avoid conflicts def rename_service_type(hash) diff --git a/spec/monit_spec.rb b/spec/monit_spec.rb index 4fcb969..e5532af 100644 --- a/spec/monit_spec.rb +++ b/spec/monit_spec.rb @@ -220,5 +220,35 @@ service.do(:start).should == false end end + + describe "status checking" do + it "should not has errors" do + service.has_errors?.should == false + service.has_errors?(0).should == false + service.has_errors?(0, true).should == false + end + + it "should has execution failed errors" do + # execution failed errors + service.status = "4608" + service.status_hint = "0" + + service.has_errors?.should == true + service.has_errors?(Monit::STATUS_EXEC).should == true + service.has_errors?(Monit::STATUS_NONEXIST).should == true + service.has_errors?(Monit::STATUS_EXEC | Monit::STATUS_NONEXIST).should == true + service.has_errors?(Monit::STATUS_EXEC, true).should == false + service.has_errors?(Monit::STATUS_EXEC | Monit::STATUS_NONEXIST, true).should == true + end + + it "should has non-error status" do + # execution failed errors + service.status = Monit::STATUS_PID.to_s + service.status_hint = Monit::STATUS_PID.to_s + + service.has_errors?.should == false + service.has_errors?(Monit::STATUS_PID).should == false + end + end end end