Class: PuppetMetadata::OperatingSystem

Inherits:
Object
  • Object
show all
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.expand_path('../../data/eol_dates.json', __dir__).freeze

Class Method Summary collapse

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

Parameters:

  • operatingsystem (String)

    The operating system

  • release (String)

    The major version of the operating system

Returns:

  • (Boolean)

    The EOL date for the given operating system release. Nil is returned when the either when the OS, the release or the EOL date is unknown



74
75
76
77
# File 'lib/puppet_metadata/operatingsystem.rb', line 74

def eol?(operatingsystem, release, at = nil)
  date = eol_date(operatingsystem, release)
  date && date < (at || Date.today)
end

.eol_date(operatingsystem, release) ⇒ optional, Date

Return the EOL date for the given operating system release

Parameters:

  • operatingsystem (String)

    The operating system

  • release (String)

    The major version of the operating system

Returns:

  • (optional, Date)

    The EOL date for the given operating system release. Nil is returned when the either when the OS, the release or the EOL date is unknown



54
55
56
57
58
59
60
61
62
# File 'lib/puppet_metadata/operatingsystem.rb', line 54

def eol_date(operatingsystem, release)
  releases = OperatingSystem::EOL_DATES[operatingsystem]
  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

Parameters:

  • operatingsystem (String)

    The operating system

Returns:

  • (optional, String)

    The latest major release for the given operating system, if any is known



84
85
86
87
88
89
90
91
92
# File 'lib/puppet_metadata/operatingsystem.rb', line 84

def latest_release(operatingsystem)
  releases = OperatingSystem::EOL_DATES[operatingsystem]
  return unless releases

  keys = releases.keys
  keys = keys.select { |release| ubuntu_lts_version?(release) } if operatingsystem == 'Ubuntu'
  keys = keys.select { |release| sles_major_version?(release) } if operatingsystem == '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.

Parameters:

  • operatingsystem (String)

    The operating system name

  • release (String)

    The operating system release version

Returns:

  • (Optional[Integer])

    The Puppet major version, if any



123
124
125
126
127
128
129
130
131
132
133
# File 'lib/puppet_metadata/operatingsystem.rb', line 123

def os_release_puppet_version(operatingsystem, release)
  case operatingsystem
  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

Returns:

  • (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

Parameters:

  • operatingsystem (String)

    The operating system

  • at (Date) (defaults to: nil)

    The date to check the EOL time. Today is used when nil.

Returns:

  • (Array)

    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(operatingsystem, at = nil)
  releases = OperatingSystem::EOL_DATES[operatingsystem]

  # 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 operatingsystem == 'Ubuntu'
  releases = releases.select { |release, _eol_date| sles_major_version?(release) } if operatingsystem == '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

Returns:

  • (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