Table of Contents
Usage
Show help
It is a command lne tool.
With -h
or --help
you get a list of supported options.
$ ./eol_check.sh -h
_______________________________________________________________________________
EOL CHECK v0.26
_______________________________________________________________________________
Get end of life information of a product and show if a locally installed
version is still naintained and what is the newest version.
Data source is https://endoflife.date/ API.
This tool requires 'curl' and 'jq' to run.
👤 Author: Axel Hahn; Institute for Medical Education; University of Bern
📄 Source: <https://git-repo.iml.unibe.ch/iml-open-source/eol-check>
📜 License: GNU GPL 3.0
📗 Docs: <https://os-docs.iml.unibe.ch/eol-check/>
_______________________________________________________________________________
✨ SYNTAX:
eol_check.sh [OPTIONS] PRODUCT [VERSION]
🔷 OPTIONS:
-h|--help show this help and exit
-a|--api force api request and ignore cache
-c|--category NAME list products of given category name
-d|--details show details
-f|--full show all details (same like '-d -r')
-g|--getversion COMMAND
Override command to get version
-l|--list MODE list items (products|categories|identifiers|tags)
from endoflife.date
default is 'products'
-n|--newest show newest version data as json for given product
without check of local installation
-o|--os deect OS and check its eol status.
-r|--raw show raw output for versions (JSON)
-s|--show show end of life data as JSON and exit without check
of local installation
-t|--tag NAME list products of given tag name
-v|--verbose show more output (written to STDERR)
-w|--wipe Wipe created cache files
🔷 PARAMETER:
PRODUCT product name to check; use --list for a list of
known products
VERSION optional: check a given version; default: the locally
installed version will be detected
🏁 EXITCODES:
0: OK - up to date
1: minor update available
2: major update available
3: no support for your version
4: no support for the product
10 and higher: execution erors - version check was not performed
👉🏼XAMPLES:
With autodetection of installed version:
eol_check.sh ansible Eol infos in 2..3 lines output
eol_check.sh -d -r php full output with details and JSON
eol_check.sh -v java verbode mode with details during execution
eol_check.sh -n ruby Show newest version data for ruby
eol_check.sh -d -o Detect a linux OS and show its eol status with details
With given versipon version a product won't be tested:
eol_check.sh debian 12 Test Debian linux version 12
eol_check.sh -s rocky Dump Json response of api for Rocky Linux
Other functions
eol_check.sh -l List all products as <product> <tab> <description>
eol_check.sh -l tags List tags
eol_check.sh -w Wipe cache data
Check eol data of current version
Installed products
You can just add a product name.
Simple output:
$ ./eol_check.sh php
✅ PHP v8.4.11: You are up to date.
OK, your version is maintained.
End of life date: 2028-12-31 (1230 days left)
or
$ ./eol_check.sh node
⚠️ Node.js v20.19.4: Update with new major version is available: '24.6.0'.
OK, your version is maintained.
End of life date: 2026-04-30 (254 days left)
Full output:
./eol_check.sh -f node
⚠️ Node.js v20.19.4: Update with new major version is available: '24.6.0'.
OK, your version is maintained.
End of life date: 2026-04-30 (254 days left)
----------------------------------------------------------------------
Node.js
Latest major 24
Latest version 24.6.0
Category framework
Discontinued? (not set)
Links https://endoflife.date/nodejs
https://nodejs.org/en/about/previous-releases
----------------------------------------------------------------------
Your version 20.19.4
is Maintained true
End of life 2026-04-30
End of ext. security (not set)
----------------------------------------------------------------------
Data for latest version:
{
"name": "24",
"codename": null,
"label": "24 (Upcoming LTS)",
"releaseDate": "2025-05-06",
"isLts": false,
"ltsFrom": "2025-10-28",
"isEoas": false,
"eoasFrom": "2026-10-20",
"isEol": false,
"eolFrom": "2028-04-30",
"isEoes": null,
"eoesFrom": null,
"isMaintained": true,
"latest": {
"name": "24.6.0",
"date": "2025-08-14",
"link": "https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V24.md#24.6.0"
},
"custom": null
}
----------------------------------------------------------------------
Data for your version:
{
"name": "20",
"codename": null,
"label": "20 (LTS)",
"releaseDate": "2023-04-18",
"isLts": true,
"ltsFrom": "2023-10-24",
"isEoas": true,
"eoasFrom": "2024-10-22",
"isEol": false,
"eolFrom": "2026-04-30",
"isEoes": null,
"eoesFrom": null,
"isMaintained": true,
"latest": {
"name": "20.19.4",
"date": "2025-07-15",
"link": "https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V20.md#20.19.4"
},
"custom": null
}
Operating systems
With parameter --os
or -o
you don’t need to add a product name. It detects the current linux distribution.
./eol_check.sh -d -o
⚠️ Debian v12: Update with new major version is available: '13.0'.
OK, your version is maintained.
End of security: 2028-06-30 (1046 days left)
----------------------------------------------------------------------
Debian
Latest major 13
Latest version 13.0
Category os
Discontinued? (not set)
Links https://endoflife.date/debian
https://wiki.debian.org/DebianReleases
----------------------------------------------------------------------
Your version 12
is Maintained true
End of life 2026-06-10
End of ext. security 2028-06-30
Only distibutions that are available on endoflife.date can be verified, eg. operating systems with a rolling release are not in the database.
❌ ERROR: OS 'manjaro' is not in the list of available OSes in endoflife.data api.
Custom version command
Sometines the locally instaled version cannot be detected. Maybe because it is no installed in /usr/bin or another path not included in $PATH or you need to connect a service first and have no permissions.
Define a custon command by cli parameter
The parameter -g "<command>"
or --getcommand "<command>"
overrides the conmand in the response data from endoflife.date.
Example:
./eol_check.sh -g "/opt/keycloak/bin/kc.sh --version" keycloak
Create a custom script
If you need more logic or you want apply the same custom command to ll your servers then you can create a file in the folder ./eol_check-env/. The filename must be the same like your product key.
There you can buildup every logic to locate your instalation or execute the command to fetch the version number.
Another idea is to use such a custom script if the version number cannot be detected automatically.
The response is the minor version of the product.
Custom version command II
If you have a better alternative to get a version command than given by endoflife.date api (hint: use -v) and you are sure it is the better choice for the public then it can be added in the eol script in the comment section on top:
# ----- Get commands to get version of a product
# SYNTAX
# VERSION:<key>:<command>
# VERSION:docker-engine:docker --version
# VERSION:podman:podman --version
# VERSION:postgres:psql --version
Contact the autor and send your update.
Information without installation
Get a list of known products
Use -l
or --list
to get a list from the api what products are supported:
$ ./eol_check.sh -l
akeneo-pim Akeneo PIM
alibaba-ack Alibaba ACK
alibaba-dragonwell Alibaba Dragonwell
almalinux AlmaLinux OS
alpine-linux Alpine Linux
...
yocto Yocto Project
zabbix Zabbix
zentyal Zentyal
zerto Zerto
zookeeper Apache ZooKeeper
Test a given version number
You need to know what is a valid version number for your product. Then you can add it as 2nd parameter:
./eol_check.sh almalinux 9
⚠️ AlmaLinux OS v9: Update with new major version is available: '10.0'.
OK, your version is maintained.
End of life date: 2032-05-31 (2477 days left)
Get raw data for a product
If you want to see all data from the endoflife.data api us -s
or --show
. Use the ist keyword from the list of --list
output.
With this option no local version will be checked.
The response is json.
$ ./eol_check.sh -s ruby
{
"schema_version": "1.2.0",
"generated_at": "2025-07-02T05:32:23+00:00",
"last_modified": "2025-06-01T10:30:23+00:00",
"result": {
"name": "ruby",
"aliases": [],
"label": "Ruby",
"category": "lang",
"tags": [
"lang"
],
"versionCommand": "ruby --version",
...
}
}
Show newest version of product
Next to the raw data is --newest
a flag that shows data only without checking a local version.
./eol_check.sh --newest node
----------------------------------------------------------------------
Node.js
Latest version 24
Category framework
Link https://endoflife.date/nodejs
EOL Security Support
Discontinued null
----------------------------------------------------------------------
{
"name": "24",
"codename": null,
"label": "24 (Upcoming LTS)",
"releaseDate": "2025-05-06",
"isLts": false,
"ltsFrom": "2025-10-28",
"isEoas": false,
"eoasFrom": "2026-10-20",
"isEol": false,
"eolFrom": "2028-04-30",
"isEoes": null,
"eoesFrom": null,
"isMaintained": true,
"latest": {
"name": "24.4.0",
"date": "2025-07-09",
"link": "https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V24.md#24.4.0"
},
"custom": null
}
More lists
You can get a filtered list by tag or category.
set one of the modes behind –list
- products (default)
- categories
- identifiers
- tags
./eol_check.sh -l categories
server-app
service
lang
os
framework
app
database
device
standard
To get a list of products matching a category or filter use
./eol_check.sh --category <category>
or
./eol_check.sh --tag <tagname>
Check other operating systems
The endoflife.date website lists not only software products - among the list are operating systems too.
Show all tags:
./eol_check.sh --tag
php-runtime
server-app
alibaba
...
linux-distribution
os <<<
amazon
...
veeam
windows
zerto
To see supported operating systems we filter by tag “os”
./eol_check.sh --tag os
almalinux AlmaLinux OS
alpine-linux Alpine Linux
amazon-linux Amazon Linux
android Android OS
antix antiX Linux
tvos Apple tvOS
big-ip BIG-IP
centos-stream CentOS Stream
centos CentOS
cos Google Container-Optimized OS (COS)
debian Debian
devuan Devuan
eurolinux EuroLinux
fedora Fedora Linux
fortios FortiOS
freebsd FreeBSD
ibm-aix IBM AIX
ibm-i IBM iSeries
ios Apple iOS
ipados Apple iPadOS
kde-plasma KDE Plasma
lineageos LineageOS
linux Linux Kernel
linuxmint Linux Mint
macos Apple macOS
mageia Mageia
mxlinux MX Linux
netapp-ontap NetApp ONTAP
netbsd NetBSD
nixos NixOS
nutanix-aos Nutanix AOS
openbsd OpenBSD
opensuse openSUSE
openwrt OpenWrt
oracle-linux Oracle Linux
oracle-solaris Oracle Solaris
panos Palo Alto Networks PAN-OS
pop-os Pop!_OS
postmarketos postmarketOS
proxmox-ve Proxmox VE
rhel Red Hat Enterprise Linux
rocky-linux Rocky Linux
slackware Slackware Linux
sles SUSE Linux Enterprise Server
steamos SteamOS
tails Tails
ubuntu Ubuntu
visionos Apple visionOS
esxi VMware ESXi
photon VMware Photon
watchos Apple watchOS
windows-embedded Microsoft Windows Embedded
windows-nano-server Microsoft Nano Server
windows-server-core Microsoft Windows Server Core
windows-server Microsoft Windows Server
windows Microsoft Windows
xcp-ng XCP-ng
yocto Yocto Project
zentyal Zentyal
You can see the raw endoflife api data with –show … and to extract the latest version filter it with jq
.
Here is an example for debian
as opearting system:
./eol_check.sh -s debian | jq ".result .releases.[0]"
{
"name": "12",
"codename": "Bookworm",
"label": "12 (Bookworm)",
"releaseDate": "2023-06-10",
"isLts": false,
"ltsFrom": null,
"isEol": false,
"eolFrom": "2026-06-10",
"isEoes": false,
"eoesFrom": "2028-06-10",
"isMaintained": true,
"latest": {
"name": "12.11",
"date": "2025-05-17",
"link": "https://www.debian.org/News/2025/20250111"
},
"custom": null
}
Use it in scripts
Existcodes
You can use the exitcodes to get the logical result and show your own message or initialize an action.
Exitcode | Description |
---|---|
0 | OK - up to date |
1 | A minor update is available |
2 | A major update is available |
3 | No more support for your version |
4 | The company stopped the support for the product |
Errorcodes of 10 and higher mean that the script stopped without performing a version check.
Filter JSON and Debug output
The get the response data from endoflife api you can use -s <PRODICT>
. You can pipe the command to jq
to perform a custom filter.
Even when enabling debug information it will work because debug text is written to STDERR.
./eol_check.sh -v -s ruby | jq '.result .versionCommand'
DEBUG: _fetchData products ruby
DEBUG: Using cache /tmp/eol-cache__products__ruby.json; its age is 76 sec vs ttl 86400 sec; no request to https://endoflife.date/api/v1/products/ruby
DEBUG: Showing full response of endoflife API
"ruby --version"
Handle caching
By default a first request to the api of endoflife.data is needed. The response will be stored in /tmp/eol-cache__<name>.json
. For 1 day the cache file is used für the same api request.
You can override the local cache by using --api
.
With --wipe
all generated cache files can be deleted.