Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Load modules config only for modules managed by puppet (#90) #91

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 57 additions & 35 deletions lib/facter/kmod.rb
Original file line number Diff line number Diff line change
@@ -1,51 +1,73 @@
# frozen_string_literal: true

# @summary Return a hash of loaded kernel modules
# @summary Return a hash of loaded kernel modules explicitly declared by puppet
# e.g. using kmod::load { 'overlay': }

def kmod_load_module_config(kmodule)
if File.exist?('/sys/module')
config = {
'parameters' => {},
'used_by' => [],
}

if File.directory?("/sys/module/#{kmodule}/parameters")
Dir.foreach("/sys/module/#{kmodule}/parameters") do |param|
next if ['.', '..'].include?(param)

next unless File.readable?("/sys/module/#{kmodule}/parameters/#{param}")

begin
config['parameters'][param] = File.read("/sys/module/#{kmodule}/parameters/#{param}").chomp.delete("\u0000")
rescue StandardError
# some kernel parameters are write only
# even though they have the read bit set
# so just ignore read errors
nil
end
end
end

if File.directory?("/sys/module/#{kmodule}/holders")
Dir.foreach("/sys/module/#{kmodule}/holders") do |used|
next if ['.', '..'].include?(used)

config['used_by'] << used
end
end

config
else
Facter.debug('/sys/module is not found. skipping.')
end
end

Facter.add(:kmods) do
confine kernel: :linux

kmod = {}

setcode do
if File.exist?('/sys/module')
Dir.foreach('/sys/module') do |directory|
next if ['.', '..'].include?(directory)

kmod[directory] = {
'parameters' => {},
'used_by' => [],
}

if File.directory?("/sys/module/#{directory}/parameters")
Dir.foreach("/sys/module/#{directory}/parameters") do |param|
next if ['.', '..'].include?(param)

next unless File.readable?("/sys/module/#{directory}/parameters/#{param}")

begin
kmod[directory]['parameters'][param] = File.read("/sys/module/#{directory}/parameters/#{param}").chomp.delete("\u0000")
rescue StandardError
# some kernel parameters are write only
# even though they have the read bit set
# so just ignore read errors
nil
end
end
end

if File.directory?("/sys/module/#{directory}/holders")
Dir.foreach("/sys/module/#{directory}/holders") do |used|
next if ['.', '..'].include?(used)
if File.directory?('/etc/modules-load.d')
# Debian
Dir.foreach('/etc/modules-load.d') do |item|
next if ['.', '..', 'modules.conf'].include?(item)

kmod[directory]['used_by'] << used
end
if item.end_with? '.conf'
mod = File.basename(item, '.conf')
kmod[mod] = kmod_load_module_config(mod)
end
end
elsif File.directory?('/etc/sysconfig/modules')
# RedHat
Dir.foreach('/etc/sysconfig/modules') do |item|
next if ['.', '..'].include?(item)

kmod
else
Facter.debug('/sys/module is not found. skipping.')
if item.end_with? '.modules'
mod = File.basename(item, '.modules')
kmod[mod] = kmod_load_module_config(mod)
end
end
end
kmod
end
end