uppityrobot 0.2.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.
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "uppityrobot"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/uppityrobot ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "uppityrobot"
6
+
7
+ Dry::CLI.new(UppityRobot::CLI::Commands).call
@@ -0,0 +1 @@
1
+ {"stat":"ok","monitor":{"id":777749809}}
@@ -0,0 +1 @@
1
+ {"stat":"ok","monitor":{"id":777712827}}
@@ -0,0 +1,22 @@
1
+ {
2
+ "stat": "ok",
3
+ "limit": 50,
4
+ "offset": 0,
5
+ "total": 2,
6
+ "alert_contacts": [
7
+ {
8
+ "id": "0993765",
9
+ "friendly_name": "John Doe",
10
+ "type": 2,
11
+ "status": 1,
12
+ "value": "johndoe@gmail.com"
13
+ },
14
+ {
15
+ "id": "2403924",
16
+ "friendly_name": "My Twitter",
17
+ "type": 3,
18
+ "status": 0,
19
+ "value": "sampleTwitterAccount"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1 @@
1
+ {"stat":"ok","total":0,"monitors":[]}
@@ -0,0 +1,35 @@
1
+ {
2
+ "stat": "ok",
3
+ "pagination": {
4
+ "offset": 0,
5
+ "limit": 50,
6
+ "total": 1
7
+ },
8
+ "monitors": [
9
+ {
10
+ "id": 777749809,
11
+ "friendly_name": "Google",
12
+ "url": "http://www.google.com",
13
+ "type": 1,
14
+ "sub_type": "",
15
+ "keyword_type": "",
16
+ "keyword_case_type": "",
17
+ "keyword_value": "",
18
+ "http_username": "",
19
+ "http_password": "",
20
+ "port": "",
21
+ "interval": 900,
22
+ "status": 1,
23
+ "create_datetime": 1462565497,
24
+ "monitor_group": 0,
25
+ "is_group_main": 0,
26
+ "logs": [
27
+ {
28
+ "type": 98,
29
+ "datetime": 1463540297,
30
+ "duration": 1054134
31
+ }
32
+ ]
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "stat": "ok",
3
+ "pagination": {
4
+ "offset": 0,
5
+ "limit": 50,
6
+ "total": 2
7
+ },
8
+ "monitors": [
9
+ {
10
+ "id": 777749809,
11
+ "friendly_name": "Google",
12
+ "url": "http://www.google.com",
13
+ "type": 1,
14
+ "sub_type": "",
15
+ "keyword_type": "",
16
+ "keyword_case_type": "",
17
+ "keyword_value": "",
18
+ "http_username": "",
19
+ "http_password": "",
20
+ "port": "",
21
+ "interval": 900,
22
+ "status": 1,
23
+ "create_datetime": 1462565497,
24
+ "monitor_group": 0,
25
+ "is_group_main": 0,
26
+ "logs": [
27
+ {
28
+ "type": 98,
29
+ "datetime": 1463540297,
30
+ "duration": 1054134
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "id": 777712827,
36
+ "friendly_name": "My Web Page",
37
+ "url": "http://mywebpage.com/",
38
+ "type": 1,
39
+ "sub_type": "",
40
+ "keyword_type": "",
41
+ "keyword_case_type": "",
42
+ "keyword_value": "",
43
+ "http_username": "",
44
+ "http_password": "",
45
+ "port": "",
46
+ "interval": 60,
47
+ "status": 2,
48
+ "create_datetime": 1462465496,
49
+ "monitor_group": 0,
50
+ "is_group_main": 0,
51
+ "logs": [
52
+ {
53
+ "type": 98,
54
+ "datetime": 1462465202,
55
+ "duration": 32
56
+ },
57
+ {
58
+ "type": 1,
59
+ "datetime": 1462465234,
60
+ "duration": 490140
61
+ },
62
+ {
63
+ "type": 2,
64
+ "datetime": 1462955374,
65
+ "duration": 85
66
+ },
67
+ {
68
+ "type": 99,
69
+ "datetime": 1462955588,
70
+ "duration": 12
71
+ },
72
+ {
73
+ "type": 98,
74
+ "datetime": 1462955600,
75
+ "duration": 22
76
+ }
77
+ ]
78
+ }
79
+ ]
80
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "stat": "ok",
3
+ "pagination": {
4
+ "offset": 0,
5
+ "limit": 50,
6
+ "total": 1
7
+ },
8
+ "monitors": [
9
+ {
10
+ "id": 777712827,
11
+ "friendly_name": "My Web Page",
12
+ "url": "http://mywebpage.com/",
13
+ "type": 1,
14
+ "sub_type": "",
15
+ "keyword_type": "",
16
+ "keyword_case_type": "",
17
+ "keyword_value": "",
18
+ "http_username": "",
19
+ "http_password": "",
20
+ "port": "",
21
+ "interval": 60,
22
+ "status": 2,
23
+ "create_datetime": 1462465496,
24
+ "monitor_group": 0,
25
+ "is_group_main": 0,
26
+ "logs": [
27
+ {
28
+ "type": 98,
29
+ "datetime": 1462465202,
30
+ "duration": 32
31
+ },
32
+ {
33
+ "type": 1,
34
+ "datetime": 1462465234,
35
+ "duration": 490140
36
+ },
37
+ {
38
+ "type": 2,
39
+ "datetime": 1462955374,
40
+ "duration": 85
41
+ },
42
+ {
43
+ "type": 99,
44
+ "datetime": 1462955588,
45
+ "duration": 12
46
+ },
47
+ {
48
+ "type": 98,
49
+ "datetime": 1462955600,
50
+ "duration": 22
51
+ }
52
+ ]
53
+ }
54
+ ]
55
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "stat": "ok",
3
+ "monitor": {
4
+ "id": 777810874,
5
+ "status": 1
6
+ }
7
+ }
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UppityRobot
4
+ module CLI
5
+ module Commands
6
+ # UppityRobot::CLI::Commands::Exec executes an API task
7
+ class Exec < Dry::CLI::Command
8
+ desc "Execute an API task"
9
+
10
+ argument :task, required: true, values: UptimeRobot::Client::METHODS, desc: "API task to be executed"
11
+
12
+ option :data, type: :string, desc: "JSON data file"
13
+ option :params, type: :string, default: "{}", desc: "JSON params"
14
+
15
+ example [
16
+ "getMonitors --data $json_data_file",
17
+ 'getMonitors --params \'{"monitors": "123-456-789"}\''
18
+ ]
19
+
20
+ def call(task:, data: nil, params: "{}", **)
21
+ task = task.to_sym
22
+ params = data.nil? ? JSON.parse(params) : parse_file(data)
23
+ puts UppityRobot::Client.new(task, params).execute.to_json
24
+ rescue JSON::ParserError => e
25
+ puts JSON.generate({ stat: "fail", error: "JSON parser #{e.message}" })
26
+ end
27
+
28
+ def parse_file(file)
29
+ JSON.parse(File.read(File.expand_path(file)))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UppityRobot
4
+ module CLI
5
+ module Commands
6
+ module Monitors
7
+ # UppityRobot::CLI::Commands::Monitors::Create creates an HTTP monitor
8
+ class Create < Dry::CLI::Command
9
+ desc "Create a new HTTP monitor"
10
+
11
+ argument :name, required: true, desc: "The name for the monitor"
12
+ argument :url, required: true, desc: "The http/s url to monitor"
13
+ argument :contacts, required: true, desc: "The list of contact ids"
14
+
15
+ example [
16
+ "google https://www.google.com 1-2-3"
17
+ ]
18
+
19
+ def call(name:, url:, contacts:, **)
20
+ sub_type = check_subtype(URI.parse(url))
21
+
22
+ data = {
23
+ friendly_name: name,
24
+ url: url,
25
+ type: UptimeRobot::Monitor::Type::HTTP,
26
+ sub_type: sub_type,
27
+ alert_contacts: contacts
28
+ }
29
+
30
+ response = UppityRobot::Client.new(:newMonitor, data).execute
31
+ puts response.to_json
32
+ rescue URI::InvalidURIError => e
33
+ puts JSON.generate({ stat: "fail", error: "URI parser #{e.message}" })
34
+ end
35
+
36
+ def check_subtype(uri)
37
+ if uri.instance_of?(URI::HTTP)
38
+ UptimeRobot::Monitor::SubType::HTTP
39
+ elsif uri.instance_of?(URI::HTTPS)
40
+ UptimeRobot::Monitor::SubType::HTTPS
41
+ else
42
+ abort({ stat: "fail",
43
+ error: "Monitor URL must be HTTP/S" }.to_json)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UppityRobot
4
+ module CLI
5
+ module Commands
6
+ module Monitors
7
+ # UppityRobot::CLI::Commands::Monitors::Delete delete a monitor
8
+ class Delete < Dry::CLI::Command
9
+ desc "Delete a monitor"
10
+
11
+ argument :field, required: true, values: %w[id name], desc: "The field used to target the monitor"
12
+ argument :value, required: true, type: Integer, desc: "The field value"
13
+
14
+ example [
15
+ "id 1",
16
+ "name aspace"
17
+ ]
18
+
19
+ def call(field:, value:, **)
20
+ check_field(field)
21
+ monitor = find_monitor(field, value)
22
+ response = UppityRobot::Client.new(:deleteMonitor, { id: monitor["id"] }).execute
23
+ puts response.to_json
24
+ end
25
+
26
+ def check_field(field)
27
+ return if %w[id name].include? field
28
+
29
+ abort({ stat: "fail",
30
+ error: "Field not recognized, must be one of: [id, name]" }.to_json)
31
+ end
32
+
33
+ def find_monitor(field, value)
34
+ params = {}
35
+ case field
36
+ when "id"
37
+ params[:monitors] = value
38
+ when "name"
39
+ params[:search] = value
40
+ end
41
+ UppityRobot::Client.new(:getMonitors, params).fetch
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UppityRobot
4
+ module CLI
5
+ module Commands
6
+ module Monitors
7
+ # UppityRobot::CLI::Commands::Monitors::Exec pauses or starts monitors
8
+ class Exec < Dry::CLI::Command
9
+ desc "Execute a pause or start request for monitors"
10
+
11
+ argument :task, required: true, values: %w[pause start], desc: "Pause or Start monitors"
12
+ argument :search, required: true, desc: "Search term for monitors"
13
+
14
+ option :filter, type: :string, default: "{}", desc: "Filter string for monitors"
15
+
16
+ example [
17
+ "pause aspace",
18
+ 'start aspace --filter \'{"status": 0}\''
19
+ ]
20
+
21
+ # rubocop:disable Metrics/AbcSize
22
+ def call(task:, search:, filter: "{}", **)
23
+ status = check_task(task)
24
+ filter = JSON.parse(filter)
25
+ filtered = { stat: "ok", total: 0, monitors: [] }
26
+ params = { search: search }
27
+ total = 0
28
+
29
+ UppityRobot::Client.new(:getMonitors, params).filter(filter).each do |m|
30
+ data = { id: m["id"], status: status }
31
+ filtered[:monitors] << UppityRobot::Client.new(:editMonitor, data).execute
32
+ total += 1
33
+ end
34
+
35
+ filtered[:total] = total
36
+ puts filtered.to_json
37
+ rescue JSON::ParserError => e
38
+ puts JSON.generate({ stat: "fail", error: "JSON parser #{e.message}" })
39
+ end
40
+ # rubocop:enable Metrics/AbcSize
41
+
42
+ def check_task(task)
43
+ case task.downcase
44
+ when "pause"
45
+ UptimeRobot::Monitor::Status::Paused
46
+ when "start"
47
+ UptimeRobot::Monitor::Status::NotCheckedYet
48
+ else
49
+ abort({ stat: "fail",
50
+ error: "Task not recognized, must be one of: [pause, start]" }.to_json)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end