libraries/helpers.rb
#
# Cookbook Name:: logio
# Library:: helpers
#
# Author:: Mauricio Araya V. (hello@mauricioaraya.net)
# http://mauricioaraya.net
#
# Copyright (C) 2015 Mauricio Araya V.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is furnished to do
# so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
class Chef
# Logio module
module Logio
# Helpers module
module Helpers
def watching?(stream, file)
node.run_state['logio_watched_files'][stream].include? file
rescue NoMethodError
false
end
def valid_service?(service_type)
[:server, :harvester].include?(service_type.to_sym)
end
def group_id
gid = Mixlib::ShellOut.new("eval printf $(id -g -n #{node['logio']['username']})")
gid.run_command.stdout
end
def user_home
gid = Mixlib::ShellOut.new("eval printf ~#{node['logio']['username']}")
gid.run_command.stdout
end
def reload_users
ohai 'reload users' do
plugin 'etc'
action :reload
end
end
def install_nvm
nvm_install_dir = "#{user_home}/.nvm"
remote_file "#{Chef::Config[:file_cache_path]}/nvm-install-#{node['logio']['nvm_version']}.sh" do
source node['logio']['nvm_installer']
owner node['logio']['username']
group group_id
mode '0700'
action :create
retries 2
retry_delay 1
not_if { ::File.directory? nvm_install_dir }
end
bash 'install-nvm' do
environment 'HOME' => user_home
cwd user_home
code "#{Chef::Config[:file_cache_path]}/nvm-install-#{node['logio']['nvm_version']}.sh"
user node['logio']['username']
group group_id
not_if { ::File.directory? nvm_install_dir }
end
end
def install_nodejs
nvm_install_dir = "#{user_home}/.nvm"
bash 'install-node' do
environment 'HOME' => user_home
cwd user_home
code <<-EOH
source #{nvm_install_dir}/nvm.sh
nvm install v#{node['logio']['node_version']} &&
nvm alias default v#{node['logio']['node_version']}
EOH
user node['logio']['username']
group group_id
not_if { ::File.exist? "#{nvm_install_dir}/alias/default" }
end
end
def install_logio
nvm_install_dir = "#{user_home}/.nvm"
bash 'install-logio' do
environment 'HOME' => user_home
cwd user_home
code <<-EOH
source #{nvm_install_dir}/nvm.sh &&
npm ls -g log.io ||
npm install -g log.io
EOH
user node['logio']['username']
group group_id
retries 2
retry_delay 1
end
end
def install_pm2
nvm_install_dir = "#{user_home}/.nvm"
bash 'install-pm2' do
environment 'HOME' => user_home
cwd user_home
code <<-EOH
source #{nvm_install_dir}/nvm.sh &&
npm ls -g pm2 ||
npm install -g pm2
EOH
user node['logio']['username']
group group_id
retries 2
retry_delay 1
end
end
def configure_harvester
harvester_cfg = harvester_config
logio_cfg_path = "#{user_home}/.log.io"
prepare_directory(logio_cfg_path)
file_from_template("#{logio_cfg_path}/harvester.json",
'json_config.erb',
{ json_config: JSON.pretty_generate(harvester_cfg) })
file_from_template("#{logio_cfg_path}/harvester.json",
'json_config.erb',
{ json_config: JSON.pretty_generate(harvester_cfg) })
file_from_template("#{user_home}/.log.io/harvester.conf",
'load_json_config.erb',
{
logio_cfg_path: "#{user_home}/.log.io",
json_file: 'harvester.json'
})
end
def configure_log_server
log_server_cfg = log_server_config
logio_cfg_path = "#{user_home}/.log.io"
prepare_directory(logio_cfg_path)
file_from_template("#{logio_cfg_path}/log_server.json",
'json_config.erb',
{ json_config: JSON.pretty_generate(log_server_cfg) })
file_from_template("#{logio_cfg_path}/log_server.conf",
'load_json_config.erb',
{
logio_cfg_path: "#{user_home}/.log.io",
json_file: 'log_server.json'
})
end
def configure_web_server
web_server_cfg = web_server_config
logio_cfg_path = "#{user_home}/.log.io"
prepare_directory(logio_cfg_path)
file_from_template("#{logio_cfg_path}/web_server.json",
'json_config.erb',
{ json_config: JSON.pretty_generate(web_server_cfg) })
file_from_template("#{logio_cfg_path}/web_server.conf",
'load_json_config.erb',
{
logio_cfg_path: logio_cfg_path,
json_file: 'web_server.json'
})
end
def enable_server
logio_launcher('/etc/init.d/logio-server.sh',
"#{node['platform_family']}_service.erb",
{ app_name: 'log.io-server',
app_script: 'logio-server.sh',
user: node['logio']['username'],
nvm_loader: "#{user_home}/.nvm/nvm.sh"
})
service 'logio-server.sh' do
supports start: true
action [:enable, :start]
notifies :start, 'service[logio-server.sh]'
end
end
def enable_harvester
logio_launcher('/etc/init.d/logio-harvester.sh',
"#{node['platform_family']}_service.erb",
{ app_name: 'log.io-harvester',
app_script: 'logio-harvester.sh',
user: node['logio']['username'],
nvm_loader: "#{user_home}/.nvm/nvm.sh"
})
service 'logio-harvester.sh' do
supports start: true
action [:enable, :start]
notifies :start, 'service[logio-harvester.sh]'
end
end
private
def prepare_directory(path)
directory path do
owner node['logio']['username']
group group_id
recursive true
action :create
not_if { ::File.directory? path }
end
end
def file_from_template(target_file, tpl_source, tpl_vars)
template target_file do
cookbook 'logio'
source tpl_source
variables (tpl_vars)
owner node['logio']['username']
group group_id
end
end
def logio_launcher(target_file, tpl_source, tpl_vars)
template target_file do
cookbook 'logio'
source tpl_source
variables (tpl_vars)
owner 'root'
group 'root'
mode '0755'
end
end
def service_launcher(logio_service)
service logio_service do
supports start: true
action [:enable, :start]
lazy { notifies :start, "service['#{logio_service}']" }
end
end
def harvester_config
harvester_cfg = {}
harvester_cfg['nodeName'] = node['logio']['client']['node_name']
harvester_cfg['logStreams'] = node.run_state['logio_watched_files'].clone if node.run_state.key?('logio_watched_files')
harvester_cfg['server'] = { host: node['logio']['client']['remote_host'],
port: node['logio']['client']['remote_port']
}
harvester_cfg
end
def log_server_config
log_server_cfg = {
host: node['logio']['server']['listen_ip'],
port: node['logio']['server']['listen_port']
}
log_server_cfg
end
def web_server_config
web_server_cfg = {
host: node['logio']['web_server']['listen_host'],
port: node['logio']['web_server']['listen_port'],
restrictSocket: node['logio']['web_server']['restrict_socket']
}
web_server_cfg['restrictHTTP'] = node['logio']['web_server']['restrict_http'] unless node['logio']['web_server']['restrict_http'].empty?
web_server_cfg['auth'] = {} unless node['logio']['web_server']['username'].nil? ||
node['logio']['web_server']['password'].nil?
web_server_cfg['auth']['user'] = node['logio']['web_server']['username'] unless node['logio']['web_server']['username'].nil?
web_server_cfg['auth']['pass'] = node['logio']['web_server']['password'] unless node['logio']['web_server']['password'].nil?
web_server_cfg['ssl'] = {} unless node['logio']['web_server']['ssl_pkey'].nil? ||
node['logio']['web_server']['ssl_cert'].nil?
web_server_cfg['ssl']['key'] = node['logio']['web_server']['ssl_pkey'] unless node['logio']['web_server']['ssl_pkey'].nil?
web_server_cfg['ssl']['cert'] = node['logio']['web_server']['ssl_cert'] unless node['logio']['web_server']['ssl_cert'].nil?
web_server_cfg
end
end
end
end