sensu-plugins-aws 3.0.0 → 3.1.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 +8 -8
- data/CHANGELOG.md +23 -7
- data/README.md +6 -0
- data/bin/check-autoscaling-cpucredits.rb +1 -2
- data/bin/check-beanstalk-health.rb +112 -0
- data/bin/check-certificate-expiry.rb +1 -2
- data/bin/check-cloudwatch-alarm.rb +1 -2
- data/bin/check-dynamodb-capacity.rb +1 -2
- data/bin/check-dynamodb-throttle.rb +1 -2
- data/bin/check-ec2-cpu_balance.rb +2 -1
- data/bin/check-ec2-filter.rb +1 -2
- data/bin/check-ec2-network.rb +1 -2
- data/bin/check-elb-certs.rb +1 -2
- data/bin/check-elb-health-fog.rb +1 -2
- data/bin/check-elb-health-sdk.rb +1 -2
- data/bin/check-elb-latency.rb +1 -2
- data/bin/check-elb-nodes.rb +1 -2
- data/bin/check-elb-sum-requests.rb +1 -2
- data/bin/check-emr-cluster.rb +1 -2
- data/bin/check-instance-events.rb +3 -3
- data/bin/check-instance-reachability.rb +107 -0
- data/bin/check-instances-count.rb +82 -0
- data/bin/check-rds-events.rb +1 -2
- data/bin/check-rds-pending.rb +67 -0
- data/bin/check-rds.rb +1 -2
- data/bin/check-redshift-events.rb +1 -2
- data/bin/check-route.rb +122 -0
- data/bin/check-s3-bucket.rb +1 -2
- data/bin/check-s3-object.rb +1 -2
- data/bin/check-sqs-messages.rb +1 -2
- data/bin/handler-ec2_node.rb +16 -2
- data/bin/metrics-autoscaling-instance-count.rb +1 -2
- data/bin/metrics-ec2-count.rb +2 -3
- data/bin/metrics-ec2-filter.rb +3 -14
- data/bin/metrics-elasticache.rb +1 -2
- data/bin/metrics-elb-full.rb +1 -2
- data/bin/metrics-elb.rb +1 -2
- data/bin/metrics-sqs.rb +1 -2
- data/lib/sensu-plugins-aws/version.rb +1 -1
- metadata +14 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NWI2YzJmMzQ4ZWVkZTI4YjI0N2EzMTA5YWMwZjU4ODcxNTFkMTAyMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjY3ZTk3ODIzODhhNzUwODI1ZmUzM2YzYWUxNDUzMzJlMDUzNWYyNQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDQyYzk2ZDQ3OGQwOWVmY2Q3Njk3M2FlNzgxYTQzNjBjZjIzYTc5YjI0MTMz
|
10
|
+
YWI5NjM0MmZiODU5YTI0NTBlMDA5NWM0Y2I0NzQ1N2FkNzMzZTUzNDgyMDVk
|
11
|
+
MGU2MzJkOGUzMThmODZmYjNlZTg2OTA2M2U3N2EwODQzMjg3MTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDk3YmU4ZmM4OWEyOTRjMmVmNTI1MTc3Mzc4YTAwYTgzMzU4NzM4Y2VmZTQy
|
14
|
+
ZTc3YjNiYjQ3N2JmNGNjMDM4OTNmZmI4ODZlNWUxMzQ1ZWFiMzg4ODM4OTIy
|
15
|
+
MmJiYTg5MTU3MTZlNzA0ODhmNTFjNmE4NzIwMDlhYzlhYmE1MGY=
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,21 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
|
|
5
5
|
|
6
6
|
## [Unreleased]
|
7
7
|
|
8
|
+
## [3.1.0] - 2016-05-15
|
9
|
+
### Fixed
|
10
|
+
- check-instance-events.rb: Ignore completed instance-stop ec2 events
|
11
|
+
- check-instance-events.rb: Ignore canceled system-maintenance ec2 events
|
12
|
+
|
13
|
+
## Added
|
14
|
+
- Added check-instance-reachability.rb: looks up all instances from a filter set and pings
|
15
|
+
- Added check-route.rb: checks a route to an instance / eni on a route table
|
16
|
+
- Added check-rds-pending.rb: checks for pending RDS maintenance events
|
17
|
+
|
18
|
+
### Changed
|
19
|
+
- handler-ec2_node.rb updated to allow configuration set from client config
|
20
|
+
- metrics-ec2-filter.rb: Moved filter parsing to library
|
21
|
+
- update to Rubocop 0.40 and cleanup
|
22
|
+
|
8
23
|
## [3.0.0] - 2016-05-05
|
9
24
|
### Removed
|
10
25
|
- Support for Ruby 2.0
|
@@ -183,13 +198,14 @@ WARNING: This release contains major breaking changes that will impact all user
|
|
183
198
|
### Added
|
184
199
|
- initial release
|
185
200
|
|
186
|
-
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.
|
187
|
-
[3.
|
188
|
-
[
|
189
|
-
[2.4.
|
190
|
-
[2.4.
|
191
|
-
[2.4.
|
192
|
-
[2.
|
201
|
+
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.1.0...HEAD
|
202
|
+
[3.1.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.0.0...3.1.0
|
203
|
+
[3.0.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.4.3...3.0.0
|
204
|
+
[2.4.3]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.4.2...2.4.3
|
205
|
+
[2.4.2]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.4.1...2.4.2
|
206
|
+
[2.4.1]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.4.0...2.4.1
|
207
|
+
[2.4.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.3.0...2.4.0
|
208
|
+
[2.3.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.2.0...2.3.0
|
193
209
|
[2.2.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/v2.1.1...2.2.0
|
194
210
|
[2.1.1]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.1.0...v2.1.1
|
195
211
|
[2.1.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.0.1...2.1.0
|
data/README.md
CHANGED
@@ -62,6 +62,8 @@
|
|
62
62
|
|
63
63
|
**check-rds-events.rb**
|
64
64
|
|
65
|
+
**check-rds-pending.rb**
|
66
|
+
|
65
67
|
**check-rds.rb**
|
66
68
|
|
67
69
|
**check-redshift-events.rb**
|
@@ -84,6 +86,8 @@
|
|
84
86
|
|
85
87
|
**check_vpc_vpn.py**
|
86
88
|
|
89
|
+
**check-instances-count.rb**
|
90
|
+
|
87
91
|
**check-vpc-vpn.rb**
|
88
92
|
|
89
93
|
**handler-ec2_node.rb**
|
@@ -140,6 +144,7 @@
|
|
140
144
|
* /bin/check-emr-steps.rb
|
141
145
|
* /bin/check-instance-events.rb
|
142
146
|
* /bin/check-rds-events.rb
|
147
|
+
* /bin/check-rds-pending.rb
|
143
148
|
* /bin/check-rds.rb
|
144
149
|
* /bin/check-redshift-events.rb
|
145
150
|
* /bin/check-s3-object.rb
|
@@ -153,6 +158,7 @@
|
|
153
158
|
* /bin/handler-ses.rb
|
154
159
|
* /bin/handler-sns.rb
|
155
160
|
* /bin/metrics-autoscaling-instance-count.rb
|
161
|
+
* /bin/check-instances-count.rb
|
156
162
|
* /bin/metrics-ec2-count.rb
|
157
163
|
* /bin/metrics-ec2-filter.rb
|
158
164
|
* /bin/metrics-elasticache.rb
|
@@ -85,8 +85,7 @@ class CheckEc2CpuCredits < Sensu::Plugin::Check::CLI
|
|
85
85
|
def aws_config
|
86
86
|
{ access_key_id: config[:aws_access_key],
|
87
87
|
secret_access_key: config[:aws_secret_access_key],
|
88
|
-
region: config[:aws_region]
|
89
|
-
}
|
88
|
+
region: config[:aws_region] }
|
90
89
|
end
|
91
90
|
|
92
91
|
def asg
|
@@ -0,0 +1,112 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-beanstalk-health
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin checks the health of a beanstalk environment using
|
7
|
+
# the enhanced health reporting.
|
8
|
+
#
|
9
|
+
# OUTPUT:
|
10
|
+
# plain-text
|
11
|
+
#
|
12
|
+
# PLATFORMS:
|
13
|
+
# Linux
|
14
|
+
#
|
15
|
+
# DEPENDENCIES:
|
16
|
+
# gem: aws-sdk
|
17
|
+
# gem: sensu-plugin
|
18
|
+
#
|
19
|
+
# USAGE:
|
20
|
+
# ./check-beanstalk-health -e MyAppEnv
|
21
|
+
#
|
22
|
+
# NOTES:
|
23
|
+
#
|
24
|
+
# LICENSE:
|
25
|
+
# Brendan Leon Gibat
|
26
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
27
|
+
# for details.
|
28
|
+
#
|
29
|
+
|
30
|
+
require 'sensu-plugin/check/cli'
|
31
|
+
require 'aws-sdk'
|
32
|
+
require 'json'
|
33
|
+
|
34
|
+
class BeanstalkHealth < Sensu::Plugin::Check::CLI
|
35
|
+
option :environment,
|
36
|
+
description: 'Application environment name',
|
37
|
+
short: '-e ENVIRONMENT_NAME',
|
38
|
+
long: '--environment ENVIRONMENT_NAME',
|
39
|
+
required: true
|
40
|
+
|
41
|
+
option :no_data_ok,
|
42
|
+
short: '-n',
|
43
|
+
long: '--allow-no-data',
|
44
|
+
description: 'Returns unknown if health status is Grey. If set to false this will critical on a Grey status.',
|
45
|
+
boolean: true,
|
46
|
+
default: true
|
47
|
+
|
48
|
+
def env_health
|
49
|
+
@env_health ||= beanstalk_client
|
50
|
+
.describe_environment_health(
|
51
|
+
environment_name: config[:environment],
|
52
|
+
attribute_names: %w(Color Status HealthStatus Causes)
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def beanstalk_client
|
57
|
+
@beanstalk_client ||= Aws::ElasticBeanstalk::Client.new
|
58
|
+
end
|
59
|
+
|
60
|
+
def instances_health
|
61
|
+
@instances_health ||= begin
|
62
|
+
curr_instances = beanstalk_client.describe_instances_health(
|
63
|
+
environment_name: config[:environment],
|
64
|
+
attribute_names: %w(Color HealthStatus Causes)
|
65
|
+
)
|
66
|
+
instances = curr_instances.instance_health_list
|
67
|
+
until curr_instances.next_token.nil?
|
68
|
+
curr_instances = beanstalk_client.describe_instances_health(
|
69
|
+
environment_name: config[:environment],
|
70
|
+
attribute_names: %w(Color HealthStatus Causes)
|
71
|
+
)
|
72
|
+
instances.concat(curr_instances.instance_health_list)
|
73
|
+
end
|
74
|
+
instances
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def unhealthy_instances
|
79
|
+
@unhealthy_instances ||= instances_health.select { |i| i.color != 'Green' }
|
80
|
+
end
|
81
|
+
|
82
|
+
def status_rollup
|
83
|
+
"Beanstalk Status: #{env_health.status}, Health Status: #{env_health.health_status}, Causes: #{env_health.causes.join(', ')}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def unhealthy_instance_description(instance)
|
87
|
+
"instance id: #{instance.instance_id}, color: #{instance.color}, health status: #{instance.health_status}, causes: [#{instance.causes.join(', ')}]"
|
88
|
+
end
|
89
|
+
|
90
|
+
def unhealthy_instances_rollup
|
91
|
+
"Unhealthy instances and causes: [ #{unhealthy_instances.collect { |i| unhealthy_instance_description(i) }.join(', ')} ]"
|
92
|
+
end
|
93
|
+
|
94
|
+
def run
|
95
|
+
color = env_health.color
|
96
|
+
if color == 'Green'
|
97
|
+
ok
|
98
|
+
elsif color == 'Yellow'
|
99
|
+
warning "Environment status is YELLOW. #{status_rollup} #{unhealthy_instances_rollup}"
|
100
|
+
elsif color == 'Red'
|
101
|
+
critical "Environment status is RED. #{status_rollup} #{unhealthy_instances_rollup}"
|
102
|
+
elsif color == 'Grey'
|
103
|
+
if config[:no_data_ok]
|
104
|
+
unknown "Environment status is GREY. This means NO DATA. #{status_rollup}"
|
105
|
+
else
|
106
|
+
critical "Environment status is GREY. This means NO DATA. #{status_rollup}"
|
107
|
+
end
|
108
|
+
else
|
109
|
+
critical "Unknown Environment status response, #{color}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -69,8 +69,7 @@ class CheckCertificateExpiry < Sensu::Plugin::Check::CLI
|
|
69
69
|
def aws_config
|
70
70
|
{ access_key_id: config[:aws_access_key],
|
71
71
|
secret_access_key: config[:aws_secret_access_key],
|
72
|
-
region: config[:aws_region]
|
73
|
-
}
|
72
|
+
region: config[:aws_region] }
|
74
73
|
end
|
75
74
|
|
76
75
|
def aws_client(opts = {})
|
@@ -99,8 +99,7 @@ class CheckDynamoDB < Sensu::Plugin::Check::CLI
|
|
99
99
|
def aws_config
|
100
100
|
{ access_key_id: config[:aws_access_key],
|
101
101
|
secret_access_key: config[:aws_secret_access_key],
|
102
|
-
region: config[:aws_region]
|
103
|
-
}
|
102
|
+
region: config[:aws_region] }
|
104
103
|
end
|
105
104
|
|
106
105
|
def dynamo_db
|
@@ -94,8 +94,7 @@ class CheckDynamoDB < Sensu::Plugin::Check::CLI
|
|
94
94
|
def aws_config
|
95
95
|
{ access_key_id: config[:aws_access_key],
|
96
96
|
secret_access_key: config[:aws_secret_access_key],
|
97
|
-
region: config[:aws_region]
|
98
|
-
}
|
97
|
+
region: config[:aws_region] }
|
99
98
|
end
|
100
99
|
|
101
100
|
def dynamo_db
|
data/bin/check-ec2-filter.rb
CHANGED
@@ -84,8 +84,7 @@ class EC2Filter < Sensu::Plugin::Check::CLI
|
|
84
84
|
def aws_config
|
85
85
|
{ access_key_id: config[:aws_access_key],
|
86
86
|
secret_access_key: config[:aws_secret_access_key],
|
87
|
-
region: config[:aws_region]
|
88
|
-
}
|
87
|
+
region: config[:aws_region] }
|
89
88
|
end
|
90
89
|
|
91
90
|
def convert_operator
|
data/bin/check-ec2-network.rb
CHANGED
data/bin/check-elb-certs.rb
CHANGED
data/bin/check-elb-health-fog.rb
CHANGED
data/bin/check-elb-health-sdk.rb
CHANGED
data/bin/check-elb-latency.rb
CHANGED
data/bin/check-elb-nodes.rb
CHANGED
@@ -82,8 +82,7 @@ class CheckELBSumRequests < Sensu::Plugin::Check::CLI
|
|
82
82
|
def aws_config
|
83
83
|
{ access_key_id: config[:aws_access_key],
|
84
84
|
secret_access_key: config[:aws_secret_access_key],
|
85
|
-
region: config[:aws_region]
|
86
|
-
}
|
85
|
+
region: config[:aws_region] }
|
87
86
|
end
|
88
87
|
|
89
88
|
def elb
|
data/bin/check-emr-cluster.rb
CHANGED
@@ -90,8 +90,7 @@ class CheckEMRCluster < Sensu::Plugin::Check::CLI
|
|
90
90
|
def aws_config
|
91
91
|
{ access_key_id: config[:aws_access_key],
|
92
92
|
secret_access_key: config[:aws_secret_access_key],
|
93
|
-
region: config[:aws_region]
|
94
|
-
}
|
93
|
+
region: config[:aws_region] }
|
95
94
|
end
|
96
95
|
|
97
96
|
def humanize(secs)
|
@@ -63,8 +63,7 @@ class CheckInstanceEvents < Sensu::Plugin::Check::CLI
|
|
63
63
|
def aws_config
|
64
64
|
{ access_key_id: config[:aws_access_key],
|
65
65
|
secret_access_key: config[:aws_secret_access_key],
|
66
|
-
region: config[:aws_region]
|
67
|
-
}
|
66
|
+
region: config[:aws_region] }
|
68
67
|
end
|
69
68
|
|
70
69
|
def run
|
@@ -91,7 +90,8 @@ class CheckInstanceEvents < Sensu::Plugin::Check::CLI
|
|
91
90
|
# "not_after": "2015-01-05 18:00:00 UTC"
|
92
91
|
# }
|
93
92
|
# ]
|
94
|
-
useful_events =
|
93
|
+
useful_events =
|
94
|
+
i[:events_set].reject { |x| (x[:code] == 'system-reboot' || x[:code] == 'instance-stop' || x[:code] == 'system-maintenance') && (x[:description] =~ /\[Completed\]/ || x[:description] =~ /\[Canceled\]/) }
|
95
95
|
unless useful_events.empty?
|
96
96
|
event_instances << i[:instance_id]
|
97
97
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-instance-reachability
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin looks up all instances from a filter set and pings
|
7
|
+
#
|
8
|
+
# OUTPUT:
|
9
|
+
# plain-text
|
10
|
+
#
|
11
|
+
# PLATFORMS:
|
12
|
+
# Linux
|
13
|
+
#
|
14
|
+
# DEPENDENCIES:
|
15
|
+
# gem: aws-sdk
|
16
|
+
# gem: sensu-plugin
|
17
|
+
#
|
18
|
+
# USAGE:
|
19
|
+
# #YELLOW
|
20
|
+
#
|
21
|
+
# NOTES:
|
22
|
+
#
|
23
|
+
# LICENSE:
|
24
|
+
# Copyright (c) 2014, Leon Gibat, brendan.gibat@gmail.com
|
25
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
26
|
+
# for details.
|
27
|
+
#
|
28
|
+
|
29
|
+
require 'sensu-plugin/check/cli'
|
30
|
+
require 'aws-sdk'
|
31
|
+
require 'sensu-plugins-aws'
|
32
|
+
|
33
|
+
class CheckInstanceReachability < Sensu::Plugin::Check::CLI
|
34
|
+
include Common
|
35
|
+
include Filter
|
36
|
+
|
37
|
+
option :aws_region,
|
38
|
+
short: '-r AWS_REGION',
|
39
|
+
long: '--aws-region REGION',
|
40
|
+
description: 'AWS Region (defaults to us-east-1).',
|
41
|
+
default: 'us-east-1'
|
42
|
+
|
43
|
+
option :filter,
|
44
|
+
short: '-f FILTER',
|
45
|
+
long: '--filter FILTER',
|
46
|
+
description: 'String representation of the filter to apply',
|
47
|
+
default: '{}'
|
48
|
+
|
49
|
+
option :timeout,
|
50
|
+
description: 'Ping timeout in seconds',
|
51
|
+
short: '-t TIMEOUT',
|
52
|
+
long: '--timeout TIMEOUT',
|
53
|
+
default: 5,
|
54
|
+
proc: proc(&:to_i)
|
55
|
+
|
56
|
+
option :count,
|
57
|
+
description: 'Ping count',
|
58
|
+
short: '-c COUNT',
|
59
|
+
long: '--count COUNT',
|
60
|
+
default: 1,
|
61
|
+
proc: proc(&:to_i)
|
62
|
+
|
63
|
+
option :critical_response,
|
64
|
+
description: 'Flag if the response should error on failures',
|
65
|
+
short: '-r',
|
66
|
+
long: '--critical-response',
|
67
|
+
boolean: true,
|
68
|
+
default: false
|
69
|
+
|
70
|
+
def run
|
71
|
+
begin
|
72
|
+
aws_config
|
73
|
+
client = Aws::EC2::Client.new
|
74
|
+
|
75
|
+
filter = Filter.parse(config[:filter])
|
76
|
+
|
77
|
+
options = { filters: filter }
|
78
|
+
|
79
|
+
errors = []
|
80
|
+
instance_ids = []
|
81
|
+
data = client.describe_instances(options)
|
82
|
+
|
83
|
+
data[:reservations].each do |res|
|
84
|
+
res[:instances].each do |i|
|
85
|
+
instance_ids << i[:instance_id]
|
86
|
+
`ping -c #{config[:count]} -W #{config[:timeout]} #{i[:private_ip_address]}`
|
87
|
+
if $CHILD_STATUS.to_i > 0
|
88
|
+
errors << "Could not reach #{i[:instance_id]}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
rescue => e
|
93
|
+
puts "Error: exception: #{e}"
|
94
|
+
critical
|
95
|
+
end
|
96
|
+
if errors.empty?
|
97
|
+
ok "Instances checked: #{instance_ids.join(',')}"
|
98
|
+
else
|
99
|
+
message = errors.join(',')
|
100
|
+
if config[:critical_response]
|
101
|
+
critical message
|
102
|
+
else
|
103
|
+
warning message
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-instances-count
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# DESCRIPTION:
|
7
|
+
# This plugin checks the instances count for a specific auto scale group ( ASG ).
|
8
|
+
# Goal is to allow you to monitor that your ASG isnt out of control
|
9
|
+
#
|
10
|
+
# OUTPUT:
|
11
|
+
# plain-text
|
12
|
+
#
|
13
|
+
# PLATFORMS:
|
14
|
+
# Linux
|
15
|
+
#
|
16
|
+
# DEPENDENCIES:
|
17
|
+
# gem: aws-sdk
|
18
|
+
# gem: sensu-plugin
|
19
|
+
#
|
20
|
+
# USAGE:
|
21
|
+
# check-instances-count.rb --warn 15 --crit 25 --groupname logstash-instances-auto
|
22
|
+
#
|
23
|
+
#
|
24
|
+
#
|
25
|
+
# NOTES:
|
26
|
+
#
|
27
|
+
# LICENSE:
|
28
|
+
# Copyright (c) 2015, Kevin Bond
|
29
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
30
|
+
# for details.
|
31
|
+
#
|
32
|
+
|
33
|
+
require 'sensu-plugins-aws'
|
34
|
+
require 'sensu-plugin/check/cli'
|
35
|
+
require 'aws-sdk'
|
36
|
+
|
37
|
+
# Class to check the instance count
|
38
|
+
class CheckInstanceCount < Sensu::Plugin::Check::CLI
|
39
|
+
include Common
|
40
|
+
|
41
|
+
option :groupname,
|
42
|
+
description: 'Name of the AutoScaling group',
|
43
|
+
short: '-g GROUP_NAME',
|
44
|
+
long: '--groupname GROUP_NAME',
|
45
|
+
required: true
|
46
|
+
|
47
|
+
option :aws_region,
|
48
|
+
short: '-r AWS_REGION',
|
49
|
+
long: '--aws-region REGION',
|
50
|
+
description: 'AWS Region (such as us-east-1).',
|
51
|
+
default: 'us-east-1'
|
52
|
+
|
53
|
+
option :warn,
|
54
|
+
short: '-w COUNT',
|
55
|
+
long: '--warn COUNT',
|
56
|
+
proc: proc(&:to_i),
|
57
|
+
default: 15
|
58
|
+
|
59
|
+
option :crit,
|
60
|
+
short: '-c COUNT',
|
61
|
+
long: '--crit COUNT',
|
62
|
+
proc: proc(&:to_i),
|
63
|
+
default: 25
|
64
|
+
|
65
|
+
def instance_count
|
66
|
+
AWS::AutoScaling.new.groups[config[:groupname]].auto_scaling_instances.map(&:lifecycle_state).count('InService').to_i
|
67
|
+
rescue => e
|
68
|
+
critical "There was an error reaching AWS - #{e.message}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def run
|
72
|
+
count = instance_count
|
73
|
+
msg_prefix = "#{count} instances running for ASG [ #{config[:groupname]} ]"
|
74
|
+
if count >= config[:crit]
|
75
|
+
critical "#{msg_prefix} - critical threshold #{config[:crit]}"
|
76
|
+
elsif count >= config[:warn]
|
77
|
+
warning "#{msg_prefix} - warning threshold #{config[:warn]}, critical threshold #{config[:crit]}"
|
78
|
+
else
|
79
|
+
ok msg_prefix
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/bin/check-rds-events.rb
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-rds-events
|
4
|
+
#
|
5
|
+
#
|
6
|
+
# DESCRIPTION:
|
7
|
+
# This plugin checks rds clusters for critical events.
|
8
|
+
# Due to the number of events types on RDS clusters the check searches for
|
9
|
+
# events containing the text string 'has started' or 'is being'. These events all have
|
10
|
+
# accompanying completiion events and are impacting events
|
11
|
+
#
|
12
|
+
# OUTPUT:
|
13
|
+
# plain-text
|
14
|
+
#
|
15
|
+
# PLATFORMS:
|
16
|
+
# Linux
|
17
|
+
#
|
18
|
+
# DEPENDENCIES:
|
19
|
+
# gem: aws-sdk
|
20
|
+
# gem: sensu-plugin
|
21
|
+
#
|
22
|
+
# USAGE:
|
23
|
+
# ./check-rds-events.rb -r ${you_region}
|
24
|
+
#
|
25
|
+
# NOTES:
|
26
|
+
#
|
27
|
+
# LICENSE:
|
28
|
+
# Tim Smith <tim@cozy.co>
|
29
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
30
|
+
# for details.
|
31
|
+
#
|
32
|
+
|
33
|
+
require 'sensu-plugin/check/cli'
|
34
|
+
require 'aws-sdk'
|
35
|
+
|
36
|
+
class CheckRDSEvents < Sensu::Plugin::Check::CLI
|
37
|
+
include Common
|
38
|
+
|
39
|
+
option :aws_region,
|
40
|
+
short: '-r AWS_REGION',
|
41
|
+
long: '--aws-region REGION',
|
42
|
+
description: 'AWS Region (such as eu-west-1).',
|
43
|
+
default: 'us-east-1'
|
44
|
+
|
45
|
+
def run
|
46
|
+
rds = Aws::RDS::Client.new
|
47
|
+
|
48
|
+
begin
|
49
|
+
# fetch all clusters identifiers
|
50
|
+
clusters = rds.describe_db_instances[:db_instances].map { |db| db[:db_instance_identifier] }
|
51
|
+
maint_clusters = []
|
52
|
+
# Check if there is any pending maintenance required
|
53
|
+
pending_record = rds.describe_pending_maintenance_actions(filters: [{ name: 'db-instance-id', values: clusters }])
|
54
|
+
pending_record[:pending_maintenance_actions].each do |response|
|
55
|
+
maint_clusters.push(response[:pending_maintenance_action_details])
|
56
|
+
end
|
57
|
+
rescue => e
|
58
|
+
unknown "An error occurred processing AWS RDS API: #{e.message}"
|
59
|
+
end
|
60
|
+
|
61
|
+
if maint_clusters.empty?
|
62
|
+
ok
|
63
|
+
else
|
64
|
+
critical("Clusters w/ pending maintenance required: #{maint_clusters.join(',')}")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/bin/check-rds.rb
CHANGED
@@ -124,8 +124,7 @@ class CheckRDS < Sensu::Plugin::Check::CLI
|
|
124
124
|
def aws_config
|
125
125
|
{ access_key_id: config[:aws_access_key],
|
126
126
|
secret_access_key: config[:aws_secret_access_key],
|
127
|
-
region: config[:aws_region]
|
128
|
-
}
|
127
|
+
region: config[:aws_region] }
|
129
128
|
end
|
130
129
|
|
131
130
|
def rds
|
@@ -66,8 +66,7 @@ class CheckRedshiftEvents < Sensu::Plugin::Check::CLI
|
|
66
66
|
def aws_config
|
67
67
|
{ access_key_id: config[:aws_access_key],
|
68
68
|
secret_access_key: config[:aws_secret_access_key],
|
69
|
-
region: config[:aws_region]
|
70
|
-
}
|
69
|
+
region: config[:aws_region] }
|
71
70
|
end
|
72
71
|
|
73
72
|
# setup a redshift connection using aws-sdk
|
data/bin/check-route.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-route
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin checks a route to an instance / eni on a route table
|
7
|
+
#
|
8
|
+
# OUTPUT:
|
9
|
+
# plain-text
|
10
|
+
#
|
11
|
+
# PLATFORMS:
|
12
|
+
# Linux
|
13
|
+
#
|
14
|
+
# DEPENDENCIES:
|
15
|
+
# gem: aws-sdk
|
16
|
+
# gem: sensu-plugin
|
17
|
+
#
|
18
|
+
# USAGE:
|
19
|
+
# #YELLOW
|
20
|
+
#
|
21
|
+
# NOTES:
|
22
|
+
#
|
23
|
+
# LICENSE:
|
24
|
+
# Copyright (c) 2014, Leon Gibat, brendan.gibat@gmail.com
|
25
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
26
|
+
# for details.
|
27
|
+
#
|
28
|
+
|
29
|
+
require 'sensu-plugin/check/cli'
|
30
|
+
require 'aws-sdk'
|
31
|
+
require 'sensu-plugins-aws'
|
32
|
+
|
33
|
+
class CheckRoute < Sensu::Plugin::Check::CLI
|
34
|
+
include Common
|
35
|
+
include Filter
|
36
|
+
|
37
|
+
option :aws_region,
|
38
|
+
short: '-r AWS_REGION',
|
39
|
+
long: '--aws-region REGION',
|
40
|
+
description: 'AWS Region (defaults to us-east-1).',
|
41
|
+
default: 'us-east-1'
|
42
|
+
|
43
|
+
option :filter,
|
44
|
+
short: '-f FILTER',
|
45
|
+
long: '--filter FILTER',
|
46
|
+
description: 'String representation of the filter to apply',
|
47
|
+
default: '{}'
|
48
|
+
|
49
|
+
option :network_interface_id,
|
50
|
+
description: 'Network interface id of route',
|
51
|
+
short: '-n NETWORK_INTERFACE_ID',
|
52
|
+
long: '--network-interface-id NETWORK_INTERFACE_ID',
|
53
|
+
default: ''
|
54
|
+
|
55
|
+
option :instance_id,
|
56
|
+
description: 'Instance Id attachment of route',
|
57
|
+
short: '-i INSTANCE_ID',
|
58
|
+
long: '--instance-id INSTANCE_ID',
|
59
|
+
default: ''
|
60
|
+
|
61
|
+
option :destination_cidr_block,
|
62
|
+
description: 'Destination CIDR block of route',
|
63
|
+
short: '-d DESTINATION_CIDR',
|
64
|
+
long: '--destination-cidr DESTINATION_CIDR',
|
65
|
+
default: ''
|
66
|
+
|
67
|
+
option :gateway_id,
|
68
|
+
description: 'Gateway Id of route',
|
69
|
+
short: '-g GATEWAY_ID',
|
70
|
+
long: '--gateway-id GATEWAY_ID',
|
71
|
+
default: ''
|
72
|
+
|
73
|
+
option :state,
|
74
|
+
description: 'The route state. Can be either "active" or "blackhole"',
|
75
|
+
short: '-s STATE',
|
76
|
+
long: '--state STATE',
|
77
|
+
default: 'active'
|
78
|
+
|
79
|
+
option :vpc_peering_id,
|
80
|
+
description: 'VPC peering connection id',
|
81
|
+
short: '-v VPC_PEERING_ID',
|
82
|
+
long: '--vpc-peering-id VPC_PEERING_ID',
|
83
|
+
default: ''
|
84
|
+
|
85
|
+
def run
|
86
|
+
begin
|
87
|
+
aws_config
|
88
|
+
client = Aws::EC2::Client.new
|
89
|
+
|
90
|
+
filter = Filter.parse(config[:filter])
|
91
|
+
|
92
|
+
options = { filters: filter }
|
93
|
+
|
94
|
+
data = client.describe_route_tables(options)
|
95
|
+
|
96
|
+
data[:route_tables].each do |rt|
|
97
|
+
rt[:routes].each do |route|
|
98
|
+
checks = true
|
99
|
+
if config[:state] != route[:state]
|
100
|
+
checks = false
|
101
|
+
elsif !config[:vpc_peering_id].empty? && config[:vpc_peering_id] != route[:vpc_peering_connection_id]
|
102
|
+
checks = false
|
103
|
+
elsif !config[:gateway_id].empty? && config[:gateway_id] != route[:gateway_id]
|
104
|
+
checks = false
|
105
|
+
elsif !config[:destination_cidr_block].empty? && config[:destination_cidr_block] != route[:destination_cidr_block]
|
106
|
+
checks = false
|
107
|
+
elsif !config[:instance_id].empty? && config[:instance_id] != route[:instance_id]
|
108
|
+
checks = false
|
109
|
+
elsif !config[:network_interface_id].empty? && config[:network_interface_id] != route[:network_interface_id]
|
110
|
+
checks = false
|
111
|
+
end
|
112
|
+
if checks
|
113
|
+
ok
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
rescue => e
|
118
|
+
critical "Error: exception: #{e}"
|
119
|
+
end
|
120
|
+
critical
|
121
|
+
end
|
122
|
+
end
|
data/bin/check-s3-bucket.rb
CHANGED
data/bin/check-s3-object.rb
CHANGED
@@ -87,8 +87,7 @@ class CheckS3Bucket < Sensu::Plugin::Check::CLI
|
|
87
87
|
def aws_config
|
88
88
|
{ access_key_id: config[:aws_access_key],
|
89
89
|
secret_access_key: config[:aws_secret_access_key],
|
90
|
-
region: config[:aws_region]
|
91
|
-
}
|
90
|
+
region: config[:aws_region] }
|
92
91
|
end
|
93
92
|
|
94
93
|
def run_check(type, age)
|
data/bin/check-sqs-messages.rb
CHANGED
data/bin/handler-ec2_node.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
#
|
3
3
|
# CHANGELOG:
|
4
4
|
# * 0.7.0:
|
5
|
+
# - Added method instance_id to check in client config section
|
6
|
+
# ['client']['aws']['instance_id'] first.
|
5
7
|
# - Update to new API event naming and simplifying ec2_node_should_be_deleted method and fixing
|
6
8
|
# match that will work with any user state defined.
|
7
9
|
# * 0.6.0:
|
@@ -140,7 +142,7 @@ class Ec2Node < Sensu::Handler
|
|
140
142
|
if ec2_node_should_be_deleted?
|
141
143
|
delete_sensu_client!
|
142
144
|
else
|
143
|
-
puts "[EC2 Node] #{
|
145
|
+
puts "[EC2 Node] #{instance_id} is in an invalid state"
|
144
146
|
end
|
145
147
|
end
|
146
148
|
|
@@ -150,6 +152,18 @@ class Ec2Node < Sensu::Handler
|
|
150
152
|
deletion_status(response)
|
151
153
|
end
|
152
154
|
|
155
|
+
def instance_id
|
156
|
+
if @event['client'].key?('aws') && @event['client']['aws'].key?('instance_id')
|
157
|
+
@event['client']['aws']['instance_id']
|
158
|
+
else
|
159
|
+
@event['client']['name']
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def instance_name
|
164
|
+
@event['client']['name']
|
165
|
+
end
|
166
|
+
|
153
167
|
# Method to check if there is any insance and if instance is in a valid state that could be deleted
|
154
168
|
def ec2_node_should_be_deleted?
|
155
169
|
# Defining region for aws SDK object
|
@@ -160,7 +174,7 @@ class Ec2Node < Sensu::Handler
|
|
160
174
|
|
161
175
|
begin
|
162
176
|
# Finding the instance
|
163
|
-
instances = ec2.describe_instances(instance_ids: [
|
177
|
+
instances = ec2.describe_instances(instance_ids: [instance_id]).reservations[0]
|
164
178
|
# If instance is empty/nil instance id is not valid so client can be deleted
|
165
179
|
if instances.nil? || instances.empty?
|
166
180
|
true
|
@@ -63,8 +63,7 @@ class AutoScalingInstanceCountMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
63
63
|
def aws_config
|
64
64
|
{ access_key_id: config[:aws_access_key],
|
65
65
|
secret_access_key: config[:aws_secret_access_key],
|
66
|
-
region: config[:aws_region]
|
67
|
-
}
|
66
|
+
region: config[:aws_region] }
|
68
67
|
end
|
69
68
|
|
70
69
|
def run
|
data/bin/metrics-ec2-count.rb
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
# NOTES:
|
22
22
|
#
|
23
23
|
# LICENSE:
|
24
|
-
# Copyright (c) 2014, Tim Smith,
|
24
|
+
# Copyright (c) 2014, Tim Smith, tsmith@chef.io
|
25
25
|
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
26
26
|
# for details.
|
27
27
|
#
|
@@ -63,8 +63,7 @@ class EC2Metrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
63
63
|
def aws_config
|
64
64
|
{ access_key_id: config[:aws_access_key],
|
65
65
|
secret_access_key: config[:aws_secret_access_key],
|
66
|
-
region: config[:aws_region]
|
67
|
-
}
|
66
|
+
region: config[:aws_region] }
|
68
67
|
end
|
69
68
|
|
70
69
|
def by_instances_status(client)
|
data/bin/metrics-ec2-filter.rb
CHANGED
@@ -29,21 +29,11 @@
|
|
29
29
|
|
30
30
|
require 'sensu-plugin/metric/cli'
|
31
31
|
require 'aws-sdk'
|
32
|
-
require 'sensu-plugins-aws
|
32
|
+
require 'sensu-plugins-aws'
|
33
33
|
|
34
34
|
class EC2Filter < Sensu::Plugin::Metric::CLI::Graphite
|
35
35
|
include Filter
|
36
|
-
|
37
|
-
short: '-a AWS_ACCESS_KEY',
|
38
|
-
long: '--aws-access-key AWS_ACCESS_KEY',
|
39
|
-
description: "AWS Access Key. Either set ENV['AWS_ACCESS_KEY'] or provide it as an option",
|
40
|
-
default: ENV['AWS_ACCESS_KEY']
|
41
|
-
|
42
|
-
option :aws_secret_access_key,
|
43
|
-
short: '-k AWS_SECRET_KEY',
|
44
|
-
long: '--aws-secret-access-key AWS_SECRET_KEY',
|
45
|
-
description: "AWS Secret Access Key. Either set ENV['AWS_SECRET_KEY'] or provide it as an option",
|
46
|
-
default: ENV['AWS_SECRET_KEY']
|
36
|
+
include Common
|
47
37
|
|
48
38
|
option :aws_region,
|
49
39
|
short: '-r AWS_REGION',
|
@@ -72,8 +62,7 @@ class EC2Filter < Sensu::Plugin::Metric::CLI::Graphite
|
|
72
62
|
def aws_config
|
73
63
|
{ access_key_id: config[:aws_access_key],
|
74
64
|
secret_access_key: config[:aws_secret_access_key],
|
75
|
-
region: config[:aws_region]
|
76
|
-
}
|
65
|
+
region: config[:aws_region] }
|
77
66
|
end
|
78
67
|
|
79
68
|
def run
|
data/bin/metrics-elasticache.rb
CHANGED
@@ -87,8 +87,7 @@ class ElastiCacheMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
87
87
|
def aws_config
|
88
88
|
{ access_key_id: config[:aws_access_key],
|
89
89
|
secret_access_key: config[:aws_secret_access_key],
|
90
|
-
region: config[:aws_region]
|
91
|
-
}
|
90
|
+
region: config[:aws_region] }
|
92
91
|
end
|
93
92
|
|
94
93
|
def run
|
data/bin/metrics-elb-full.rb
CHANGED
@@ -77,8 +77,7 @@ class ELBMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
77
77
|
def aws_config
|
78
78
|
{ access_key_id: config[:aws_access_key],
|
79
79
|
secret_access_key: config[:aws_secret_access_key],
|
80
|
-
region: config[:aws_region]
|
81
|
-
}
|
80
|
+
region: config[:aws_region] }
|
82
81
|
end
|
83
82
|
|
84
83
|
def run
|
data/bin/metrics-elb.rb
CHANGED
@@ -89,8 +89,7 @@ class ELBMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
89
89
|
def aws_config
|
90
90
|
{ access_key_id: config[:aws_access_key],
|
91
91
|
secret_access_key: config[:aws_secret_access_key],
|
92
|
-
region: config[:aws_region]
|
93
|
-
}
|
92
|
+
region: config[:aws_region] }
|
94
93
|
end
|
95
94
|
|
96
95
|
def run
|
data/bin/metrics-sqs.rb
CHANGED
@@ -70,8 +70,7 @@ class SQSMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
70
70
|
def aws_config
|
71
71
|
{ access_key_id: config[:aws_access_key],
|
72
72
|
secret_access_key: config[:aws_secret_access_key],
|
73
|
-
region: config[:aws_region]
|
74
|
-
}
|
73
|
+
region: config[:aws_region] }
|
75
74
|
end
|
76
75
|
|
77
76
|
def scheme(queue_name)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-aws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sensu-Plugins and contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -184,14 +184,14 @@ dependencies:
|
|
184
184
|
requirements:
|
185
185
|
- - ~>
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
187
|
+
version: 0.40.0
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - ~>
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
194
|
+
version: 0.40.0
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: rspec
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -229,6 +229,7 @@ email: <sensu-users@googlegroups.com>
|
|
229
229
|
executables:
|
230
230
|
- check-autoscaling-cpucredits.rb
|
231
231
|
- check-beanstalk-elb-metric.rb
|
232
|
+
- check-beanstalk-health.rb
|
232
233
|
- check-certificate-expiry.rb
|
233
234
|
- check-cloudwatch-alarm.rb
|
234
235
|
- check-cloudwatch-metric.rb
|
@@ -253,11 +254,15 @@ executables:
|
|
253
254
|
- check-emr-steps.rb
|
254
255
|
- check-instance-events.rb
|
255
256
|
- check-instance-health.rb
|
257
|
+
- check-instance-reachability.rb
|
258
|
+
- check-instances-count.rb
|
256
259
|
- check-kms-key.rb
|
257
260
|
- check-rds-events.rb
|
261
|
+
- check-rds-pending.rb
|
258
262
|
- check-rds.rb
|
259
263
|
- check-redshift-events.rb
|
260
264
|
- check-reserved-instances.rb
|
265
|
+
- check-route.rb
|
261
266
|
- check-s3-bucket.rb
|
262
267
|
- check-s3-object.rb
|
263
268
|
- check-sensu-client.rb
|
@@ -290,6 +295,7 @@ files:
|
|
290
295
|
- README.md
|
291
296
|
- bin/check-autoscaling-cpucredits.rb
|
292
297
|
- bin/check-beanstalk-elb-metric.rb
|
298
|
+
- bin/check-beanstalk-health.rb
|
293
299
|
- bin/check-certificate-expiry.rb
|
294
300
|
- bin/check-cloudwatch-alarm.rb
|
295
301
|
- bin/check-cloudwatch-metric.rb
|
@@ -314,11 +320,15 @@ files:
|
|
314
320
|
- bin/check-emr-steps.rb
|
315
321
|
- bin/check-instance-events.rb
|
316
322
|
- bin/check-instance-health.rb
|
323
|
+
- bin/check-instance-reachability.rb
|
324
|
+
- bin/check-instances-count.rb
|
317
325
|
- bin/check-kms-key.rb
|
318
326
|
- bin/check-rds-events.rb
|
327
|
+
- bin/check-rds-pending.rb
|
319
328
|
- bin/check-rds.rb
|
320
329
|
- bin/check-redshift-events.rb
|
321
330
|
- bin/check-reserved-instances.rb
|
331
|
+
- bin/check-route.rb
|
322
332
|
- bin/check-s3-bucket.rb
|
323
333
|
- bin/check-s3-object.rb
|
324
334
|
- bin/check-sensu-client.rb
|