1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
require 'facterdb/version'
begin
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
rescue LoadError
end
begin
require 'github_changelog_generator/task'
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
config.future_release = FacterDB::Version::STRING
config.include_labels = %w[enhancement bug]
config.exclude_labels = %w[duplicate question invalid wontfix maintenance]
config.user = 'voxpupuli'
config.project = 'facterdb'
config.release_url = "https://rubygems.org/gems/facterdb/versions/%s"
config.since_tag = '0.3.11'
end
rescue LoadError
desc 'Install github_changelog_generator to get access to automatic changelog generation'
task :changelog do
raise 'Install github_changelog_generator to get access to automatic changelog generation'
end
end
# Generate a human-friendly OS label based on a given factset
def factset_to_os_label(fs)
os_rel = '???'
os_name = '????'
if fs.key?(:os) && fs[:os].key?('release') && (fs[:os]['release']['major'] =~ /\d/)
os_name = fs[:os]['name']
fail = Hash.new
os = fs[:os]
distro = os.fetch('lsb', os.fetch('distro', fail))
if distro.key?('id')
os_id = distro['id']
elsif distro.key?('distid')
os_id = distro['distid']
else
os_id = '@@@@@@@@@@'
end
os_rel = fs[:os]['release']['major']
os__rel = fs[:os]['release']['full']
elsif fs.key? :operatingsystem
os_name = fs[:operatingsystem]
os_id = fs.fetch(:lsbdistid, '@@@@@@@@@@')
os_rel = fs.fetch(:operatingsystemmajrelease, fs.fetch(:lsbmajdistrelease, nil))
os__rel = fs.fetch(:lsbdistrelease, fs.fetch(:operatingsystemrelease, '@@@'))
else
require 'pp'
pp fs
fail( 'ERROR: unrecognized facterset format' )
end
# Sanitize OS names to match the formats used in the facterdb README
label = "#{os_name} #{os_rel}"
if os_name =~ /^(Archlinux|Gentoo)$/
label = os_name
elsif os_name =~ /^(SLES|FreeBSD|OpenSuSE)$/ ||
(os_name =~ /^(RedHat|Scientific|OracleLinux|CentOS|AlmaLinux)/ && os_rel.nil?)
label = "#{os_name} #{os__rel.split('.').first}"
elsif os_name =~ /^(OpenBSD|Ubuntu|Fedora)$/
label = "#{os_name} #{os__rel}"
elsif os_name =~ /^(Solaris)/
if fs.key?(:os) && fs[:os].key?('release') && (fs[:os]['release']['major'] =~ /\d/)
label = "#{os_name} #{os_rel}"
elsif fs.key?(:operatingsystemmajrelease)
label = "#{os_name} #{os_rel}"
else
label = "#{os_name} #{os__rel.split('.')[1]}"
end
elsif fs[:_facterdb_filename] =~ /sles-15-/
label = "SLES 15"
elsif os_name.start_with?('Debian') && os_id == 'LinuxMint'
label = "#{os_id} #{fs[:lsbmajdistrelease]}"
elsif os_name.start_with?('Debian') && os_id == 'Raspbian'
label = "#{os_id} #{os_rel}"
elsif os_name =~ /^windows$/
db_filename = fs[:_facterdb_filename] || 'there_is_no_filename'
if db_filename =~ /windows-10-/
label = "Windows 10"
elsif db_filename =~ /windows-7-/
label = "Windows 7"
elsif db_filename =~ /windows-8[\d.]*-/
label = "Windows #{os__rel.sub('6.2.9200','8').sub('6.3.9600','8.1')}"
elsif db_filename =~ /windows-.+-core-/
label = "Windows Server #{os__rel.sub('6.3.9600','2012 R2')} Core"
elsif db_filename =~ /windows-2008/ || db_filename =~ /windows-2012/ || db_filename =~ /windows-2016/
label = "Windows Server #{os__rel.sub('6.1.7600','2008 R2').sub('6.3.9600','2012 R2').sub('10.0.14393', '2016')}"
elsif db_filename =~ /windows-2019/
label = 'Windows Server 2019'
else
label = "#{os_name} #{os__rel}"
end
end
label
end
desc 'generate a markdown table of Facter/OS coverage (for the README)'
task :table do
require_relative 'lib/facterdb'
# Turn on the source injection
old_env = ENV['FACTERDB_INJECT_SOURCE']
ENV['FACTERDB_INJECT_SOURCE'] = 'true'
factsets = FacterDB.get_facts()
# Restore the source injection
ENV['FACTERDB_INJECT_SOURCE'] = old_env
facter_versions = factsets.map { |x|
Gem::Version.new(x[:facterversion].split('.')[0..1].join('.'))
}.uniq.sort.map(&:to_s)
os_facter_matrix = {}
# Process the facts and create a hash of all the OS and facter combinations
factsets.each do |facts|
fv = facts[:facterversion].split('.')[0..1].join('.')
label = factset_to_os_label(facts)
os_facter_matrix[label] ||= {}
os_facter_matrix[label][fv] ||= 0
os_facter_matrix[label][fv] += 1
end
# Extract the OS list
os_versions = os_facter_matrix.keys.uniq.sort_by do |label|
string_pieces = label.split(/\d+/)
number_pieces = label.split(/\D+/).map(&:to_i)
number_pieces.shift
string_pieces.zip(number_pieces).flatten.compact
end
readme_path = File.expand_path(File.join(__dir__, 'README.md'))
readme = File.read(readme_path).split("\n")
new_readme = readme[0..readme.index { |r| r.start_with?('| ') } - 1]
# Write out a nice table
os_version_width = (os_versions.map{|x| x.size } + [17]).max
new_readme << "| #{'operating system'.center(os_version_width)} |#{facter_versions.map{|x| " #{x} |" }.join}"
new_readme << "| #{'-' * (os_version_width)} |#{facter_versions.map{|x| " --- |" }.join}"
os_versions.each do |label|
fvs = facter_versions.map{ |facter_version| os_facter_matrix[label][facter_version] || 0 }
row = "| #{label.ljust(os_version_width)} |"
fvs.each { |fv| row += (fv > 0? " #{fv.to_s.center(3)} |" : " |" ) }
new_readme << row
end
File.open(readme_path, 'w') do |fd|
fd.puts (new_readme + readme[readme.rindex { |r| r.start_with?('| ') } + 1..-1]).join("\n")
end
end
|