diff options
author | GenPage <dpage@digitalocean.com> | 2016-03-10 11:10:33 -0500 |
---|---|---|
committer | Tim Smith <tsmith@chef.io> | 2017-02-23 12:54:47 -0800 |
commit | bb08248c57f038aec147232298b9461c3db1eaa0 (patch) | |
tree | 63c663c272fc31b0a145932b6c9cb62a755abcce /lib/ohai/mixin | |
parent | 5f04ffaf58e6f457a221b23df4ded4024d998e34 (diff) | |
download | ohai-bb08248c57f038aec147232298b9461c3db1eaa0.tar.gz |
Setup DigitalOcean plugin to use Metadata API
Diffstat (limited to 'lib/ohai/mixin')
-rw-r--r-- | lib/ohai/mixin/do_metadata.rb | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/ohai/mixin/do_metadata.rb b/lib/ohai/mixin/do_metadata.rb new file mode 100644 index 00000000..ec4a08a8 --- /dev/null +++ b/lib/ohai/mixin/do_metadata.rb @@ -0,0 +1,73 @@ + +# Author:: Dylan Page (<dpage@digitalocean.com>) +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'net/http' +require 'socket' + +module Ohai + module Mixin + module DOMetadata + + DO_METADATA_ADDR = "169.254.269.254" unless defined?(DO_METADATA_ADDR) + DO_METADATA_URL = "/metadata/v1.json" unless defined?(DO_METADATA_URL) + + def can_metadata_connect?(addr, port, timeout=2) + t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0) + saddr = Socket.pack_sockaddr_in(port, addr) + connected = false + + begin + t.connect_nonblock(saddr) + rescue Errno::EINPROGRESS + r,w,e = IO::select(nil,[t],nil,timeout) + if !w.nil? + connected = true + else + begin + t.connect_nonblock(saddr) + rescue Errno::EISCONN + t.close + connected = true + rescue SystemCallError + end + end + rescue SystemCallError + end + Ohai::Log.debug("DOMetadata mixin: can_metadata_connect? == #{connected}") + connected + end + + def http_client + Net::HTTP.start(DO_METADATA_ADDR).tap {|h| h.read_timeout = 6} + end + + def fetch_metadata() + uri = "#{DO_METADATA_URL}" + response = http_client.get(uri) + case response.code + when "200" + response.body + when "404" + Ohai::Log.debug("Encountered 404 response retreiving Digital Ocean metadata: #{uri} ; continuing.") + Hash.new + else + raise "Encountered error retrieving Digital Ocean metadata (#{uri} returned #{response.code} response)" + end + end + + end + end +end |