251 lines
7.5 KiB
Ruby
251 lines
7.5 KiB
Ruby
require 'chef/provider/lwrp_base'
|
|
require_relative 'helpers'
|
|
|
|
class Chef
|
|
class Provider
|
|
class MysqlServiceBase < Chef::Provider::LWRPBase
|
|
use_inline_resources if defined?(use_inline_resources)
|
|
|
|
def whyrun_supported?
|
|
true
|
|
end
|
|
|
|
# Mix in helpers from libraries/helpers.rb
|
|
include MysqlCookbook::Helpers
|
|
|
|
# Service related methods referred to in the :create and :delete
|
|
# actions need to be implemented in the init system subclasses.
|
|
#
|
|
# create_stop_system_service
|
|
# delete_stop_service
|
|
|
|
# All other methods are found in libraries/helpers.rb
|
|
#
|
|
# etc_dir, run_dir, log_dir, etc
|
|
|
|
action :create do
|
|
# Yum, Apt, etc. From helpers.rb
|
|
configure_package_repositories
|
|
|
|
# Software installation
|
|
package "#{new_resource.name} :create #{server_package_name}" do
|
|
package_name server_package_name
|
|
version parsed_version if node['platform'] == 'smartos'
|
|
version new_resource.package_version
|
|
action new_resource.package_action
|
|
end
|
|
|
|
create_stop_system_service
|
|
|
|
# Apparmor
|
|
configure_apparmor
|
|
|
|
# System users
|
|
group "#{new_resource.name} :create mysql" do
|
|
group_name 'mysql'
|
|
action :create
|
|
end
|
|
|
|
user "#{new_resource.name} :create mysql" do
|
|
username 'mysql'
|
|
gid 'mysql'
|
|
action :create
|
|
end
|
|
|
|
# Yak shaving secion. Account for random errata.
|
|
#
|
|
# Turns out that mysqld is hard coded to try and read
|
|
# /etc/mysql/my.cnf, and its presence causes problems when
|
|
# setting up multiple services.
|
|
file "#{new_resource.name} :create #{prefix_dir}/etc/mysql/my.cnf" do
|
|
path "#{prefix_dir}/etc/mysql/my.cnf"
|
|
action :delete
|
|
end
|
|
|
|
file "#{new_resource.name} :create #{prefix_dir}/etc/my.cnf" do
|
|
path "#{prefix_dir}/etc/my.cnf"
|
|
action :delete
|
|
end
|
|
|
|
# mysql_install_db is broken on 5.6.13
|
|
link "#{new_resource.name} :create #{prefix_dir}/usr/share/my-default.cnf" do
|
|
target_file "#{prefix_dir}/usr/share/my-default.cnf"
|
|
to "#{etc_dir}/my.cnf"
|
|
action :create
|
|
end
|
|
|
|
# Support directories
|
|
directory "#{new_resource.name} :create #{etc_dir}" do
|
|
path etc_dir
|
|
owner new_resource.run_user
|
|
group new_resource.run_group
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
directory "#{new_resource.name} :create #{include_dir}" do
|
|
path include_dir
|
|
owner new_resource.run_user
|
|
group new_resource.run_group
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
directory "#{new_resource.name} :create #{run_dir}" do
|
|
path run_dir
|
|
owner new_resource.run_user
|
|
group new_resource.run_group
|
|
mode '0755'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
directory "#{new_resource.name} :create #{log_dir}" do
|
|
path log_dir
|
|
owner new_resource.run_user
|
|
group new_resource.run_group
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
directory "#{new_resource.name} :create #{parsed_data_dir}" do
|
|
path parsed_data_dir
|
|
owner new_resource.run_user
|
|
group new_resource.run_group
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
# Main configuration file
|
|
template "#{new_resource.name} :create #{etc_dir}/my.cnf" do
|
|
path "#{etc_dir}/my.cnf"
|
|
source 'my.cnf.erb'
|
|
cookbook 'mysql'
|
|
owner new_resource.run_user
|
|
group new_resource.run_group
|
|
mode '0600'
|
|
variables(
|
|
config: new_resource,
|
|
error_log: error_log,
|
|
include_dir: include_dir,
|
|
lc_messages_dir: lc_messages_dir,
|
|
pid_file: pid_file,
|
|
socket_file: socket_file,
|
|
tmp_dir: tmp_dir,
|
|
data_dir: parsed_data_dir
|
|
)
|
|
action :create
|
|
end
|
|
|
|
# initialize database and create initial records
|
|
bash "#{new_resource.name} :create initial records" do
|
|
code init_records_script
|
|
returns [0, 1, 2] # facepalm
|
|
not_if "/usr/bin/test -f #{parsed_data_dir}/mysql/user.frm"
|
|
action :run
|
|
end
|
|
end
|
|
|
|
action :delete do
|
|
# Stop the service before removing support directories
|
|
delete_stop_service
|
|
|
|
directory "#{new_resource.name} :delete #{etc_dir}" do
|
|
path etc_dir
|
|
recursive true
|
|
action :delete
|
|
end
|
|
|
|
directory "#{new_resource.name} :delete #{run_dir}" do
|
|
path run_dir
|
|
recursive true
|
|
action :delete
|
|
end
|
|
|
|
directory "#{new_resource.name} :delete #{log_dir}" do
|
|
path log_dir
|
|
recursive true
|
|
action :delete
|
|
end
|
|
end
|
|
|
|
#
|
|
# Platform specific bits
|
|
#
|
|
def configure_apparmor
|
|
# Do not add these resource if inside a container
|
|
# Only valid on Ubuntu
|
|
|
|
unless ::File.exist?('/.dockerenv') || ::File.exist?('/.dockerinit')
|
|
if node['platform'] == 'ubuntu'
|
|
# Apparmor
|
|
package "#{new_resource.name} :create apparmor" do
|
|
package_name 'apparmor'
|
|
action :install
|
|
end
|
|
|
|
directory "#{new_resource.name} :create /etc/apparmor.d/local/mysql" do
|
|
path '/etc/apparmor.d/local/mysql'
|
|
owner 'root'
|
|
group 'root'
|
|
mode '0755'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
template "#{new_resource.name} :create /etc/apparmor.d/local/usr.sbin.mysqld" do
|
|
path '/etc/apparmor.d/local/usr.sbin.mysqld'
|
|
cookbook 'mysql'
|
|
source 'apparmor/usr.sbin.mysqld-local.erb'
|
|
owner 'root'
|
|
group 'root'
|
|
mode '0644'
|
|
action :create
|
|
notifies :restart, "service[#{new_resource.name} :create apparmor]", :immediately
|
|
end
|
|
|
|
template "#{new_resource.name} :create /etc/apparmor.d/usr.sbin.mysqld" do
|
|
path '/etc/apparmor.d/usr.sbin.mysqld'
|
|
cookbook 'mysql'
|
|
source 'apparmor/usr.sbin.mysqld.erb'
|
|
owner 'root'
|
|
group 'root'
|
|
mode '0644'
|
|
action :create
|
|
notifies :restart, "service[#{new_resource.name} :create apparmor]", :immediately
|
|
end
|
|
|
|
template "#{new_resource.name} :create /etc/apparmor.d/local/mysql/#{new_resource.instance}" do
|
|
path "/etc/apparmor.d/local/mysql/#{new_resource.instance}"
|
|
cookbook 'mysql'
|
|
source 'apparmor/usr.sbin.mysqld-instance.erb'
|
|
owner 'root'
|
|
group 'root'
|
|
mode '0644'
|
|
variables(
|
|
data_dir: parsed_data_dir,
|
|
mysql_name: mysql_name,
|
|
log_dir: log_dir,
|
|
run_dir: run_dir,
|
|
pid_file: pid_file,
|
|
socket_file: socket_file
|
|
)
|
|
action :create
|
|
notifies :restart, "service[#{new_resource.name} :create apparmor]", :immediately
|
|
end
|
|
|
|
service "#{new_resource.name} :create apparmor" do
|
|
service_name 'apparmor'
|
|
action :nothing
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|