chef/cookbooks/zerotier/libraries/zerotier_network.rb

74 lines
3.1 KiB
Ruby

require "chef/log"
require "uri"
require "mixlib/shellout"
require "net/http"
require "net/https"
require "json"
module ChefZerotierCookbook
class ZerotierNetwork < Chef::Resource
resource_name :zerotier_network
default_action :join
# Set the properties for the resource
property :network_id, String, name_property: true, required: true
property :node_name, String, required: true
property :auth_token, String, required: true
property :central_url, String, default: "https://my.zerotier.com"
action :join do
if ::File.exists?(format("/var/lib/zerotier-one/networks.d/%s.conf", network_id))
Chef::Log.info(format("Network %s already joined. Skipping.", network_id))
else
join = Mixlib::ShellOut.new(format("/usr/sbin/zerotier-cli join %s", network_id))
join.run_command
raise format("Error joining network %s", network_id) if join.error?
if auth_token
url = URI.parse(format("%s/api/network/%s/member/%s/", central_url, network_id, node['zerotier']['node_id']))
netinfo = {
networkId: network_id,
nodeId: node["zerotier"]["node_id"],
name: node_name,
config: {
nwid: network_id,
authorized: true
}
}
response = Net::HTTP.start(url.host, url.port, use_ssl: url.scheme == "https") do |http|
post = Net::HTTP::Post.new(url, "Content-Type" => "application/json")
post.add_field("Authorization", format("Bearer %s", auth_token))
post.body = netinfo.to_json
http.request(post)
end
case response
when Net::HTTPSuccess
# do nothing
else
leave = Mixlib::ShellOut.new(format("/usr/sbin/zerotier-cli leave %s", network_id))
leave.run_command
error = JSON.parse(response.body)
raise format("Error %s authorizing network: %s: %s", response.code. error["type"], error["message"])
end
end
end
end
action :leave do
if ::File.exists?(format("/var/lib/zerotier-one/networks.d/%s.conf", network_id))
converge_by(format("Leaving network %s", network_id)) do
leave = Mixlib::ShellOut.new(format("/usr/sbin/zerotier-cli leave %s", network_id))
leave.run_command
raise format("Error leaving network %s", network_id) if leave.error?
end
else
Chef::Log.warn(format("Network %s is not joined. Skipping", network_id))
end
end
end
end