metadata-v2 0.8.5.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.org +29 -0
- data/bin/mdata-delete +20 -0
- data/bin/mdata-get +24 -0
- data/bin/mdata-list +15 -0
- data/bin/mdata-put +25 -0
- data/lib/metadata-v2.rb +4 -0
- data/lib/metadata/v2.rb +7 -0
- data/lib/metadata/v2/client.rb +71 -0
- data/lib/metadata/v2/request.rb +44 -0
- data/lib/metadata/v2/response.rb +53 -0
- data/lib/metadata/v2/socket_paths.rb +12 -0
- data/metadata-v2.gemspec +14 -0
- metadata +62 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ae51ffa35b0e4db9971328dda85b2c551e6595e48e4086fdeca07d2358f967dd
|
4
|
+
data.tar.gz: f1f3e0db7bdc0be7da9a7b50cac9cc1d0a940897eab83fc044f684adb0471f24
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '0086c81a9f53ae2baa2f8b5bbb74faf2c14e8fa4e21a775139e383ef3e877149defc120937879a19d5c4db3ee98c768648c2f0424f3c6c65e1752775c13fd642'
|
7
|
+
data.tar.gz: e2761a48c6d61e0369ecc3471f792dd63d3804f648dc9954aef71cfba93e62f2a79315adbec7a452d1a2280b8ce0937aa55b8b3ccc77c328bed4be3161398eea
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
The MIT License (MIT)
|
3
|
+
Copyright © 2018 Chris Olstrom <chris@olstrom.com>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the “Software”), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.org
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#+TITLE: metadata-v2 - A Ruby Interface to the Joyent Metadata Protocol
|
2
|
+
#+LATEX: \pagebreak
|
3
|
+
|
4
|
+
* Overview
|
5
|
+
|
6
|
+
~metadata-v2~ provides protocol and socket abstractions to simplify
|
7
|
+
interactions with any metadata service that conforms to Version 2 of the
|
8
|
+
[[https://eng.joyent.com/mdata/protocol.html][Joyent Metadata Protocol Specification]].
|
9
|
+
|
10
|
+
Included are drop-in replacements for the [[https://github.com/joyent/mdata-client/][mdata-client]] tools:
|
11
|
+
- mdata-list
|
12
|
+
- mdata-get
|
13
|
+
- mdata-put
|
14
|
+
- mdata-delete
|
15
|
+
|
16
|
+
* Why does this exist?
|
17
|
+
|
18
|
+
The [[https://github.com/joyent/mdata-client/][mdata-client]] tools are both portable and well-documented. You should use
|
19
|
+
them when available! ~metadata-v2~ only really becomes useful once you want to
|
20
|
+
do non-trivial things with your metadata service.
|
21
|
+
|
22
|
+
* License
|
23
|
+
|
24
|
+
~metadata-v2~ is available under the [[https://tldrlegal.com/license/mit-license][MIT License]]. See ~LICENSE.txt~ for the
|
25
|
+
full text.
|
26
|
+
|
27
|
+
* Contributors
|
28
|
+
|
29
|
+
- [[https://colstrom.github.io/][Chris Olstrom]] | [[mailto:chris@olstrom.com][e-mail]] | [[https://twitter.com/ChrisOlstrom][Twitter]]
|
data/bin/mdata-delete
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require_relative '../lib/metadata/v2'
|
5
|
+
|
6
|
+
unless key = ARGV.first
|
7
|
+
STDERR.puts 'mdata-delete: Usage: mdata-delete <keyname>'
|
8
|
+
exit 3
|
9
|
+
end
|
10
|
+
|
11
|
+
metadata = Metadata::V2::Client.new
|
12
|
+
response = metadata.delete key
|
13
|
+
|
14
|
+
case response.code
|
15
|
+
when 'SUCCESS'
|
16
|
+
exit 0
|
17
|
+
else
|
18
|
+
STDERR.puts "Error deleting metadata key '#{key}': #{response.decode}"
|
19
|
+
exit 2
|
20
|
+
end
|
data/bin/mdata-get
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require_relative '../lib/metadata/v2'
|
5
|
+
|
6
|
+
unless key = ARGV.first
|
7
|
+
STDERR.puts 'mdata-get: Usage: mdata-get <keyname>'
|
8
|
+
exit 3
|
9
|
+
end
|
10
|
+
|
11
|
+
metadata = Metadata::V2::Client.new
|
12
|
+
response = metadata.get key
|
13
|
+
|
14
|
+
case response.code
|
15
|
+
when 'SUCCESS'
|
16
|
+
STDOUT.puts response.decode
|
17
|
+
exit 0
|
18
|
+
when 'NOTFOUND'
|
19
|
+
STDERR.puts "No metadata for '#{ARGV.first}'"
|
20
|
+
exit 1
|
21
|
+
else
|
22
|
+
STDERR.puts "Error getting metadata for key '#{key}': #{response.decode}"
|
23
|
+
exit 2
|
24
|
+
end
|
data/bin/mdata-list
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require_relative '../lib/metadata/v2'
|
5
|
+
|
6
|
+
metadata = Metadata::V2::Client.new
|
7
|
+
response = metadata.keys
|
8
|
+
|
9
|
+
case response.code
|
10
|
+
when 'SUCCESS'
|
11
|
+
STDOUT.puts response.decode
|
12
|
+
exit 0
|
13
|
+
else
|
14
|
+
exit 2
|
15
|
+
end
|
data/bin/mdata-put
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require_relative '../lib/metadata/v2'
|
5
|
+
|
6
|
+
unless key = ARGV.shift
|
7
|
+
STDERR.puts 'mdata-put: Usage: mdata-put <keyname> [ <value> ]'
|
8
|
+
exit 3
|
9
|
+
end
|
10
|
+
|
11
|
+
unless value = ARGV.shift || (STDIN.read unless STDIN.tty?)
|
12
|
+
STDERR.puts 'ERROR: either specify the metadata value as the second command-line argument, or pipe content to stdin.'
|
13
|
+
exit 2
|
14
|
+
end
|
15
|
+
|
16
|
+
metadata = Metadata::V2::Client.new
|
17
|
+
response = metadata.put key, value
|
18
|
+
|
19
|
+
case response.code
|
20
|
+
when 'SUCCESS'
|
21
|
+
exit 0
|
22
|
+
else
|
23
|
+
STDERR.puts "Error putting metadata for key '#{key}': #{response.decode}"
|
24
|
+
exit 2
|
25
|
+
end
|
data/lib/metadata-v2.rb
ADDED
data/lib/metadata/v2.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'socket' # Ruby Standard Library
|
5
|
+
|
6
|
+
require_relative 'request'
|
7
|
+
require_relative 'response'
|
8
|
+
require_relative 'socket_paths'
|
9
|
+
|
10
|
+
module Metadata
|
11
|
+
module V2
|
12
|
+
class Client
|
13
|
+
def initialize(path = nil)
|
14
|
+
@socket = UNIXSocket.new path || ENV.fetch('METADATA_SOCKET') { discover }
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def keys
|
19
|
+
request! 'KEYS'
|
20
|
+
block_given? ? yield(response!) : response!
|
21
|
+
end
|
22
|
+
|
23
|
+
def get(key)
|
24
|
+
request! 'GET', key.to_s
|
25
|
+
block_given? ? yield(response!) : response!
|
26
|
+
end
|
27
|
+
|
28
|
+
def put(key, value)
|
29
|
+
request! 'PUT', key.to_s, value.to_s
|
30
|
+
block_given? ? yield(response!) : response!
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(key)
|
34
|
+
request! 'DELETE', key.to_s
|
35
|
+
block_given? ? yield(response!) : response!
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def discover
|
41
|
+
SOCKET_PATHS.find { |path| File.socket? path } or raise Errno::ENOENT
|
42
|
+
end
|
43
|
+
|
44
|
+
def raw_request!(message)
|
45
|
+
@socket.sendmsg message.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def raw_response!
|
49
|
+
@socket.readline
|
50
|
+
end
|
51
|
+
|
52
|
+
def flush!
|
53
|
+
raw_request! "\n"
|
54
|
+
"invalid command\n" == raw_response!
|
55
|
+
end
|
56
|
+
|
57
|
+
def negotiate!
|
58
|
+
raw_request! "NEGOTIATE V2\n"
|
59
|
+
"V2_OK\n" == raw_response!
|
60
|
+
end
|
61
|
+
|
62
|
+
def request!(*args)
|
63
|
+
raw_request! Request.new(*args)
|
64
|
+
end
|
65
|
+
|
66
|
+
def response!
|
67
|
+
Response.new raw_response!
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'base64' # Ruby Standard Library
|
5
|
+
require 'zlib' # Ruby Standard Library
|
6
|
+
|
7
|
+
module Metadata
|
8
|
+
module V2
|
9
|
+
class Request
|
10
|
+
def initialize(operation, *args)
|
11
|
+
@operation = operation
|
12
|
+
@args = args
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :operation, :args
|
17
|
+
|
18
|
+
def id
|
19
|
+
@id ||= 8.times.map { rand (0..15) }.map { |n| n.to_s(16) }.reduce(:+)
|
20
|
+
end
|
21
|
+
|
22
|
+
def payload
|
23
|
+
case args.size
|
24
|
+
when 1
|
25
|
+
Base64.encode64(*args).chomp
|
26
|
+
when 2
|
27
|
+
Base64.encode64(args.map { |arg| Base64.encode64(arg).chomp }.join(' ')).chomp
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def body
|
32
|
+
@body ||= [id, operation, payload].compact.reject(&:empty?).join(' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
def checksum
|
36
|
+
@checksum ||= Zlib.crc32(body).to_s(16)
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
['V2', body.length, checksum, body].join(' ') + "\n"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'base64' # Ruby Standard Library
|
5
|
+
|
6
|
+
module Metadata
|
7
|
+
module V2
|
8
|
+
class Response
|
9
|
+
def initialize(frame)
|
10
|
+
@frame = frame
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :frame
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
frame + "\n"
|
18
|
+
end
|
19
|
+
|
20
|
+
def protocol
|
21
|
+
@protocol ||= frame.split(' ')[0]
|
22
|
+
end
|
23
|
+
|
24
|
+
def length
|
25
|
+
@length ||= frame.split(' ')[1].to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
def checksum
|
29
|
+
@checksum ||= frame.split(' ')[2]
|
30
|
+
end
|
31
|
+
|
32
|
+
def body
|
33
|
+
@body ||= frame.split(' ').drop(3).join(' ')
|
34
|
+
end
|
35
|
+
|
36
|
+
def id
|
37
|
+
@id ||= body.split(' ')[0]
|
38
|
+
end
|
39
|
+
|
40
|
+
def code
|
41
|
+
@code ||= body.split(' ')[1]
|
42
|
+
end
|
43
|
+
|
44
|
+
def payload
|
45
|
+
@payload ||= body.split(' ')[2]
|
46
|
+
end
|
47
|
+
|
48
|
+
def decode
|
49
|
+
Base64.decode64 payload if payload
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/metadata-v2.gemspec
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Gem::Specification.new do |gem|
|
2
|
+
gem.name = 'metadata-v2'
|
3
|
+
gem.version = `git describe --tags --abbrev=0`.chomp + '.pre'
|
4
|
+
gem.licenses = 'MIT'
|
5
|
+
gem.authors = ['Chris Olstrom']
|
6
|
+
gem.email = 'chris@olstrom.com'
|
7
|
+
gem.homepage = 'https://github.com/colstrom/metadata-v2'
|
8
|
+
gem.summary = 'A Ruby Interface to the Joyent Metadata Protocol (Version 2)'
|
9
|
+
|
10
|
+
gem.files = `git ls-files`.split("\n")
|
11
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
12
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
13
|
+
gem.require_paths = ['lib']
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: metadata-v2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.5.pre
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Olstrom
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: chris@olstrom.com
|
15
|
+
executables:
|
16
|
+
- mdata-delete
|
17
|
+
- mdata-get
|
18
|
+
- mdata-list
|
19
|
+
- mdata-put
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- ".gitignore"
|
24
|
+
- Gemfile
|
25
|
+
- LICENSE.txt
|
26
|
+
- README.org
|
27
|
+
- bin/mdata-delete
|
28
|
+
- bin/mdata-get
|
29
|
+
- bin/mdata-list
|
30
|
+
- bin/mdata-put
|
31
|
+
- lib/metadata-v2.rb
|
32
|
+
- lib/metadata/v2.rb
|
33
|
+
- lib/metadata/v2/client.rb
|
34
|
+
- lib/metadata/v2/request.rb
|
35
|
+
- lib/metadata/v2/response.rb
|
36
|
+
- lib/metadata/v2/socket_paths.rb
|
37
|
+
- metadata-v2.gemspec
|
38
|
+
homepage: https://github.com/colstrom/metadata-v2
|
39
|
+
licenses:
|
40
|
+
- MIT
|
41
|
+
metadata: {}
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.3.1
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 2.7.6
|
59
|
+
signing_key:
|
60
|
+
specification_version: 4
|
61
|
+
summary: A Ruby Interface to the Joyent Metadata Protocol (Version 2)
|
62
|
+
test_files: []
|