uptrends_extended 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NjM1MTE1NWJkOGE5ZmI3N2U4N2FjNzFjNWUzYmMyNjFlMjQzZTQ4Nw==
5
+ data.tar.gz: !binary |-
6
+ ZDE4ZmZiNGEwMjMxMTU4NDdhNmE0ZDBiOTEzYjAzMjI3NDY3MjBlMA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OTZmNjZkMGJmZTIxNDAxN2E5NzM3NDJjZDk3OGI2NzU3YTQ3ZTA0YzBiZDQy
10
+ YjY0ZDM4ZWY2MGQxMTA5MTIxZWM0YjgyNTI2YmY4YWE3YzMwOGFhNjQ5Nzhi
11
+ NGFjMThmYzkwYWRhZWY0MTIyNzJmZGFhZWI0NGNiMmYyNjRlNWY=
12
+ data.tar.gz: !binary |-
13
+ ZTBiYTgwYjk0NGY1NmZhZGU0NzIzYjgzNThhN2IwNmE0NWU1ZDJjMzczZDEw
14
+ YjFlZjhhN2M2NTJhZWQ0ODNmZjg4YzJkZDU1YmUxMWRmNDg1YzBhMzdiNzUx
15
+ Yjg0OTc0ZTIyNjg1ODVmNDZlN2I5MzEwZWUyZDkwYWIzYjAyNjM=
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .idea
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ *.bundle
20
+ *.so
21
+ *.o
22
+ *.a
23
+ mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.5
4
+ - 2.1.0
5
+ - 1.9.3
6
+
7
+ env: UPTRENDS_USERNAME=my@username.com UPTRENDS_PASSWORD=password
8
+
9
+ branches:
10
+ only:
11
+ - master
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # UptrendsExtended Gem Changelog
2
+
3
+ ## 0.7.0
4
+ - Added the statistics part, so you are able to get statistics about probes and probegroups
5
+ - Minor syntax fixes for rails 3 and up
6
+
7
+ ## 0.6.0
8
+ - Completely redesigned the UptrendsExtended::Client class to make it more idiomatic.
9
+ - Completely redesigned the UptrendsExtended::Base class to make it more idiomatic.
10
+ - Added #create!, #update! and #delete! methods to UptrendsExtended::Base
11
+ - Added #enable, #disable, #enable_alerts and #disable_alerts methods to UptrendsExtended::Probe
12
+ - Added #add_probe, #remove_probe and #members methods to UptrendsExtended::ProbeGroup
13
+ - Removed UptrendsExtended::Utils class
14
+
15
+ ## 0.5.0
16
+ - Added UptrendsExtended::Monitor class.
17
+ - Added UptrendsExtended::Client#monitors method to fetch all monitors.
18
+
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in uptrends_extended.gemspec
4
+ gemspec
5
+
6
+ gem 'httparty', '~> 0.13'
7
+ gem 'activesupport', '~> 03.2.13'
8
+
9
+ group :test do
10
+ gem 'webmock'
11
+ gem 'vcr'
12
+ gem 'rake'
13
+ gem 'codeclimate-test-reporter', require: nil
14
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014-2015 Jason Barnett
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Uptrends RESTful API Client
2
+
3
+ [![Code Climate](https://codeclimate.com/github/microting/uptrends-gem/badges/gpa.svg)](https://codeclimate.com/github/microting/uptrends-gem) [![Test Coverage](https://codeclimate.com/github/microting/uptrends-gem/badges/coverage.svg)](https://codeclimate.com/github/microting/uptrends-gem/coverage) [![Build Status](https://travis-ci.org/microting/uptrends-gem.svg)](https://travis-ci.org/microting/uptrends-gem) [![License](http://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](https://github.com/microting/uptrends-gem/blob/master/LICENSE.txt)
4
+
5
+ This is a ruby wrapper around the [Uptrends API][2]. Uptrends is a monitoring service that let's you monitor Web pages, Web services, Mail servers, Database servers, DNS, SSL certificates, FTP and more.
6
+
7
+ NOTE: This is a 3rd party gem and not an official product from Uptrends.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'uptrends_extended'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install uptrends_extended
22
+
23
+ ## Usage
24
+
25
+ require 'uptrends_extended'
26
+ u = UptrendsExtended::Client.new(username: 'my@email.com', password: 'MyP@sswo0rd') #=> #<UptrendsExtended::Client>
27
+
28
+ probes = u.probes #=> [#<UptrendsExtended::Probe>, #<UptrendsExtended::Probe>, ...]
29
+ p = probes.first #=> #<UptrendsExtended::Probe>
30
+ p.attributes #=> [:guid, :name, :url, :port, :check_frequency, :probe_type, :is_active, :generate_alert, :notes, :performance_limit1, :performance_limit2, :error_on_limit1, :error_on_limit2, :min_bytes, :error_on_min_bytes, :timeout, :tcp_connect_timeout, :match_pattern, :dns_lookup_mode, :user_agent, :user_name, :password, :is_competitor, :checkpoints, :http_method, :post_data]
31
+ p.guid #=> "7ef43a1b255949f5a052444348971690"
32
+ p.name #=> "My Probe's Name"
33
+ p.statistics('2015/01/01', '2015/12/31', 'Year') #=> [{"Dimension"=>"2015", "Alerts"=>0, "SLAPercentage"=>99.8, "SLATotalTime"=>2, "SLAOperatorResponseTime"=>15, "AvgOperatorResponseTime"=>0, "PercentageOK"=>99.82507, "PercentageError"=>0.1749256, "PercentageUnknown"=>0, "PercentageUptime"=>99.82507, "TotalChecks"=>3168, "Errors"=>5, "UnconfirmedErrors"=>12, "SecondsOK"=>1893489, "SecondsError"=>3318, "SecondsUnknown"=>0, "AverageTotalTime"=>1.229745, "AverageResolveTime"=>0.1484861, "AverageConnectionTime"=>0.1247686, "AverageDownloadTime"=>0.9560824, "AverageTotalBytes"=>6961}]
34
+ p.uptime_this_year #=> {:sla=>99.8, :uptime=>99.82507}
35
+ p.uptime_last_12_month #=> {:sla=>99.8, :uptime=>99.82158}
36
+
37
+ probe_groups = u.probe_groups #=> [#<UptrendsExtended::ProbeGroup>, #<UptrendsExtended::ProbeGroup>, ... ]
38
+ pg = probe_groups.first #=> #<UptrendsExtended::ProbeGroup>
39
+ pg.attributes #=> [:guid, :name, :is_all, :is_client_probe_group]
40
+ pg.guid #=> "c8d6a0f704494c37823850f3d4fd4273"
41
+ pg.name #=> "All probes"
42
+
43
+ # Let's change the name of the probe:
44
+ p.name = "My Probe's NEW name" #=> "My Probe's NEW name"
45
+ p.update! #=> nil
46
+
47
+ # Let's add our probe to our probe group
48
+ pg.add_probe(p) #=> [#<UptrendsExtended::ProbeGroup>, #<UptrendsExtended::Probe>]
49
+
50
+ ## Contributing
51
+
52
+ 1. Fork it ( https://github.com/microting/uptrends-gem/fork )
53
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
54
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
55
+ 4. Push to the branch (`git push origin my-new-feature`)
56
+ 5. Create a new Pull Request
57
+
58
+
59
+ [1]: https://uptrends.com/
60
+ [2]: http://www.uptrends.com/en/support/api
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = FileList['spec/uptrends_extended/*_spec.rb']
6
+ t.verbose = true
7
+ end
8
+
9
+ task :default => :test
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ require 'uptrends_extended/client'
3
+ require 'uri'
4
+ require 'rack'
5
+
6
+ def parse_uri_for_db(url)
7
+ begin
8
+ uri = URI(url)
9
+ Rack::Utils.parse_query(uri.query)['dbname'].downcase
10
+ rescue URI::InvalidURIError
11
+ return nil
12
+ end
13
+ end
14
+
15
+ def parse_uri(url)
16
+ begin
17
+ uri = URI(url)
18
+ "#{uri.scheme}://#{uri.host}".downcase
19
+ rescue URI::InvalidURIError
20
+ return nil
21
+ end
22
+ end
23
+
24
+ (puts "You must set both the \"UPTRENDS_USERNAME\" and \"UPTRENDS_PASSWORD\" environment variables, exiting..."; exit 1;) unless ENV['UPTRENDS_USERNAME'] && ENV['UPTRENDS_PASSWORD']
25
+
26
+ u = UptrendsExtended::Client.new(username: ENV['UPTRENDS_USERNAME'], password: ENV['UPTRENDS_PASSWORD'])
27
+
28
+ filename = ARGV.first
29
+ site_urls = File.open(filename)
30
+ site_urls = site_urls.readlines.map { |x| x.delete("\n") }.compact
31
+
32
+ # Build array of URLs to possibly add to Uptrends
33
+ uri_array = site_urls.map do |url|
34
+ uri = parse_uri(url)
35
+ db = parse_uri_for_db(url)
36
+ next unless uri && db
37
+ [uri, db]
38
+ end.compact.uniq
39
+
40
+ # Build array of Uptrends Probe URLs that already exist
41
+ probe_uri_array = u.probes.map do |x|
42
+ next unless x.probe_type =~ /Https?/
43
+ parse_uri(x.url)
44
+ end.compact
45
+
46
+ uri_array.each do |uri|
47
+ url = uri[0]
48
+ db = uri[1]
49
+
50
+ # If URL contains certain things we don't want to add it Uptrends
51
+ next if url =~ /\.xxx/i ||
52
+ url =~ /backup/i ||
53
+ url =~ /clusterbogota/i ||
54
+ url =~ /archive/i ||
55
+ url =~ /thebigawards/i ||
56
+ url =~ /staging/i ||
57
+ url =~ /qa(languages)?[0-9gaspb]+(prod)?\./i
58
+ # If the URL already exists at Uptrends we don't want to add it again!
59
+ next if probe_uri_array.include?(url)
60
+
61
+ url = "#{uri[0]}/User/Login"
62
+ db = uri[1]
63
+
64
+ puts "Adding a \"#{url}\" probe"
65
+ begin
66
+ new_probe = u.create_http_probe(name: db, url: url, match_pattern: 'j_username')
67
+ rescue UptrendsExtended::ApiError => e
68
+ puts e.message
69
+ end
70
+ end
71
+
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ require 'uptrends_extended'
3
+
4
+ (puts "You must set both the \"UPTRENDS_USERNAME\" and \"UPTRENDS_PASSWORD\" environment variables, exiting..."; exit 1;) unless ENV['UPTRENDS_USERNAME'] && ENV['UPTRENDS_PASSWORD']
5
+
6
+ u = UptrendsExtended::Client.new(username: ENV['UPTRENDS_USERNAME'], password: ENV['UPTRENDS_PASSWORD'])
7
+
8
+ # select our probe group by name
9
+ linux_probe_group = u.probe_groups.select { |x| x.name =~ /Linux/}.first
10
+
11
+ # grab the current group members
12
+ linux_group_members = u.get_probe_group_members(group: linux_probe_group)
13
+
14
+ # build an array of current probe group members guid
15
+ member_guids = linux_group_members.inject([]) do |memo, x|
16
+ memo << x.guid
17
+ memo
18
+ end
19
+
20
+ # add any missing probes to our probe group
21
+ u.probes.each do |x|
22
+ next if member_guids.include?(x.guid)
23
+
24
+ puts "Adding \"#{x.name}\" to the \"#{linux_probe_group.name}\" group now... "
25
+ u.add_probe_to_group(probe: x, group: linux_probe_group)
26
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require "uptrends_extended"
3
+ require "ipaddr"
4
+
5
+ (puts "You must set both the \"UPTRENDS_USERNAME\" and \"UPTRENDS_PASSWORD\" environment variables, exiting..."; exit 1;) unless ENV['UPTRENDS_USERNAME'] && ENV['UPTRENDS_PASSWORD']
6
+
7
+ u = UptrendsExtended::Client.new(username: ENV['UPTRENDS_USERNAME'], password: ENV['UPTRENDS_PASSWORD'])
8
+ checkpoint_ips = u.checkpoints.inject([]) { |memo,x| memo << x.ip_address; memo }.sort_by { |x| IPAddr.new(x) }
9
+
10
+ checkpoint_ips.each do |ip|
11
+ puts "allow #{ip};"
12
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ require 'uptrends_extended/client'
3
+
4
+ (puts "You must set both the \"UPTRENDS_USERNAME\" and \"UPTRENDS_PASSWORD\" environment variables, exiting..."; exit 1;) unless ENV['UPTRENDS_USERNAME'] && ENV['UPTRENDS_PASSWORD']
5
+
6
+ u = UptrendsExtended::Client.new(username: ENV['UPTRENDS_USERNAME'], password: ENV['UPTRENDS_PASSWORD'])
7
+
8
+ u.probes.each do |x|
9
+ next if x.dns_lookup_mode == 'Local' && x.timeout == 20000 && x.tcp_connect_timeout == 5000
10
+
11
+ x.dns_lookup_mode = 'Local'
12
+ x.timeout = 20000
13
+ x.tcp_connect_timeout = 5000
14
+
15
+ puts "Updating the \"#{x.name}\" probe now... "
16
+ u.update_probe(x)
17
+ end
@@ -0,0 +1,3 @@
1
+ require 'uptrends_extended/version'
2
+ require 'uptrends_extended/client'
3
+
@@ -0,0 +1,4 @@
1
+ module UptrendsExtended
2
+ class ApiError < ::StandardError
3
+ end
4
+ end
@@ -0,0 +1,121 @@
1
+ require 'uptrends_extended/api_error'
2
+ require 'json'
3
+ require 'active_support/inflector'
4
+
5
+ module UptrendsExtended
6
+ class Base
7
+
8
+ attr_reader :attributes
9
+
10
+ def initialize(client, response, attributes = {})
11
+ @client = client
12
+ @attributes = attributes
13
+ gen_and_set_accessors
14
+ end
15
+
16
+ def create!
17
+ response = @client.class.post(api_url, body: gen_request_body)
18
+ self.class.parse(@client, response)
19
+ end
20
+
21
+ def update!
22
+ response = @client.class.put("#{api_url}/#{@guid}", body: gen_request_body)
23
+ self.class.check_error!(response)
24
+ end
25
+
26
+ def delete!
27
+ response = @client.class.delete("#{api_url}/#{@guid}")
28
+ self.class.check_error!(response)
29
+ end
30
+
31
+ def self.check_error!(response)
32
+ response_code = response.response.code.to_i
33
+ case response_code
34
+ when 200...300
35
+ response.parsed_response
36
+ else
37
+ raise UptrendsExtended::ApiError.new(response.parsed_response)
38
+ end
39
+ end
40
+
41
+ # @param [yyyy/mm/dd] start_of_period
42
+ # @param [yyyy/mm/dd] end_of_period
43
+ # @param [Day, Week, Month, Year, ProbeGroup, Probe, Checkpoint, ErrorCode, ErrorLevel] dimension
44
+ def statistics(start_of_period, end_of_period, dimension)
45
+ response = @client.class.get("#{api_url}/#{@guid}/statistics?Start=#{start_of_period}&End=#{end_of_period}&Dimension=#{dimension}", body: gen_request_body)
46
+ self.class.check_error!(response)
47
+ end
48
+
49
+ def uptime_this_year
50
+ stats = statistics("#{Time.now.year}/01/01", "#{Time.now.year}/12/31", 'Year')
51
+ {sla: stats[0]['SLAPercentage'], uptime: stats[0]['PercentageUptime']}
52
+ end
53
+
54
+ def uptime_last_12_months
55
+ start_period = Time.now - 12.months
56
+ stats = statistics(start_period.strftime('%Y/%m/%d'), Time.now.strftime('%Y/%m/%d'), 'Year')
57
+ {sla: stats[0]['SLAPercentage'], uptime: stats[0]['PercentageUptime']}
58
+ end
59
+
60
+ def self.parse(client, response)
61
+ check_error!(response)
62
+ parsed_response = response.parsed_response
63
+ if Array === parsed_response
64
+ parsed_response.map do |item|
65
+ new(client, response, item)
66
+ end
67
+ else
68
+ new(client, response, parsed_response)
69
+ end
70
+ end
71
+
72
+ def to_s
73
+ string = []
74
+ attributes.each do |attr|
75
+ string << "#{attr}: #{self.send(attr)}"
76
+ end
77
+
78
+ "#{string.join("\n")}"
79
+ end
80
+
81
+ private
82
+
83
+ # This method sets up all of our attr_accessor so we can easily edit probe attributes
84
+ def gen_and_set_accessors
85
+ attributes = []
86
+ self.attributes.each_pair do |k,v|
87
+
88
+ k = k.to_s.underscore
89
+ case k
90
+ when 'guid'
91
+ # setup attr_reader for guid and set it's value.
92
+ self.class.send(:attr_reader, k)
93
+ self.instance_variable_set("@#{k}", v)
94
+ else
95
+ # setup a attr_accessor for all other attributes
96
+ self.class.send(:attr_accessor, k)
97
+ self.send("#{k}=", v)
98
+ end
99
+ attributes << k.to_sym
100
+
101
+ end
102
+
103
+ @attributes = attributes
104
+ end
105
+
106
+ def gen_request_body
107
+ new_hash = @attributes.inject({}) do |memo,(k,v)|
108
+ if k.to_s.underscore == 'guid'
109
+ memo
110
+ else
111
+ memo[k.to_s.camelize] = self.send(k.to_s.underscore)
112
+ memo
113
+ end
114
+ end
115
+
116
+ request_body = JSON.dump(new_hash)
117
+ end
118
+
119
+ end
120
+ end
121
+