Skip to content

Commit

Permalink
Load modules config only for modules managed by puppet
Browse files Browse the repository at this point in the history
  • Loading branch information
deric committed Feb 16, 2024
1 parent 7487fc0 commit 3f979b8
Showing 1 changed file with 57 additions and 35 deletions.
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

0 comments on commit 3f979b8

Please sign in to comment.