pagerduty_cli 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: