From aeadd2940eb1c0578584d393910928831ed964a9 Mon Sep 17 00:00:00 2001 From: Jan Hejl Date: Mon, 6 Jan 2020 14:30:57 +0100 Subject: [PATCH 1/2] Move interface_driver.rb logic under Ethtool::Facter --- lib/facter/ethtool.rb | 38 ++++++++++++++++++++++++++++++++++ lib/facter/interface_driver.rb | 30 --------------------------- 2 files changed, 38 insertions(+), 30 deletions(-) delete mode 100644 lib/facter/interface_driver.rb diff --git a/lib/facter/ethtool.rb b/lib/facter/ethtool.rb index fad68ce..81585e3 100644 --- a/lib/facter/ethtool.rb +++ b/lib/facter/ethtool.rb @@ -13,6 +13,11 @@ def self.ethtool(interface) %x{/usr/sbin/ethtool #{Shellwords.escape(interface)} 2>/dev/null} end + # Run ethtool driver command + def self.ethtool_driver(interface) + %x{/usr/sbin/ethtool -i #{Shellwords.escape(interface)} 2>/dev/null} + end + # Get all interfaces on the system def self.interfaces Dir.foreach('/sys/class/net').reject{|x| x.start_with?('.', 'veth')} @@ -40,9 +45,20 @@ def self.gather max_speed = linkmodes && linkmodes.scan(/\d+/).map(&:to_i).max metrics['max_speed'] = max_speed.to_i if max_speed + # Collect driver information + driver_data = {} + driver_output = ethtool_driver(interface).split("\n").each do |line| + k, v = line.split(': ') + if v + driver_data[k]=v + end + end + metrics['driver_data'] = driver_data + # Gather the interface statistics next interfaces if metrics.empty? interfaces[alphafy(interface)] = metrics + interfaces end end @@ -84,6 +100,28 @@ def self.facts end end end + + # Expose driver data + ifstats.each do |interface, data| + next unless data['driver_data']['driver'] + Facter.add('driver_' + interface) do + confine :kernel => 'Linux' + setcode do + # Backwards compatibility + data['driver_data']['driver'].to_s + end + end + end + ifstats.each do |interface, data| + next unless data['driver_data']['version'] + Facter.add('driver_version' + interface) do + confine :kernel => 'Linux' + setcode do + # Backwards compatibility + data['driver_data']['version'].to_s + end + end + end end end diff --git a/lib/facter/interface_driver.rb b/lib/facter/interface_driver.rb deleted file mode 100644 index fdb0b9f..0000000 --- a/lib/facter/interface_driver.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'facter' -require 'facter/util/ip' -require 'json' -Facter::Util::IP.get_interfaces.each do |interface| - next if interface.start_with?('veth') - Facter.debug("Running ethtool on interface #{interface}") - data = {} - Facter::Util::Resolution.exec("ethtool -i #{interface} 2>/dev/null").split("\n").each do |line| - k, v = line.split(': ') - if v - data[k]=v - end - end - if data['driver'] - Facter.add('driver_' + Facter::Util::IP.alphafy(interface)) do - confine :kernel => "Linux" - setcode do - data['driver'] - end - end - end - if data['version'] - Facter.add('driver_version' + Facter::Util::IP.alphafy(interface)) do - confine :kernel => "Linux" - setcode do - data['version'] - end - end - end -end From 9e9b16630a8668b70947fc9a973a64f831d18095 Mon Sep 17 00:00:00 2001 From: Jan Hejl Date: Mon, 6 Jan 2020 15:52:45 +0100 Subject: [PATCH 2/2] Update specs to pass Travis tests --- .gitignore | 2 ++ .travis.yml | 11 +++++++++++ spec/unit/facts/ethtool_spec.rb | 7 ++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0a75ca7..6225347 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ pkg spec/fixtures/manifests spec/fixtures/modules .rspec_system +.ruby-version +.ruby-gemset Gemfile.lock diff --git a/.travis.yml b/.travis.yml index af7f108..487b017 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ rvm: - 1.9.3 - 2.0.0 - 2.1.0 + - 2.4.5 + - 2.5.3 script: bundle exec rake test env: - PUPPET_VERSION="~> 3.2.0" @@ -17,6 +19,8 @@ env: - PUPPET_VERSION="~> 3.7.0" - PUPPET_VERSION="~> 3.8.0" STRICT_VARIABLES=no FUTURE_PARSER=no - PUPPET_VERSION="~> 3.8.0" STRICT_VARIABLES=yes FUTURE_PARSER=yes + - PUPPET_VERSION="~> 5.0" STRICT_VARIABLES=yes + - PUPPET_VERSION="~> 6.0" STRICT_VARIABLES=yes matrix: exclude: @@ -37,3 +41,10 @@ matrix: env: PUPPET_VERSION="~> 3.3.0" - rvm: 2.1.0 env: PUPPET_VERSION="~> 3.4.0" + + # Ruby 2.4.5 + - rvm: 2.4.5 + env: PUPPET_VERSION="~> 5.0" + # Ruby 2.5.3 + - rvm: 2.5.3 + env: PUPPET_VERSION="~> 6.0" diff --git a/spec/unit/facts/ethtool_spec.rb b/spec/unit/facts/ethtool_spec.rb index 1a86f82..eb7cb58 100644 --- a/spec/unit/facts/ethtool_spec.rb +++ b/spec/unit/facts/ethtool_spec.rb @@ -69,7 +69,12 @@ Auto-negotiation: off MDI-X: Unknown Link detected: no') - expect(Ethtool::Facts.gather).to eq({'enp0s25'=>{'max_speed'=>1000},'vboxnet0'=>{'speed'=>10}}) + expect(Ethtool::Facts.gather).to eq( + { + 'enp0s25'=>{'max_speed'=>1000,'driver_data'=>{}}, + 'vboxnet0'=>{'speed'=>10,'driver_data'=>{}} + } + ) end end