Class: PuppetMetadata::OperatingSystem
- Inherits:
-
Object
- Object
- PuppetMetadata::OperatingSystem
- Defined in:
- lib/puppet_metadata/operatingsystem.rb
Overview
An abstraction layer over operating systems. Mostly to determine End Of Life dates.
Constant Summary collapse
- EOL_DATES_FILE =
The EOL dates are maintained in data/eol_dates.json and can be updated automatically using the bin/update_eol_dates script.
Lazy load the JSON data to minimize disk I/O and JSON parsing.
File.('../../data/eol_dates.json', __dir__).freeze
Class Method Summary collapse
- .const_missing(name) ⇒ Object
-
.eol?(operatingsystem, release, at = nil) ⇒ Boolean
Return whether the given operating system release is EOL at the given date.
-
.eol_date(operatingsystem, release) ⇒ optional, Date
Return the EOL date for the given operating system release.
-
.latest_release(operatingsystem) ⇒ optional, String
Return the latest known release for a given operating system.
-
.os_release_puppet_version(operatingsystem, release) ⇒ Optional[Integer]
Return the Puppet major version in an OS release, if any.
- .reset_eol_dates_cache! ⇒ Object
- .sles_major_version?(release) ⇒ Boolean
-
.supported_releases(operatingsystem, at = nil) ⇒ Array
Return an array of all Operating System versions that aren’t EoL.
- .ubuntu_lts_version?(release) ⇒ Boolean
Class Method Details
.const_missing(name) ⇒ Object
20 21 22 23 24 25 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 20 def self.const_missing(name) return super unless name == :EOL_DATES dates = JSON.parse(File.read(EOL_DATES_FILE)).freeze const_set(:EOL_DATES, dates) end |
.eol?(operatingsystem, release, at = nil) ⇒ Boolean
Return whether the given operating system release is EOL at the given date
74 75 76 77 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 74 def eol?(, release, at = nil) date = eol_date(, release) date && date < (at || Date.today) end |
.eol_date(operatingsystem, release) ⇒ optional, Date
Return the EOL date for the given operating system release
54 55 56 57 58 59 60 61 62 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 54 def eol_date(, release) releases = ::EOL_DATES[] return unless releases date = releases[release] return unless date Date.parse(date) end |
.latest_release(operatingsystem) ⇒ optional, String
Return the latest known release for a given operating system
84 85 86 87 88 89 90 91 92 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 84 def latest_release() releases = ::EOL_DATES[] return unless releases keys = releases.keys keys = keys.select { |release| ubuntu_lts_version?(release) } if == 'Ubuntu' keys = keys.select { |release| sles_major_version?(release) } if == 'SLES' keys.max_by { |release| Gem::Version.new(release) } end |
.os_release_puppet_version(operatingsystem, release) ⇒ Optional[Integer]
Return the Puppet major version in an OS release, if any
Only tracks releases without an AIO build, since that’s preferred.
123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 123 def os_release_puppet_version(, release) case when 'Fedora' case release when '39', '40' 8 when '37', '38' 7 end end end |
.reset_eol_dates_cache! ⇒ Object
27 28 29 30 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 27 def self.reset_eol_dates_cache! remove_const(:EOL_DATES) if const_defined?(:EOL_DATES, false) nil end |
.sles_major_version?(release) ⇒ Boolean
42 43 44 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 42 def sles_major_version?(release) release.match?(/^\d+$/) end |
.supported_releases(operatingsystem, at = nil) ⇒ Array
Return an array of all Operating System versions that aren’t EoL
98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 98 def supported_releases(, at = nil) releases = ::EOL_DATES[] # return an empty array if one OS has zero dates # Happens for esoteric distros like windows, where we currently don't have any data in EOL_DATES return [] unless releases releases = releases.select { |release, _eol_date| ubuntu_lts_version?(release) } if == 'Ubuntu' releases = releases.select { |release, _eol_date| sles_major_version?(release) } if == 'SLES' at ||= Date.today releases.select { |_release, eol_date| !eol_date || Date.parse(eol_date) > at }.keys .sort_by { |release| Gem::Version.new(release) } end |
.ubuntu_lts_version?(release) ⇒ Boolean
33 34 35 36 37 38 39 40 |
# File 'lib/puppet_metadata/operatingsystem.rb', line 33 def ubuntu_lts_version?(release) # Ubuntu LTS releases are even-year April releases (e.g. 22.04, 24.04). match = release.match(/^([0-9]+)\.04$/) return false unless match year = match[1].to_i year.even? end |