232 lines
39 KiB
Ruby
232 lines
39 KiB
Ruby
#
|
|
# Cookbook:: kosmos-ejabberd
|
|
# Recipe:: default
|
|
#
|
|
|
|
ejabberd_credentials = data_bag_item("credentials", "ejabberd")
|
|
|
|
ejabberd_version = node["ejabberd"]["version"]
|
|
package_checksum = node["ejabberd"]["checksum"]
|
|
package_path = "#{Chef::Config['file_cache_path']}/ejabberd_#{ejabberd_version}_amd64.deb"
|
|
|
|
remote_file package_path do
|
|
source "https://github.com/processone/ejabberd/releases/download/#{ejabberd_version}/ejabberd_#{ejabberd_version}-#{node["ejabberd"]["package_version"]}_amd64.deb"
|
|
checksum package_checksum
|
|
notifies :install, "dpkg_package[ejabberd]", :immediately
|
|
end
|
|
|
|
dpkg_package "ejabberd" do
|
|
source package_path
|
|
version ejabberd_version
|
|
options '--force-confdef --force-confold'
|
|
action :nothing
|
|
end
|
|
|
|
execute "update contrib modules" do
|
|
command "ejabberdctl modules_update_specs"
|
|
end
|
|
|
|
%w[mod_s3_upload].each do |emod|
|
|
execute "install #{emod}" do
|
|
command "ejabberdctl module_install #{emod}"
|
|
not_if { ::File.exist?("/opt/ejabberd/.ejabberd-modules/#{emod}/ebin") }
|
|
end
|
|
|
|
file "/opt/ejabberd/.ejabberd-modules/#{emod}/conf/#{emod}.yml" do
|
|
action :delete
|
|
end
|
|
end
|
|
|
|
file "/opt/ejabberd/.erlang.cookie" do
|
|
mode "0400"
|
|
owner "ejabberd"
|
|
group "ejabberd"
|
|
content ejabberd_credentials['erlang_cookie']
|
|
end
|
|
|
|
ejabberd_nodes = search(:node, "role:ejabberd")
|
|
|
|
ejabberd_nodes.each do |n|
|
|
ip_address = n["knife_zero"]["host"]
|
|
IPAddr.new ip_address
|
|
hostsfile_entry ip_address do
|
|
hostname n["hostname"]
|
|
action :create
|
|
end
|
|
rescue IPAddr::InvalidAddressError
|
|
next
|
|
end
|
|
|
|
ejabberd_hostnames = ejabberd_nodes.map { |n| n["hostname"] }
|
|
file "/opt/ejabberd/.hosts.erlang" do
|
|
mode "0644"
|
|
owner "ejabberd"
|
|
group "ejabberd"
|
|
content ejabberd_hostnames.map{|h| "#{h}."}.join("\n")
|
|
end
|
|
|
|
ruby_block "configure ERLANG_NODE" do
|
|
block do
|
|
file = Chef::Util::FileEdit.new("/opt/ejabberd/conf/ejabberdctl.cfg")
|
|
file.search_file_replace_line(
|
|
%r{#ERLANG_NODE=ejabberd@localhost},
|
|
"ERLANG_NODE=ejabberd@#{node['name']}"
|
|
)
|
|
file.write_file
|
|
end
|
|
end
|
|
|
|
postgresql_data_bag_item = data_bag_item('credentials', 'postgresql')
|
|
|
|
hosts = [
|
|
{
|
|
name: "kosmos.org",
|
|
sql_database: "ejabberd",
|
|
ldap_enabled: true,
|
|
ldap_password: ejabberd_credentials['kosmos_ldap_password'],
|
|
append_host_config: <<-EOF
|
|
modules:
|
|
mod_disco:
|
|
extra_domains:
|
|
- kosmos.chat
|
|
server_info:
|
|
-
|
|
modules: all
|
|
name: "abuse-addresses"
|
|
urls: ["mailto:abuse@kosmos.org"]
|
|
mod_muc:
|
|
host: kosmos.chat
|
|
access:
|
|
- allow
|
|
access_admin:
|
|
- allow: admin
|
|
access_create: muc_create
|
|
access_persistent: muc_create
|
|
access_register: muc_create
|
|
max_user_conferences: 1000
|
|
default_room_options:
|
|
mam: true
|
|
preload_rooms: true
|
|
mod_vcard:
|
|
search: false
|
|
vcard:
|
|
photo:
|
|
type: "image/png"
|
|
binval: "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"
|
|
EOF
|
|
},
|
|
{
|
|
name: "5apps.com",
|
|
sql_database: "ejabberd_5apps",
|
|
ldap_enabled: true,
|
|
ldap_password: ejabberd_credentials['5apps_ldap_password'],
|
|
append_host_config: <<-EOF
|
|
modules:
|
|
mod_disco:
|
|
extra_domains:
|
|
- muc.5apps.com
|
|
server_info:
|
|
-
|
|
modules: all
|
|
name: "abuse-addresses"
|
|
urls: ["mailto:mail@5apps.com"]
|
|
mod_muc:
|
|
host: "muc.@HOST@"
|
|
access:
|
|
- allow: local
|
|
access_admin:
|
|
- allow: admin
|
|
access_create: muc_create
|
|
access_persistent: muc_create
|
|
access_register: muc_create
|
|
max_user_conferences: 1000
|
|
default_room_options:
|
|
anonymous: false
|
|
public: true
|
|
members_only: true
|
|
public_list: false
|
|
persistent: true
|
|
mam: true
|
|
preload_rooms: true
|
|
mod_vcard:
|
|
search: false
|
|
EOF
|
|
}
|
|
]
|
|
|
|
ldap_domain = node['kosmos-dirsrv']['master_hostname']
|
|
ldap_encryption_type = "none"
|
|
ldap_base = "cn=users,dc=kosmos,dc=org"
|
|
|
|
admin_users = ejabberd_credentials['admins']
|
|
|
|
hosts.each do |host|
|
|
ldap_rootdn = "uid=service,ou=#{host[:name]},cn=applications,dc=kosmos,dc=org"
|
|
if host[:name] == "kosmos.org"
|
|
ldap_filter = "(&(objectClass=person)(serviceEnabled=xmpp))"
|
|
else
|
|
ldap_filter = "(objectClass=person)"
|
|
end
|
|
|
|
template "/opt/ejabberd/conf/#{host[:name]}.yml" do
|
|
source "vhost.yml.erb"
|
|
mode 0640
|
|
owner 'ejabberd'
|
|
group 'ejabberd'
|
|
sensitive true
|
|
variables pgsql_password: postgresql_data_bag_item['ejabberd_user_password'],
|
|
sql_server: "pg.kosmos.local",
|
|
host: host,
|
|
ldap_base: ldap_base,
|
|
ldap_server: ldap_domain,
|
|
ldap_rootdn: ldap_rootdn,
|
|
ldap_encryption_type: ldap_encryption_type,
|
|
ldap_filter: ldap_filter
|
|
notifies :reload, "service[ejabberd]", :delayed
|
|
end
|
|
end
|
|
|
|
akkounts_ip_addresses = []
|
|
search(:node, "role:akkounts").each do |n|
|
|
akkounts_ip_addresses << n["knife_zero"]["host"]
|
|
end
|
|
|
|
template "/opt/ejabberd/conf/ejabberd.yml" do
|
|
source "ejabberd.yml.erb"
|
|
mode 0640
|
|
sensitive true
|
|
variables hosts: hosts,
|
|
admin_users: admin_users,
|
|
turn_domain: node["ejabberd"]["turn_domain"],
|
|
stun_secret: ejabberd_credentials['stun_secret'],
|
|
stun_turn_port: node["ejabberd"]["stun_turn_port"],
|
|
stun_turn_port_tls: node["ejabberd"]["stun_turn_port_tls"],
|
|
turn_min_port: node["ejabberd"]["turn_min_port"],
|
|
turn_max_port: node["ejabberd"]["turn_max_port"],
|
|
private_ip_address: node["knife_zero"]["host"],
|
|
akkounts_ip_addresses: akkounts_ip_addresses,
|
|
mod_s3_upload: {
|
|
region: "garage",
|
|
bucket_url: "https://#{node["garage"]["xmpp_upload_bucket"]}.#{node["garage"]["s3_api_root_domain"]}",
|
|
download_url: "https://media.kosmos.chat",
|
|
key_id: ejabberd_credentials['s3_key_id'],
|
|
secret_key: ejabberd_credentials['s3_secret_key']
|
|
}
|
|
notifies :reload, "service[ejabberd]", :delayed
|
|
end
|
|
|
|
service "ejabberd" do
|
|
action [:enable, :start]
|
|
end
|
|
|
|
unless node.chef_environment == "development"
|
|
include_recipe "kosmos-ejabberd::firewall"
|
|
end
|
|
|
|
firewall_rule 'ejabberd_http' do
|
|
port [80]
|
|
source "10.1.1.0/24"
|
|
protocol :tcp
|
|
command :allow
|
|
end
|