Plug-ins
How it works
Add any additional information, beyond OS and package status, by dropping executable files into /etc/oschecker/plugins.d/. The filename becomes the field name, whatever the file prints to stdout becomes the value. Use any programming language, as long as the file is executable. Plug-ins run on every checkin - once an hour by default - so keep them quick. For example:
/etc/oschecker/plugins.d/disk-usage-var.sh
#!/bin/sh
# Disk usage of the filesystem holding /var
df -P --block-size=1000000 /var | LC_ALL=C awk 'NR==2 {printf "%.1f GB of %.1f GB (%s)\n", $3/1000, $2/1000, $5}'
/etc/oschecker/plugins.d/backup-age.py
#!/usr/bin/env python3
# Get the age of the latest backup file
import pathlib, time
mtime = pathlib.Path("/var/backups/latest.tar.gz").stat().st_mtime
print(f"{(time.time() - mtime) / 3600:.1f}h")
The fields show up on the machine, next to OS and package status.
$ oschecker machine
name:web-server-01
os:Debian 13
packages:up to date
disk-usage-var:24.8 GB of 40.0 GB (62%)
backup-age:3.2h
Running oschecker checkin --dry-run executes your plugin scripts, so you can check their output before the next scheduled checkin.
Examples
Starting points rather than finished plug-ins - read one before installing it, and adjust it to your machine. Some have a value at the top to change, like a domain or a service, and some need a program that may not be installed.
Copy the install command with the button next to each plug-in. For example:
curl -fsSL https://oschecker.com/plugin-examples/uptime.sh | sudo install -m 755 /dev/stdin /etc/oschecker/plugins.d/uptime.sh
System
- hostname.sh
- Network hostname of the machine
- uptime.sh
- Time since the last boot
- system-age.py
- Days since the OS was installed
- memory.sh
- Memory usage
- apt-reboot-required.sh
- Whether a reboot is required on APT-based systems
- dnf-reboot-required.sh
- Whether a reboot is required on DNF-based systems
Storage
- disk-usage-var.sh
- Disk usage of the filesystem holding /var
- folder-size-bin.sh
- Disk usage of a directory
- file-age.py
- Age of a file in days
- raid-status.sh
- State of software RAID arrays and ZFS pools
Hardware
- hardware-model.sh
- Hardware vendor and model
- drive-health.sh
- Health status of all physical disks
Updates
- flatpak-updates.sh
- Available Flatpak updates
- python-uv-updates.sh
- Outdated packages in a Python project managed by uv
Services and logs
- service-status.sh
- Status of a systemd service
- timer-status.sh
- Status of a systemd timer
- journal-errors.sh
- Error-level journal entries from the last 24 hours
Security
- listening-ports.sh
- Listening external ports and their process owner
- ssh-auth-failures.sh
- Number of failed SSH login attempts in the last 24 hours
- last-logins.sh
- The 5 most recent logins
- sudo-users.sh
- Users with administrative privileges
Domains
- certificate-expiry.sh
- Expiry date of a domain's TLS certificate
- domain-expiry.sh
- Registration expiry date of a domain
- dns-a-record.sh
- Current DNS A record of a domain
- dns-nameservers.sh
- Nameservers currently answering for a domain
More use cases
Ideas not covered by the examples:
- storage
- disk io, temperature
- cpu
- load, top processes
- network
- throughput, public IP, ping
- processes
- count, top offenders
- filesystem
- database size, cache size, backup age
- logs
- Nginx access, app logs, recently updated packages
- stats
- web requests, database queries, dataset rows, billing status
- AI and APIs
- LLM token usage, API quotas and rate limits, spend this month
- security
- CrowdSec, Fail2Ban
- dependencies
- outdated Python packages, Node modules
- containers
- Docker, Podman
- local packages
- Snap, AppImage