74 lines
3.1 KiB
Ruby
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 |