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 =

The EOL dates for the various operating systems

See Also:

{
  # https://wiki.almalinux.org/release-notes/
  'AlmaLinux' => {
    '9' => '2032-05-31',
    '8' => '2029-05-31',
  },
  # https://endoflife.software/operating-systems/linux/centos
  'CentOS' => {
    '9' => nil, # EOL Date is not yet announced.
    '8' => '2024-05-31',
    '7' => '2024-06-30',
    '6' => '2020-11-30',
    '5' => '2017-03-31',
    '4' => '2012-02-29',
    '3' => '2010-10-30',
  },
  # https://wiki.debian.org/DebianReleases
  'Debian' => {
    # TODO: EOL is standard support, not the extended life cycle
    '12' => nil, # '~2026',
    '11' => nil, # '~2024',
    '10' => '2022-09-10',
    '9' => '2020-07-06',
    '8' => '2018-06-17',
    '7' => '2016-04-26',
    '6' => '2015-05-31',
    '5' => '2012-02-06',
    '4' => '2010-02-15',
    '3.1' => '2008-03-31',
    '3.0' => '2006-06-30',
    '2.2' => '2003-06-30',
    '2.1' => '2000-09-30',
  },
  # https://endoflife.date/oraclelinux
  'OracleLinux' => {
    '9' => '2032-06-30',
    '8' => '2029-07-01',
    '7' => '2024-12-31',
  },
  # https://docs.fedoraproject.org/en-US/releases/eol/
  'Fedora' => {
    '41' => nil,
    '40' => nil,
    '39' => nil,
    '38' => '2024-05-21',
    '37' => '2023-12-05',
    '36' => '2023-05-16',
    '35' => '2022-12-13',
    '34' => '2022-06-07',
    '33' => '2021-11-30',
    '32' => '2021-05-25',
    '31' => '2020-11-24',
    '30' => '2020-05-26',
    '29' => '2019-11-26',
    '28' => '2019-05-28',
    '27' => '2018-11-30',
    '26' => '2018-05-29',
    '25' => '2017-12-12',
    '24' => '2017-08-08',
    '23' => '2016-12-20',
    '22' => '2016-07-19',
    '21' => '2015-12-01',
    '20' => '2015-06-23',
    '19' => '2015-01-06',
    '18' => '2014-01-14',
    '17' => '2013-07-30',
    '16' => '2013-02-12',
    '15' => '2012-06-26',
    '14' => '2011-12-08',
    '13' => '2011-06-24',
    '12' => '2010-12-02',
    '11' => '2010-06-25',
    '10' => '2009-12-18',
    '9' => '2009-07-10',
    '8' => '2009-01-07',
    '7' => '2008-06-13',
    '6' => '2007-12-07',
    '5' => '2007-07-02',
    '4' => '2006-08-07',
    '3' => '2006-01-16',
    '2' => '2005-04-11',
    '1' => '2004-09-20',
  },
  # https://endoflife.software/operating-systems/unix-like-bsd/freebsd
  'FreeBSD' => {
    '13' => '2026-01-31',
    '12' => '2024-06-30',
    '11' => '2021-09-30',
    '10' => '2018-10-31',
    '9' => '2016-12-31',
    '8' => '2015-08-01',
    '7' => '2013-02-28',
    '6' => '2010-11-30',
    '5' => '2008-05-31',
    '4' => '2007-01-31',
  },
  # https://endoflife.software/operating-systems/linux/red-hat-enterprise-linux-rhel
  'RedHat' => {
    # TODO: EOL is standard support, not the extended life cycle
    '8' => '2029-05-31',
    '7' => '2024-06-30',
    '6' => '2020-11-30',
    '5' => '2017-03-31',
    '4' => '2012-02-29',
    '3' => '2010-10-31',
  },
  # https://wiki.rockylinux.org/rocky/version/
  'Rocky' => {
    '9' => '2032-05-31',
    '8' => '2029-05-31',
  },
  # https://endoflife.software/operating-systems/linux/ubuntu
  'Ubuntu' => {
    '22.04' => '2027-04-15',
    '21.10' => '2022-07-15',
    '20.10' => '2021-07-15',
    '20.04' => '2025-04-15',
    '19.10' => '2020-07-15',
    '19.04' => '2020-01-15',
    '18.10' => '2019-07-15',
    '18.04' => '2023-05-31',
    '17.10' => '2018-07-15',
    '17.04' => '2018-01-15',
    '16.10' => '2017-07-20',
    '16.04' => '2021-04-15',
    '15.10' => '2016-07-28',
    '15.04' => '2016-02-04',
    '14.10' => '2015-07-23',
    '14.04' => '2019-04-15',
    '13.10' => '2014-07-17',
    '13.04' => '2014-01-27',
    '12.04' => '2017-04-28',
    '11.10' => '2013-05-09',
    '11.04' => '2012-10-28',
    '10.10' => '2012-04-10',
    '10.04' => '2015-04-30',
    '9.10' => '2011-04-30',
    '9.04' => '2010-10-23',
    '8.10' => '2010-04-30',
    '8.04' => '2013-05-09',
    '7.10' => '2009-04-18',
    '7.04' => '2008-10-19',
    '6.10' => '2008-04-26',
    '6.06' => '2011-06-01',
    '5.10' => '2007-04-13',
    '5.04' => '2006-10-31',
    '4.10' => '2006-04-30',
  },
}.freeze

Class Method Summary collapse

Class Method Details

.eol?(operatingsystem, release, at = nil) ⇒ Boolean

Return whether the given operating system release is EOL at the given date



194
195
196
197
# File 'lib/puppet_metadata/operatingsystem.rb', line 194

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



174
175
176
177
178
179
180
181
182
# File 'lib/puppet_metadata/operatingsystem.rb', line 174

def eol_date(operatingsystem, release)
  releases = 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



204
205
206
207
# File 'lib/puppet_metadata/operatingsystem.rb', line 204

def latest_release(operatingsystem)
  releases = EOL_DATES[operatingsystem]
  releases&.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.



229
230
231
232
233
234
235
236
237
238
239
# File 'lib/puppet_metadata/operatingsystem.rb', line 229

def os_release_puppet_version(operatingsystem, release)
  case operatingsystem
  when 'Fedora'
    case release
    when '39', '40'
      8
    when '37', '38'
      7
    end
  end
end

.supported_releases(operatingsystem) ⇒ Array

Return an array of all Operating System versions that aren’t EoL



212
213
214
215
216
217
# File 'lib/puppet_metadata/operatingsystem.rb', line 212

def supported_releases(operatingsystem)
  releases = EOL_DATES[operatingsystem]
  today = Date.today
  releases.select { |_release, eol_date| !eol_date || Date.parse(eol_date) > today }.keys
          .sort_by { |release| Gem::Version.new(release) }
end