metadata-v2 0.8.5.pre
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 +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: []
         
     |