From 9c50537afa556de3bfa9605cb638e4888655bdbe Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 12:34:10 -0200 Subject: [PATCH 01/14] Ignore *.gem files. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c00df13..39897ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.deb +*.gem From b75edf4d10cc5012b32cc0f49517d3aa094f338f Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 12:34:26 -0200 Subject: [PATCH 02/14] Modern markdown. --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index bd8b9ab..2108968 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -mmonit-ruby -=========== +# mmonit-ruby +---- Ruby interface for M/Monit @@ -7,11 +7,9 @@ All the commands listed here are currently available: http://mmonit.com/wiki/MMonit/HTTP-API -Requests are read-only until I find a way to do more. - - - +## Examples +``` mmonit = MMonit::Connection.new({ :ssl => true, :username => 'USERNAME', @@ -26,10 +24,12 @@ hosts = mmonit.hosts p hosts - +``` Custom requests can be made like: -mmonit.request(path, [body]) + mmonit.request(path, [body]) + +## TODO -body is optional \ No newline at end of file +Requests are read-only until I find a way to do more. From acf27153793fd8b1ec6313996082e2f863654def Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 12:34:51 -0200 Subject: [PATCH 03/14] Version 0.0.5. --- lib/mmonit/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mmonit/version.rb b/lib/mmonit/version.rb index 0a3f29c..a6b0a9e 100644 --- a/lib/mmonit/version.rb +++ b/lib/mmonit/version.rb @@ -1,3 +1,3 @@ module MMonit - VERSION = "0.0.4" + VERSION = "0.0.5" end From aa4f00c9872c2076853b21a0b7f3bdfa182391f8 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 12:35:32 -0200 Subject: [PATCH 04/14] Specify gem files staticaly. --- mmonit.gemspec | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mmonit.gemspec b/mmonit.gemspec index 7626487..cff0675 100644 --- a/mmonit.gemspec +++ b/mmonit.gemspec @@ -1,15 +1,16 @@ # -*- encoding: utf-8 -*- -$:.unshift File.expand_path("../lib", __FILE__) -require "mmonit/version" + +require "./lib/mmonit/version" Gem::Specification.new do |gem| gem.authors = ['Josh Blancett'] gem.email = ['joshblancett@gmail.com'] gem.homepage = 'http://github.com/jblancett/mmonit-ruby' gem.summary = 'Ruby interface to M/Monit' - gem.description = gem.summary + gem.description = "Ruby interface for M/Monit\nAll the commands listed here are currently available:\nhttp://mmonit.com/wiki/MMonit/HTTP-API\n" gem.name = 'mmonit' - gem.files = `git ls-files`.split("\n") + gem.files = Dir["README.md", "lib/**/*"] gem.require_paths = ['lib'] gem.version = MMonit::VERSION + gem.license = 'MIT' end From a484ec9b1c159790f637f7af3f06ff152d56ebde Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 13:04:25 -0200 Subject: [PATCH 05/14] z_csrf_protection=off --- lib/mmonit/connection.rb | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index bb7dc09..c92b4a4 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -18,7 +18,6 @@ def initialize(options = {}) @useragent = options[:useragent] @headers = { 'Host' => @address, - 'Referer' => "#{@url}/index.csp", 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => @useragent, 'Connection' => 'keepalive' @@ -33,32 +32,32 @@ def connect @http.verify_mode = OpenSSL::SSL::VERIFY_NONE end - @headers['Cookie'] = @http.get('/index.csp').response['set-cookie'].split(';').first + @headers['Cookie'] = @http.get('/index.csp', initheader = @headers).response['set-cookie'].split(';').first self.login end def login - self.request('/z_security_check', "z_username=#{@username}&z_password=#{@password}").code.to_i == 302 + self.request('/z_security_check', "z_username=#{@username}&z_password=#{@password}&z_csrf_protection=off").code.to_i == 302 end def status - JSON.parse(self.request('/json/status/list').body)['records'] + JSON.parse(self.request('/status/list').body)['records'] end def hosts - JSON.parse(self.request('/json/admin/hosts/list').body)['records'] + JSON.parse(self.request('/admin/hosts/list').body)['records'] end def users - JSON.parse(self.request('/json/admin/users/list').body) + JSON.parse(self.request('/admin/users/list').body) end def alerts - JSON.parse(self.request('/json/admin/alerts/list').body) + JSON.parse(self.request('/admin/alerts/list').body) end def events - JSON.parse(self.request('/json/events/list').body)['records'] + JSON.parse(self.request('/events/list').body)['records'] end #### topography and reports are disabled until I figure out their new equivalent in M/Monit @@ -79,7 +78,7 @@ def find_host(fqdn) # another option: /admin/hosts/json/get?id=#### def get_host_details(id) - JSON.parse(self.request("/json/status/detail?hostid=#{id}").body)['records']['host'] rescue nil + JSON.parse(self.request("/status/detail?hostid=#{id}").body)['records']['host'] rescue nil end def delete_host(host) @@ -90,7 +89,11 @@ def delete_host(host) def request(path, body="", headers = {}) self.connect unless @http.is_a?(Net::HTTP) - @http.post(path, body, @headers.merge(headers)) + if body == "" + @http.get(path, initheader = @headers.merge(headers)) + else + @http.post(path, body, @headers.merge(headers)) + end end end -end \ No newline at end of file +end From d06c6cd295b42da093d7dbc3df14667a780dae39 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 13:08:10 -0200 Subject: [PATCH 06/14] Add groups listing. --- lib/mmonit/connection.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index c92b4a4..9770b02 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -48,6 +48,10 @@ def hosts JSON.parse(self.request('/admin/hosts/list').body)['records'] end + def groups + JSON.parse(self.request('/admin/groups/list').body) + end + def users JSON.parse(self.request('/admin/users/list').body) end From dda34f147e960671991e09d9c5872d5918e3352b Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 13:16:47 -0200 Subject: [PATCH 07/14] Add delete_group method. --- lib/mmonit/connection.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index 9770b02..e644414 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -80,6 +80,11 @@ def find_host(fqdn) host.empty? ? nil : host.first end + def find_group(group) + groups = self.groups.select{ |g| g['name'] == group } + groups.empty? ? nil : groups.first + end + # another option: /admin/hosts/json/get?id=#### def get_host_details(id) JSON.parse(self.request("/status/detail?hostid=#{id}").body)['records']['host'] rescue nil @@ -91,6 +96,12 @@ def delete_host(host) self.request("/admin/hosts/delete?id=#{host['id']}") end + def delete_group(group) + g = self.find_group(group) unless group.key?('id') + return false unless g['id'] + self.request("/admin/groups/delete", "id=#{g['id']}") + end + def request(path, body="", headers = {}) self.connect unless @http.is_a?(Net::HTTP) if body == "" From e4c0a529d1dc0c207c33e69ef06702803095f844 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 13:26:16 -0200 Subject: [PATCH 08/14] Add add_group method ("/admin/groups/add"). --- lib/mmonit/connection.rb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index e644414..050df28 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -97,9 +97,20 @@ def delete_host(host) end def delete_group(group) - g = self.find_group(group) unless group.key?('id') - return false unless g['id'] - self.request("/admin/groups/delete", "id=#{g['id']}") + group = self.find_group(group) unless group.key?('id') + return false unless group['id'] + self.request("/admin/groups/delete", "id=#{group['id']}") + end + + def create_group(group) + self.request("/admin/groups/create", "name=#{group}") + end + + def add_group(group, host) + group = self.find_group(group) unless group.key?('id') + host = self.find_host(host) unless host.key('id') + return false unless group['id'] + self.request("/admin/groups/add", "id=#{group['id']}&hostid=#{host['id']}") end def request(path, body="", headers = {}) From 61893310a0ac4518878efa9a0e087b27a09bbc85 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 13:28:06 -0200 Subject: [PATCH 09/14] Add logout method. --- lib/mmonit/connection.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index 050df28..aa6ca89 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -40,6 +40,10 @@ def login self.request('/z_security_check', "z_username=#{@username}&z_password=#{@password}&z_csrf_protection=off").code.to_i == 302 end + def logout + self.request('/login/logout.csp') + end + def status JSON.parse(self.request('/status/list').body)['records'] end From 9219bd3146c0556d2fd82e2acfd3829c43a95b19 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 14:15:36 -0200 Subject: [PATCH 10/14] Fix groups methods. --- README.md | 2 +- lib/mmonit/connection.rb | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2108968..305bc05 100644 --- a/README.md +++ b/README.md @@ -32,4 +32,4 @@ Custom requests can be made like: ## TODO -Requests are read-only until I find a way to do more. +- Review events methods diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index aa6ca89..c5dc131 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -43,7 +43,7 @@ def login def logout self.request('/login/logout.csp') end - + def status JSON.parse(self.request('/status/list').body)['records'] end @@ -53,7 +53,7 @@ def hosts end def groups - JSON.parse(self.request('/admin/groups/list').body) + JSON.parse(self.request('/admin/groups/list').body)['groups'] end def users @@ -111,9 +111,10 @@ def create_group(group) end def add_group(group, host) - group = self.find_group(group) unless group.key?('id') - host = self.find_host(host) unless host.key('id') - return false unless group['id'] + puts host + group = self.find_group(group) unless group.kind_of?(Hash) && group.key?('id') + host = self.find_host(host) unless host.kind_of?(Hash) && host.key('id') + return false unless group['id'] && host['id'] self.request("/admin/groups/add", "id=#{group['id']}&hostid=#{host['id']}") end From 165af284d19ddbaaddee446008478dbce66c1784 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 14:36:34 -0200 Subject: [PATCH 11/14] Adaptations to the new API. --- lib/mmonit/connection.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index c5dc131..ad0a6f5 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -80,7 +80,7 @@ def events # end def find_host(fqdn) - host = self.hosts.select{ |h| h['host'] == fqdn } + host = self.hosts.select{ |h| h['hostname'] == fqdn } host.empty? ? nil : host.first end @@ -89,9 +89,8 @@ def find_group(group) groups.empty? ? nil : groups.first end - # another option: /admin/hosts/json/get?id=#### def get_host_details(id) - JSON.parse(self.request("/status/detail?hostid=#{id}").body)['records']['host'] rescue nil + JSON.parse(self.request("/status/hosts/get?id=#{id}").body)['records']['host'] rescue nil end def delete_host(host) @@ -111,7 +110,6 @@ def create_group(group) end def add_group(group, host) - puts host group = self.find_group(group) unless group.kind_of?(Hash) && group.key?('id') host = self.find_host(host) unless host.kind_of?(Hash) && host.key('id') return false unless group['id'] && host['id'] From 1c14052b0a236e171f22eb7ad2c665cca3bfba7f Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Sat, 23 Jan 2016 14:51:36 -0200 Subject: [PATCH 12/14] Simplify code. --- lib/mmonit/connection.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index ad0a6f5..bf46b2e 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -110,8 +110,8 @@ def create_group(group) end def add_group(group, host) - group = self.find_group(group) unless group.kind_of?(Hash) && group.key?('id') - host = self.find_host(host) unless host.kind_of?(Hash) && host.key('id') + group = self.find_group(group) if group.is_a?(String) + host = self.find_host(host) if host.is_a?(String) return false unless group['id'] && host['id'] self.request("/admin/groups/add", "id=#{group['id']}&hostid=#{host['id']}") end From 72e39da1c78b4c786283f7b19f36418103d6121b Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Mon, 25 Jan 2016 18:46:26 -0200 Subject: [PATCH 13/14] Accept polymorphic hosts on add_group method. --- lib/mmonit/connection.rb | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/mmonit/connection.rb b/lib/mmonit/connection.rb index bf46b2e..456abc0 100644 --- a/lib/mmonit/connection.rb +++ b/lib/mmonit/connection.rb @@ -109,11 +109,17 @@ def create_group(group) self.request("/admin/groups/create", "name=#{group}") end - def add_group(group, host) + def add_group(group, hostids) group = self.find_group(group) if group.is_a?(String) - host = self.find_host(host) if host.is_a?(String) - return false unless group['id'] && host['id'] - self.request("/admin/groups/add", "id=#{group['id']}&hostid=#{host['id']}") + return false unless group['id'] + if hostids.is_a?(Array) + hostids_str = hostids.join('&hostid=') + elsif hostids.is_a?(String) + hostids_str = hostids + elsif hostid.key('id') + hostids_str = hostids['id'] + end + self.request("/admin/groups/add", "id=#{group['id']}&hostid=#{hostids_str}") end def request(path, body="", headers = {}) From 5793273fdb15b127a134e27dc655969a5a1b86d8 Mon Sep 17 00:00:00 2001 From: Nedimar Paulo Turatti Date: Tue, 26 Jan 2016 12:21:20 -0200 Subject: [PATCH 14/14] Version 0.0.6. --- lib/mmonit/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mmonit/version.rb b/lib/mmonit/version.rb index a6b0a9e..f600647 100644 --- a/lib/mmonit/version.rb +++ b/lib/mmonit/version.rb @@ -1,3 +1,3 @@ module MMonit - VERSION = "0.0.5" + VERSION = "0.0.6" end