#
# Cookbook Name:: irrigate-maxwells
# Recipe:: default
#
# Copyright (C) 2017 The Orchard
#
# All rights reserved - Do Not Redistribute
#

case node['platform_family']
when 'rhel'

  packages = %w(
    java-1.8.0-openjdk
    java-1.8.0-openjdk-devel
    java-1.8.0-openjdk-headless
  )

  packages.each do |name|
    package name do
      action :remove
    end
  end

  packages = %w(
    java-11-openjdk
    java-11-openjdk-devel
    unzip
    zip
  )

  packages.each do |name|
    package name
  end

when 'debian'

  if node['platform_version'].to_s.start_with?('8')

    # Add jessie-backports in order to pick up Java 8
    apt_repository 'jessie-backports' do
      uri 'http://ftp.debian.org/debian'
      components ['main', 'jessie-backports']
    end

  end

  packages = %w(
    openjdk-8-jdk
  )

  packages.each do |name|
    package name do
      action :remove
    end
  end

  packages = %w(
    openjdk-11-jdk
    unzip
    zip
  )

  packages.each do |name|
    package name
  end

end

# Make variables clearer to read and shorter to reference
maxwell_user    = node['maxwell']['user']
maxwell_group   = node['maxwell']['group']
maxwell_home    = node['maxwell']['home']
maxwell_service = node['maxwell']['service_name']

user maxwell_user do
  manage_home true
  comment 'Maxwell service user'
  home maxwell_home
  shell '/bin/bash'
end

tar_extract node['maxwell']['source'] do
  download_dir node['maxwell']['download_dir']
  target_dir maxwell_home
  user maxwell_user
  group maxwell_group
  creates "#{maxwell_home}/bin"
  tar_flags '--strip-components 1'
end

if node['maxwell']['mysql']['mysql_data_bag'] && !node['maxwell']['mysql']['mysql_data_bag'].empty?
  maxwell_mysql_user_credentials = data_bag_item('secrets', node['maxwell']['mysql']['mysql_data_bag'])
  node.default['maxwell']['mysql']['host']     = maxwell_mysql_user_credentials['host'].chomp
  node.default['maxwell']['mysql']['user']     = maxwell_mysql_user_credentials['user'].chomp
  node.default['maxwell']['mysql']['password'] = maxwell_mysql_user_credentials['password'].chomp
end

if node['maxwell']['mysql']['replication_data_bag'] && !node['maxwell']['mysql']['replication_data_bag'].empty?
  maxwell_mysql_replication_user_credentials = data_bag_item('secrets', node['maxwell']['mysql']['replication_data_bag'])
  node.default['maxwell']['mysql']['replication_host']     = maxwell_mysql_replication_user_credentials['host'].chomp
  node.default['maxwell']['mysql']['replication_user']     = maxwell_mysql_replication_user_credentials['user'].chomp
  node.default['maxwell']['mysql']['replication_password'] = maxwell_mysql_replication_user_credentials['password'].chomp
end

# Optionally provide data encryption key from data bag
if node['maxwell']['encrypt_data'] == 'true' && !node['maxwell']['encryption_data_bag'].empty?
  maxwell_encryption_data = data_bag_item('secrets', node['maxwell']['encryption_data_bag'])
  node.default['maxwell']['encryption_key'] = maxwell_encryption_data['encryption_key'].chomp
  node.default['maxwell']['secret_key']     = maxwell_encryption_data['secret_key'].chomp
end

# Optionally provide Datadog API key from data bag
if node['maxwell']['monitor']['metrics_type'] =~ /datadog/ && !node['maxwell']['monitor']['metrics_datadog_data_bag'].empty?
  maxwell_datadog_api_credentials = data_bag_item('secrets', node['maxwell']['monitor']['metrics_datadog_data_bag'])
  node.default['maxwell']['monitor']['metrics_datadog_apikey'] = maxwell_datadog_api_credentials['apikey'].chomp
end

if node['maxwell']['producer'] == 'kinesis'

  python_runtime 'python2' do
    provider :system
    version '2.7'
  end

  python_packages = %w(
    awscli
  )

  python_packages.each do |name|
    python_package name
  end

  # Create ".aws" directory for service user
  directory "#{maxwell_home}/.aws" do
    owner maxwell_user
    group maxwell_group
    mode '0755'
    recursive true
  end

  # AWS credentials file for Kinesis producer
  unless node['maxwell']['aws']['credentials_data_bag'].empty?
    maxwell_aws_credentials = data_bag_item('secrets', node['maxwell']['aws']['credentials_data_bag'])
    node.default['maxwell']['aws']['access_key_id']     = maxwell_aws_credentials['access_key_id'].chomp
    node.default['maxwell']['aws']['secret_access_key'] = maxwell_aws_credentials['secret_access_key'].chomp
  end
  template "#{maxwell_home}/.aws/credentials" do
    source 'aws_credentials.erb'
    owner maxwell_user
    group maxwell_group
    mode '0640'
    sensitive true
  end

  # Set region to match KPL settings
  template "#{maxwell_home}/.aws/config" do
    source 'aws_config.erb'
    owner maxwell_user
    group maxwell_group
    mode '0640'
  end

  template "#{maxwell_home}/kinesis-producer-library.properties" do
    source 'kinesis-producer-library.properties.erb'
    mode '0644'
    owner maxwell_user
    group maxwell_group
    notifies :restart, "service[#{maxwell_service}]", :delayed
  end

end

exclude_expressions = node['maxwell']['filter']['exclude_expressions'].map { |expr| "exclude: #{expr}" }.join(', ')
include_expressions = node['maxwell']['filter']['include_expressions'].map { |expr| "include: #{expr}" }.join(', ')

template "#{maxwell_home}/config.properties" do
  source 'config.properties.erb'
  mode '0640'
  owner maxwell_user
  group maxwell_group
  sensitive true
  variables(
    exclude_expressions: exclude_expressions,
    include_expressions: include_expressions
  )
  notifies :restart, "service[#{maxwell_service}]", :delayed
end

systemd_unit "#{maxwell_service}.service" do
  content(
    Unit: {
      Description: maxwell_service,
      Documentation: 'http://maxwells-daemon.io',
      After: 'network.target',
    },
    Service: {
      User: maxwell_user,
      Group: maxwell_group,
      WorkingDirectory: maxwell_home,
      Type: 'simple',
      ExecStart: "#{maxwell_home}/bin/maxwell",
      RestartSec: '2s',
      Restart: 'on-failure',
    },
    Install: {
      WantedBy: 'multi-user.target',
    }
  )
  triggers_reload true
  action [:create, :enable]
end

# Watchdog script can run if metrics_type is http
if node['maxwell']['monitor']['metrics_type'] == 'http' && node['maxwell']['monitor']['watchdog_enabled'] == 'true'

  python_runtime 'python2' do
    provider :system
    version '2.7'
  end

  python_packages = %w(
    requests
  )

  python_packages.each do |name|
    python_package name
  end

  template "#{maxwell_home}/watchdog.py" do
    source 'watchdog.py.erb'
    mode '0640'
    owner 'root'
    group 'root'
  end

  # Run watchdog on a cron
  cron "#{maxwell_service}_watchdog" do
    hour '*'
    minute '*/5'
    user 'root'
    command "/usr/bin/python #{maxwell_home}/watchdog.py"
  end

end

# Remove stale Maxwell's event files in /tmp.
if node['maxwell']['tmp_cleanup_enabled'] == 'true'
  template "#{maxwell_home}/cleanup_tmp.sh" do
    source 'cleanup_tmp.sh.erb'
    mode '0755'
    owner 'root'
    group 'root'
  end

  cron "#{maxwell_service}_tmp_cleanup" do
    hour '*'
    minute '*/10'
    user 'root'
    shell '/bin/bash'
    command "#{maxwell_home}/cleanup_tmp.sh"
  end
end

service maxwell_service do
  supports 'restart' => true, 'status' => true, 'reload' => false
  action [:enable, :start]
end
