require 'ipaddr'
Env.dump(self, ['ip', cookbook_name], repo: cookbook_name)
Common.directories(self, [ node['proxy']['dir']['app'], node['proxy']['dir']['config'], node['proxy']['dir']['logs'] ] )
package 'caddy'
ruby_block 'proxmox_containers' do
block do
node.run_state['proxy_hosts'] = Utils.proxmox(node, 'lxc').map do |state|
config = Utils.proxmox(node, "lxc/#{state['vmid']}/config")
ip = config['net0'] ? config['net0'].match(/ip=([\d\.]+)/)&.[](1) : "404"
"#{state['name']}.#{node['proxy']['config']['domain']} #{ip} #{state['name']}"
end
Logs.info(node.run_state['proxy_hosts'])
end
end
template "#{node['proxy']['dir']['app']}/Caddyfile" do
source 'Caddyfile.erb'
owner node['app']['user']
group node['app']['group']
mode '0644'
variables( hosts: lazy { node.run_state['proxy_hosts'] || [] }, app_dir: node['proxy']['dir']['app'],
config_dir: node['proxy']['dir']['config'], log_dir: node['proxy']['dir']['logs'], logs_roll_size: node['proxy']['logs']['roll_size'],
logs_roll_keep: node['proxy']['logs']['roll_keep'], logs_roll_for: node['proxy']['logs']['roll_for'],
internal: node['proxy']['config']['internal'] )
end
remote_directory node['proxy']['dir']['config'] do
source 'config'
owner node['app']['user']
group node['app']['group']
mode '0775'
files_mode '0664'
end
execute "#{self.cookbook_name}_initialize" do
command "/bin/caddy trust --config #{node['proxy']['dir']['app']}/Caddyfile"
user 'root'
timeout 120
not_if { ::File.directory?("#{node['proxy']['dir']['app']}/certificates") ||
::File.directory?("#{node['proxy']['dir']['app']}/pki") }
subscribes :run, "template[#{node['proxy']['dir']['app']}/Caddyfile]", :immediately
action :nothing
end
ruby_block "#{self.cookbook_name}_application" do block do
Common.application(self, cookbook_name, actions: [:start, :enable],
exec: "/bin/caddy run --config #{node['proxy']['dir']['app']}/Caddyfile",
subscribe: ["template[#{node['proxy']['dir']['app']}/Caddyfile]", "remote_directory[#{node['proxy']['dir']['config']}]"],
unit: { 'Unit': { 'Wants' => 'share.service', 'After' => 'network.target share.service' },
'Service' => { 'AmbientCapabilities' => 'CAP_NET_BIND_SERVICE' } } )
end end