pagerduty_cli 0.0.3

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0d4f3f309ba8e989ee26ce922e3a4fd79f6836fc
4
+ data.tar.gz: 6ad7430c264960dd7f97079ef352dc85b0f47405
5
+ SHA512:
6
+ metadata.gz: daff2bce60dfda39f8557ccc209ed98ba29c2c8675c7f41aea1e426fd2a0c63bbddcdadf2ee85ff251da9fd71cf4c4b91068dfd2ebad26bc9fa4476d5b9f020b
7
+ data.tar.gz: 8093c58396762102b66f3a56862f48f7a838dccd40d2c2996cd18a5ffcb3700f9dd2a0d14bce003fa511c796f9cab03585ec714e246b65a8c927ed080afd889a
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pagerduty_cli.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Justin Dossey
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.
@@ -0,0 +1,53 @@
1
+ # PagerdutyCli
2
+
3
+ A Ruby-based CLI to PagerDuty. Supports triggers and resolves.
4
+
5
+ Inspired by Pinterest's Python implementation:
6
+ https://github.com/pinterest/pagerduty-monit
7
+
8
+ Requires Ruby >= 1.9.3.
9
+
10
+ ## Installation
11
+
12
+ Add to your Gemfile:
13
+
14
+ ```ruby
15
+ gem 'pagerduty_cli'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install pagerduty_cli
25
+
26
+ ## Usage
27
+
28
+ Trigger an event with
29
+ ```
30
+ pagerduty-trigger -e EVENT_NAME
31
+ ```
32
+
33
+ See all options with:
34
+ ```
35
+ pagerduty-trigger -h
36
+ ```
37
+
38
+ Resolve an event with
39
+ ```
40
+ pagerduty-resolve -e EVENT_NAME
41
+ ```
42
+ See all options with:
43
+ ```
44
+ pagerduty-resolve -h
45
+ ```
46
+
47
+ ## Contributing
48
+
49
+ 1. Fork it ( https://github.com/[my-github-username]/pagerduty_cli/fork )
50
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
51
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
52
+ 4. Push to the branch (`git push origin my-new-feature`)
53
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Resolve a PagerDuty alert.
4
+
5
+ require 'rubygems'
6
+ require 'pagerduty_cli'
7
+
8
+ PagerdutyCli::Resolve.resolve(ARGV)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Trigger a PagerDuty alert.
4
+
5
+ require 'rubygems'
6
+ require 'pagerduty_cli'
7
+
8
+ PagerdutyCli::Trigger.trigger(ARGV)
@@ -0,0 +1,7 @@
1
+ require 'pagerduty_cli/version'
2
+ require 'pagerduty_cli/trigger'
3
+ require 'pagerduty_cli/resolve'
4
+
5
+ # PagerDuty CLI module
6
+ module PagerdutyCli
7
+ end
@@ -0,0 +1,61 @@
1
+ # Module for common functionality to pagerduty CLI classes
2
+ module PagerdutyCli
3
+ # Common functionality to pagerduty interaction
4
+ module Common
5
+ API_KEY_FILE = '/etc/pagerduty_api.key'
6
+ def load_data
7
+ @api_key = File.open(@options[:api_key_file]).read.chomp
8
+ rescue Errno::ENOENT, Errno::EPERM
9
+ croak("Could not open PD API key file at #{@options[:api_key_file]}.")
10
+ end
11
+
12
+ def croak(message)
13
+ $stderr.puts "#{@me} Error: #{message} Exiting."
14
+ exit 1
15
+ end
16
+
17
+ def warn(message)
18
+ $stderr.puts "#{@me} Warning: #{message}"
19
+ end
20
+
21
+ def incident_key
22
+ event_key = "#{@options[:host]}:#{@options[:event]}"
23
+ Digest::SHA1.hexdigest(event_key)
24
+ end
25
+
26
+ # return the name for our incident state file.
27
+ def incident_file
28
+ File.join(@options[:tmpdir], "pagerduty-#{incident_key}")
29
+ end
30
+
31
+ # Disabling the MethodLength cop here because any reduction would reduce
32
+ # readability.
33
+ # rubocop:disable MethodLength
34
+ def parse_common_options(opts)
35
+ opts.banner = "Usage: #{@me} [options]"
36
+ @options ||= {}
37
+ @options.merge!(host: ENV['HOSTNAME'],
38
+ api_key_file: API_KEY_FILE,
39
+ tmpdir: '/tmp')
40
+ opts.on('-H', '--host HOST', 'Report from the hostname given') do |h|
41
+ @options[:host] = h
42
+ end
43
+ opts.on('-k', '--keyfile KEYFILE',
44
+ 'Use the key specified in file KEYFILE') do |kf|
45
+ @options[:api_key_file] = kf
46
+ end
47
+ opts.on('-e', '--event EVENT', 'Report the event given') do |e|
48
+ @options[:event] = e
49
+ end
50
+ opts.on('-t', '--tmpdir PATH',
51
+ 'location for incident files') do |tmp|
52
+ @options[:tmpdir] = tmp
53
+ end
54
+ opts.on_tail('-h', '--help', 'Show this message') do
55
+ $stderr.puts opts
56
+ exit
57
+ end
58
+ end
59
+ # rubocop:enable MethodLength
60
+ end
61
+ end
@@ -0,0 +1,37 @@
1
+ # Class to send resolutions to PagerDuty.
2
+ module PagerdutyCli
3
+ # Send a resolve to PagerDuty.
4
+ class Resolve
5
+ def initialize(args)
6
+ @me = 'pagerduty_resolve'
7
+ parse_opts(args)
8
+ load_data
9
+ end
10
+
11
+ def self.resolve(args)
12
+ new(args).send_resolve
13
+ end
14
+
15
+ def send_resolve
16
+ Pagerduty.new(@api_key).get_incident(incident_key).resolve
17
+ remove_incident_file
18
+ end
19
+
20
+ private
21
+
22
+ include PagerdutyCli::Common
23
+
24
+ def parse_opts(args)
25
+ opt_parser = OptionParser.new do |opts|
26
+ parse_common_options(opts)
27
+ end
28
+ opt_parser.parse! args
29
+ end
30
+
31
+ def remove_incident_file
32
+ File.delete(incident_file)
33
+ rescue Errno::ENOENT
34
+ warn("No incident file found at #{incident_file}")
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+
3
+ require 'optparse'
4
+ require 'pagerduty'
5
+ require 'digest/sha1'
6
+
7
+ require_relative 'common'
8
+
9
+ # Send a PagerDuty alert.
10
+ module PagerdutyCli
11
+ # Send a trigger to PagerDuty
12
+ class Trigger
13
+ def initialize(args)
14
+ @me = 'pagerduty_trigger'
15
+ parse_opts(args)
16
+ load_data
17
+ return unless @options[:force] || !incident_is_too_fresh?
18
+ touch_incident_file unless @options[:no_touch]
19
+ end
20
+
21
+ class << self
22
+ def trigger(args)
23
+ new(args).send_trigger
24
+ end
25
+ end
26
+
27
+ def send_trigger
28
+ Pagerduty.new(@api_key).trigger(incident_description,
29
+ incident_key: incident_key,
30
+ client: @options[:host])
31
+ end
32
+
33
+ private
34
+
35
+ include PagerdutyCli::Common
36
+
37
+ # Disabling the MethodLength cop here because any reduction would reduce
38
+ # readability.
39
+ # rubocop:disable MethodLength
40
+ def parse_opts(args)
41
+ # default options
42
+ @options = {}
43
+ @options[:interval] = (4 * 60 * 60 + 1)
44
+
45
+ opt_parser = OptionParser.new do |opts|
46
+ parse_common_options(opts)
47
+ opts.on('-f', '--force',
48
+ 'Force the event to process, even if not fresh') do
49
+ @options[:force] = true
50
+ end
51
+ opts.on('-n', '--no-incident',
52
+ 'Do not record sending this incident') do
53
+ @options[:no_touch] = true
54
+ end
55
+ opts.on('-i', '--touch-interval INTERVAL',
56
+ 'Specify freshness interval in seconds') do |interval|
57
+ @options[:interval] = interval.to_i
58
+ end
59
+ end
60
+ opt_parser.parse! args
61
+ end
62
+ # rubocop:enable MethodLength
63
+
64
+ # return true if this incident has been reported in the past 4 hrs 1 min
65
+ def incident_is_too_fresh?
66
+ cutoff = Time.now - @options[:interval]
67
+ File.exist?(incident_file) && File.mtime(incident_file) > cutoff
68
+ end
69
+
70
+ def incident_description
71
+ "#{@options[:event]} failed on #{@options[:host]}"
72
+ end
73
+
74
+ def touch_incident_file
75
+ File.open(incident_file, 'a') do |f|
76
+ f.puts "#{Time.now}: #{incident_description}"
77
+ end
78
+ rescue Errno::EPERM
79
+ croak("Could not write incident file #{incident_file.inspect}")
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,4 @@
1
+ # PagerDuty CLI
2
+ module PagerdutyCli
3
+ VERSION = '0.0.3'
4
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pagerduty_cli/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'pagerduty_cli'
8
+ spec.version = PagerdutyCli::VERSION
9
+ spec.authors = ['Justin Dossey']
10
+ spec.email = ['justin.dossey@newcontext.com']
11
+ spec.summary = 'ruby CLI for PagerDuty API'
12
+ spec.description = 'ruby CLI for PagerDuty API. '\
13
+ 'Supports sending triggers and resolves.'
14
+ spec.homepage = 'https://github.com/justindossey/pagerduty_cli'
15
+ spec.license = 'MIT'
16
+
17
+ spec.bindir = 'bin'
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_runtime_dependency 'pagerduty', '~> 2.0.0'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.7'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ end
@@ -0,0 +1,174 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe PagerdutyCli do
5
+ it 'defines the PagerdutyCli module' do
6
+ expect(PagerdutyCli).to be_a(Module)
7
+ end
8
+ it 'defines the PagerdutyCli::Common module' do
9
+ expect(PagerdutyCli::Common).to be_a(Module)
10
+ end
11
+ it 'croaks properly' do
12
+ # stub for testing the cli
13
+ stub_actor = StubPagerdutyCliActor.new
14
+ out = 'Stub Actor Error: hi Exiting.'
15
+ allow($stderr).to receive(:puts).with(out).and_return(out)
16
+ expect { stub_actor.croak('hi') }.to raise_error(SystemExit)
17
+ expect($stderr).to have_received(:puts).with(out)
18
+ end
19
+
20
+ it 'warns properly' do
21
+ stub_actor = StubPagerdutyCliActor.new
22
+ out = 'Stub Actor Warning: hi'
23
+ allow($stderr).to receive(:puts).with(out).and_return(out)
24
+ stub_actor.warn('hi')
25
+ expect($stderr).to have_received(:puts).with(out)
26
+ end
27
+
28
+ it 'generates the same key for triggers and resolves' do
29
+ stub_actor = StubPagerdutyCliActor.new
30
+ stub_actor.options[:host] = 'foo'
31
+ stub_actor.options[:event] = 'bar'
32
+ allow(Digest::SHA1).to receive(:hexdigest).with('foo:bar')
33
+ stub_actor.incident_key
34
+ expect(Digest::SHA1).to have_received(:hexdigest).with('foo:bar')
35
+ end
36
+
37
+ it 'generates a valid incident filename' do
38
+ stub_actor = StubPagerdutyCliActor.new
39
+ stub_actor.options[:host] = 'foo'
40
+ stub_actor.options[:event] = 'bar'
41
+ stub_actor.options[:tmpdir] = '/FAKETEMP'
42
+ allow(stub_actor).to receive(:incident_key).and_return('x')
43
+ expect(stub_actor.incident_file).to eq('/FAKETEMP/pagerduty-x')
44
+ end
45
+
46
+ it 'bails when no API key is loaded' do
47
+ stub_actor = StubPagerdutyCliActor.new
48
+ stub_actor.options[:api_key_file] = 'nonexistent_file'
49
+ allow(stub_actor).to receive(:croak)
50
+ stub_actor.load_data
51
+ expect(stub_actor).to have_received(:croak)
52
+ end
53
+
54
+ it 'defines the PagerdutyCli::Trigger class' do
55
+ expect(PagerdutyCli::Trigger).to be_a(Class)
56
+ end
57
+
58
+ it 'processes common PagerdutyCli options' do
59
+ args = %w(-H foo -k bar -e baz -t /var/tmp)
60
+ stub_actor = StubPagerdutyCliActor.new
61
+ stub_optionparser = OptionParser.new
62
+ stub_actor.parse_common_options(stub_optionparser)
63
+ stub_optionparser.parse!(args)
64
+
65
+ expect(stub_actor.options[:host]).to eq('foo')
66
+ expect(stub_actor.options[:api_key_file]).to eq('bar')
67
+ expect(stub_actor.options[:tmpdir]).to eq('/var/tmp')
68
+ expect(stub_actor.options[:event]).to eq('baz')
69
+ end
70
+
71
+ it 'supports correct defaults' do
72
+ args = %w(-e foo)
73
+ stub_actor = StubPagerdutyCliActor.new
74
+ stub_optionparser = OptionParser.new
75
+ stub_actor.parse_common_options(stub_optionparser)
76
+ stub_optionparser.parse!(args)
77
+ expect(stub_actor.options[:host]).to eq(ENV['HOSTNAME'])
78
+ expect(stub_actor.options[:api_key_file])
79
+ .to eq(PagerdutyCli::Common::API_KEY_FILE)
80
+ expect(stub_actor.options[:tmpdir]).to eq('/tmp')
81
+ expect(stub_actor.options[:event]).to eq('foo')
82
+ end
83
+
84
+ it 'prints help and exits with -h' do
85
+ args = %w(-h)
86
+ stub_actor = StubPagerdutyCliActor.new
87
+ stub_optionparser = OptionParser.new
88
+ stub_actor.parse_common_options(stub_optionparser)
89
+ allow($stderr).to receive(:puts)
90
+ expect { stub_optionparser.parse!(args) }.to raise_error(SystemExit)
91
+ expect($stderr).to have_received(:puts)
92
+ end
93
+
94
+ it 'processes trigger options' do
95
+ args = %w(-f -n -i 600 -e foo)
96
+ allow_any_instance_of(PagerdutyCli::Trigger).to receive(:load_data)
97
+ allow_any_instance_of(PagerdutyCli::Trigger)
98
+ .to receive(:touch_incident_file)
99
+ allow_any_instance_of(PagerdutyCli::Trigger)
100
+ .to receive(:incident_is_too_fresh?).and_return(true)
101
+ PagerdutyCli::Trigger.class_eval('attr_reader :options')
102
+ trigger = PagerdutyCli::Trigger.new(args)
103
+
104
+ expect(trigger.options).to be_a(Hash)
105
+ expect(trigger.options[:force]).to be_truthy
106
+ expect(trigger.options[:no_touch]).to be_truthy
107
+ expect(trigger.options[:interval]).to eq(600)
108
+ expect(trigger.options[:event]).to eq('foo')
109
+ end
110
+
111
+ it 'places tmp files in the right location' do
112
+ args = %w(-e foo)
113
+ allow_any_instance_of(PagerdutyCli::Trigger)
114
+ .to receive(:incident_is_too_fresh?).and_return(false)
115
+ allow_any_instance_of(PagerdutyCli::Trigger).to receive(:load_data)
116
+ trigger = PagerdutyCli::Trigger.new(args)
117
+ string_buffer = StringIO.new
118
+ allow(File).to receive(:open).and_return(string_buffer)
119
+ allow(trigger).to receive(:incident_key).and_return('abc')
120
+ trigger.send(:touch_incident_file)
121
+ expect(File).to have_received(:open).with('/tmp/pagerduty-abc', 'a')
122
+ end
123
+
124
+ it 'allows triggers to be sent via class method' do
125
+ args = %w(-e foo)
126
+ allow_any_instance_of(PagerdutyCli::Trigger).to receive(:load_data)
127
+ allow_any_instance_of(PagerdutyCli::Trigger)
128
+ .to receive(:send_trigger).and_return('bar')
129
+
130
+ expect(PagerdutyCli::Trigger.trigger(args)).to eq('bar')
131
+ end
132
+
133
+ it 'defines the PagerdutyCli::Resolve class' do
134
+ expect(PagerdutyCli::Resolve).to be_a(Class)
135
+ end
136
+
137
+ it 'processes all options to resolve' do
138
+ args = %w(-H foo -k bar -e baz -t /var/tmp)
139
+ allow_any_instance_of(PagerdutyCli::Resolve).to receive(:load_data)
140
+ PagerdutyCli::Resolve.class_eval('attr_reader :options')
141
+ resolver = PagerdutyCli::Resolve.new(args)
142
+ expect(resolver.options[:host]).to eq('foo')
143
+ expect(resolver.options[:api_key_file]).to eq('bar')
144
+ expect(resolver.options[:event]).to eq('baz')
145
+ expect(resolver.options[:tmpdir]).to eq('/var/tmp')
146
+ end
147
+
148
+ it 'removes tmp files in the right location' do
149
+ # stub pagerduty API so we can resolve without getting too deep
150
+ class FakePagerDuty
151
+ end
152
+ my_fake_pagerduty = FakePagerDuty.new
153
+ allow(my_fake_pagerduty).to receive(:resolve).and_return(true)
154
+
155
+ allow_any_instance_of(Pagerduty)
156
+ .to receive(:get_incident).and_return(my_fake_pagerduty)
157
+ allow_any_instance_of(PagerdutyCli::Resolve)
158
+ .to receive(:incident_file).and_return('foo')
159
+ allow_any_instance_of(PagerdutyCli::Resolve).to receive(:load_data)
160
+ allow(File).to receive(:delete).with('foo').and_return(true)
161
+ PagerdutyCli::Resolve.resolve(%w(-e abc))
162
+ expect(File).to have_received(:delete).with('foo')
163
+ expect(my_fake_pagerduty).to have_received(:resolve)
164
+ end
165
+
166
+ it 'allows resolves to be sent via class method' do
167
+ args = %w(-e foo)
168
+ allow_any_instance_of(PagerdutyCli::Resolve).to receive(:load_data)
169
+ allow_any_instance_of(PagerdutyCli::Resolve)
170
+ .to receive(:send_resolve).and_return('bar')
171
+ expect(PagerdutyCli::Resolve.resolve(args)).to eq('bar')
172
+ end
173
+
174
+ end
@@ -0,0 +1,14 @@
1
+ require 'pagerduty_cli'
2
+ require 'rspec'
3
+
4
+ RSpec.configure
5
+
6
+ # stub for exercising common
7
+ class StubPagerdutyCliActor
8
+ include PagerdutyCli::Common
9
+ attr_accessor :options
10
+ def initialize
11
+ @me = 'Stub Actor'
12
+ @options = {}
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pagerduty_cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Justin Dossey
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pagerduty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description: ruby CLI for PagerDuty API. Supports sending triggers and resolves.
56
+ email:
57
+ - justin.dossey@newcontext.com
58
+ executables:
59
+ - pagerduty-resolve
60
+ - pagerduty-trigger
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".gitignore"
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - bin/pagerduty-resolve
70
+ - bin/pagerduty-trigger
71
+ - lib/pagerduty_cli.rb
72
+ - lib/pagerduty_cli/common.rb
73
+ - lib/pagerduty_cli/resolve.rb
74
+ - lib/pagerduty_cli/trigger.rb
75
+ - lib/pagerduty_cli/version.rb
76
+ - pagerduty_cli.gemspec
77
+ - spec/pagerduty_cli_spec.rb
78
+ - spec/spec_helper.rb
79
+ homepage: https://github.com/justindossey/pagerduty_cli
80
+ licenses:
81
+ - MIT
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.4.1
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: ruby CLI for PagerDuty API
103
+ test_files:
104
+ - spec/pagerduty_cli_spec.rb
105
+ - spec/spec_helper.rb
106
+ has_rdoc: