sqs-list-queues 0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7cc3bebdbdeef157d7ca36c992ee9cf342bef893
4
+ data.tar.gz: 90072d014b7cc86f65d8b323c1c98af5ecdc5204
5
+ SHA512:
6
+ metadata.gz: cd425cb7fc9d7b22d5ea1644d67f33d5ece7a9ecc2f3c0fec7fb88c96b3811f7754ab32160a6f3d7c8fd4048eee535e84ba4ae00612507fc017d3a517a28be6d
7
+ data.tar.gz: 718cd925493432caee9cb1addafc9112f3190685cbf5ecfd9613305165f32e357197e22f099962530182dc2893f65c6cb95ac861742140af9705ded5912f5a55
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+
5
+ require 'sqs-list-queues'
6
+
7
+ config = SqsListQueues::Config.new
8
+
9
+ opts_parser = OptionParser.new do |opts|
10
+ opts.banner = "Usage: sqs-list-queues [OPTIONS] [PATTERN ...]"
11
+ opts.separator ""
12
+ opts.on("-c", "--counts", "Show message counts") do
13
+ config.show_counts = true
14
+ end
15
+ opts.on("-a", "--arn", "Show queue ARN") do
16
+ config.show_arn = true
17
+ end
18
+ opts.on("-u", "--url", "Show queue URL") do
19
+ config.show_url = true
20
+ end
21
+ opts.on("-j", "--json", "Show output in json format") do
22
+ config.json_format = true
23
+ end
24
+ opts.separator ""
25
+ opts.separator <<-EOF
26
+
27
+ Lists SQS queues (either all queues, or if at least one PATTERN is given,
28
+ those queues whose names match at least one PATTERN, implicitly prefixed by
29
+ "^"). One line is printed to standard output for each queue.
30
+
31
+ If --counts is shown, prefix by the message counts (visible, not visible, and
32
+ delayed, in that order); then show the queue name, or ARN, or URL. If JSON
33
+ format is selected, the queue name is always shown, and the ARN and URL can
34
+ both be selected if desired.
35
+
36
+ Examples:
37
+
38
+ # List all queue names
39
+ sqs-list-queues
40
+
41
+ # List queues whose names start with either "Foo" or "Bar", showing queue
42
+ # URLs not names:
43
+ sqs-list-queues --url Foo Bar
44
+
45
+ # List queues whose names start with "MyQueues", showing message counts:
46
+ sqs-list-queues --counts MyQueues
47
+
48
+ EOF
49
+ end
50
+
51
+ opts_parser.parse!
52
+
53
+ unless ARGV.empty?
54
+ config.patterns = ARGV
55
+ end
56
+
57
+ config.validate
58
+
59
+ rc = SqsListQueues::Runner.new(config).run
60
+ exit rc
61
+
62
+ # eof sqs-list-queues
@@ -0,0 +1,5 @@
1
+ require_relative './sqs-list-queues/client.rb'
2
+ require_relative './sqs-list-queues/config.rb'
3
+ require_relative './sqs-list-queues/lister.rb'
4
+ require_relative './sqs-list-queues/runner.rb'
5
+ require_relative './sqs-list-queues/version.rb'
@@ -0,0 +1,25 @@
1
+ module SqsListQueues
2
+
3
+ class Client
4
+
5
+ def self.configure
6
+ Aws.config.merge! core_v2_options
7
+ end
8
+
9
+ def self.core_v2_options
10
+ {
11
+ http_proxy: get_proxy,
12
+ user_agent_suffix: "sqs-list-queues #{VERSION}",
13
+ # http_wire_trace: true,
14
+ }
15
+ end
16
+
17
+ def self.get_proxy
18
+ e = ENV['https_proxy']
19
+ e = "https://#{e}" if e && !e.empty? && !e.start_with?('http')
20
+ return e
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,30 @@
1
+ module SqsListQueues
2
+
3
+ class Config
4
+ # Stronger builder pattern would be nice
5
+ attr_accessor :client_options, :sqs_client,
6
+ :patterns,
7
+ :show_counts,
8
+ :show_arn,
9
+ :show_url,
10
+ :json_format
11
+
12
+ def initialize
13
+ @client_options = {}
14
+ @patterns = nil
15
+ @show_counts = false
16
+ @show_arn = false
17
+ @show_url = false
18
+ @json_format = false
19
+ end
20
+
21
+ def validate
22
+ unless @json_format
23
+ if @show_arn and @show_url
24
+ raise "Can't show both ARN and URL unless JSON format is selected"
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,66 @@
1
+ module SqsListQueues
2
+
3
+ class Lister
4
+
5
+ # ListQueues /seems/ to return the queues in ASCII order (case sensitive).
6
+ # The following algorithm depends on this assumption.
7
+
8
+ # Allowed characters in SQS queue names, in that order (see above).
9
+ ALPHABET = ("0".."9").to_a \
10
+ + ["-"] \
11
+ + ("A".."Z").to_a \
12
+ + ["_"] \
13
+ + ("a".."z").to_a
14
+
15
+ # Ceiling of ListQueues results
16
+ MAX_RESULTS = 1000
17
+
18
+ def initialize(sqs_client)
19
+ @sqs_client = sqs_client
20
+ end
21
+
22
+ def get_possibly_truncated_list(prefix)
23
+ # $stderr.puts "Querying with prefix = #{prefix.inspect}"
24
+ @sqs_client.list_queues(queue_name_prefix: prefix).queue_urls
25
+ end
26
+
27
+ def get_full_list(prefix = "")
28
+ urls = get_possibly_truncated_list prefix
29
+
30
+ if urls.count < MAX_RESULTS
31
+ return urls
32
+ end
33
+
34
+ last_result = urls.last
35
+ last_name = File.basename last_result
36
+
37
+ # If prefix = "foo"
38
+ # and the last result we have is "foolish"
39
+ # then to discover things later than this, we have to use a longer prefix
40
+ # then "foo":
41
+ # - "foom", "foon" (etc, for all possible character after "l"), each of
42
+ # which must be iterated independently
43
+ # - but for "fool"... we can try "fool" (which will certainly return some
44
+ # results we already have), and _may_ return additional results
45
+
46
+ problematic_letter = last_name[prefix.length]
47
+
48
+ # The fool case
49
+ fool_names = get_full_list(prefix + problematic_letter)
50
+ index_of_last_result = fool_names.index last_result
51
+ fool_names = fool_names[index_of_last_result+1 .. -1]
52
+
53
+ # The foom, foon... case
54
+ problematic_index = ALPHABET.index problematic_letter
55
+ remaining_letters = ALPHABET[problematic_index+1 .. -1]
56
+
57
+ remaining_names = remaining_letters.map do |letter|
58
+ get_full_list(prefix + letter)
59
+ end
60
+
61
+ (urls + fool_names + remaining_names).flatten
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,128 @@
1
+ require 'aws-sdk'
2
+ require 'json'
3
+ require 'rosarium'
4
+
5
+ module SqsListQueues
6
+
7
+ class Runner
8
+
9
+ def initialize(config)
10
+ @config = config
11
+
12
+ @config.sqs_client ||= begin
13
+ effective_options = SqsListQueues::Client.core_v2_options.merge(config.client_options)
14
+ Aws::SQS::Client.new(effective_options)
15
+ end
16
+ end
17
+
18
+ def promise
19
+ promise_queue_urls.then do |queue_urls|
20
+ Rosarium::Promise.all(queue_urls.map {|queue_url| promise_queue queue_url}.reject &:nil?)
21
+ end
22
+ end
23
+
24
+ def promise_queue_urls
25
+ prefixes = get_pattern_prefixes
26
+
27
+ if prefixes.empty? or prefixes.any? {|prefix| prefix == ""}
28
+ Rosarium::Promise.execute do
29
+ SqsListQueues::Lister.new(@config.sqs_client).get_full_list
30
+ end
31
+ else
32
+ Rosarium::Promise.all(
33
+ prefixes.map do |prefix|
34
+ Rosarium::Promise.execute do
35
+ SqsListQueues::Lister.new(@config.sqs_client).get_full_list(prefix)
36
+ end
37
+ end
38
+ ).then do |v|
39
+ v.flatten.uniq
40
+ end
41
+ end
42
+ end
43
+
44
+ def get_pattern_prefixes
45
+ if @config.patterns.nil?
46
+ []
47
+ else
48
+ @config.patterns.map do |pattern|
49
+ pattern.match(/^([0-9A-Za-z_-]*)/)[1]
50
+ end
51
+ end
52
+ end
53
+
54
+ def pattern_to_string_prefix(pattern)
55
+ m = pattern.match /^/
56
+ end
57
+
58
+ def promise_queue(queue_url)
59
+ queue_name = File.basename queue_url
60
+ return nil unless name_matches_patterns?(queue_name)
61
+
62
+ Rosarium::Promise.execute do
63
+ r = {
64
+ name: queue_name,
65
+ url: queue_url,
66
+ }
67
+
68
+ required_attributes = []
69
+
70
+ if @config.show_arn
71
+ required_attributes << 'QueueArn'
72
+ end
73
+
74
+ if @config.show_counts
75
+ required_attributes << 'ApproximateNumberOfMessages'
76
+ required_attributes << 'ApproximateNumberOfMessagesNotVisible'
77
+ required_attributes << 'ApproximateNumberOfMessagesDelayed'
78
+ end
79
+
80
+ unless required_attributes.empty?
81
+ r[:attributes] = @config.sqs_client.get_queue_attributes(
82
+ queue_url: queue_url,
83
+ attribute_names: required_attributes,
84
+ ).attributes
85
+ end
86
+
87
+ r
88
+ end
89
+ end
90
+
91
+ def name_matches_patterns?(queue_name)
92
+ return true if @config.patterns.nil?
93
+
94
+ @config.patterns.any? do |pattern|
95
+ queue_name.match("^" + pattern)
96
+ end
97
+ end
98
+
99
+ def run
100
+ promise.then do |queues|
101
+ queues.each do |queue|
102
+ if @config.json_format
103
+ puts JSON.generate(queue)
104
+ else
105
+ if @config.show_counts
106
+ msg = queue[:attributes]["ApproximateNumberOfMessages"]
107
+ invis = queue[:attributes]["ApproximateNumberOfMessagesNotVisible"]
108
+ delayed = queue[:attributes]["ApproximateNumberOfMessagesDelayed"]
109
+ print "#{msg}\t#{invis}\t#{delayed}\t"
110
+ end
111
+
112
+ if @config.show_arn
113
+ puts queue[:attributes]["QueueArn"]
114
+ elsif @config.show_url
115
+ puts queue[:url]
116
+ else
117
+ puts queue[:name]
118
+ end
119
+ end
120
+ end
121
+ end.value!
122
+
123
+ return 0
124
+ end
125
+
126
+ end
127
+
128
+ end
@@ -0,0 +1,3 @@
1
+ module SqsListQueues
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sqs-list-queues
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rachel Evans
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rosarium
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
41
+ description: "\n sqs-list-queues lists your SQS queues (working around the 1000
42
+ queue limit\n in the ListQueues API).\n\n Options are available to filter
43
+ by queue name, show message counts, show\n queue ARNs and/or names, and output
44
+ as json.\n\n Respects $https_proxy.\n "
45
+ email: sqs-list-queues-git@rve.org.uk
46
+ executables:
47
+ - sqs-list-queues
48
+ extensions: []
49
+ extra_rdoc_files: []
50
+ files:
51
+ - bin/sqs-list-queues
52
+ - lib/sqs-list-queues.rb
53
+ - lib/sqs-list-queues/client.rb
54
+ - lib/sqs-list-queues/config.rb
55
+ - lib/sqs-list-queues/lister.rb
56
+ - lib/sqs-list-queues/runner.rb
57
+ - lib/sqs-list-queues/version.rb
58
+ homepage: https://github.com/rvedotrc/sqs-list-queues
59
+ licenses:
60
+ - Apache-2.0
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.5.1
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: List SQS queues, optionally with message counts and more
82
+ test_files: []