commit 5aa99bbc9b38f369799f270d968e797e7e70736f Author: Elis Odenhage Date: Sat Sep 28 18:13:30 2024 +0200 init diff --git a/package-updates-exporter b/package-updates-exporter new file mode 100755 index 0000000..358fcf0 Binary files /dev/null and b/package-updates-exporter differ diff --git a/package-updates-exporter.ros b/package-updates-exporter.ros new file mode 100755 index 0000000..9dc4a4a --- /dev/null +++ b/package-updates-exporter.ros @@ -0,0 +1,49 @@ +#!/bin/sh +#|-*- mode:lisp -*-|# +#| +exec ros -Q -- $0 "$@" +|# +(progn ;;init forms + (ros:ensure-asdf) + #+quicklisp(ql:quickload '() :silent t) + ) + +(defpackage :ros.script.package-updates-exporter.3936516038 + (:use :cl)) +(in-package :ros.script.package-updates-exporter.3936516038) + +(defun get-distribution () + (with-open-file (in "/etc/os-release" :direction :input) + (let ((os-names '("debian" "alpine" "arch")) + (found nil)) + (loop for line = (read-line in nil) while line do + (loop for os in os-names + when (search os (string-downcase line)) + do (setf found os))) + found))) + +(defun get-package-manager (distro) + (let ((package-managers '(("debian" . "apt") ("alpine" . "apk") ("arch" . "pacman")))) + (cdr (assoc distro package-managers :test #'string=)))) + +(defvar *distribution* (get-distribution)) +(defvar *package-manager* (get-package-manager *distribution*)) + + +(defun get-upgradable (package-manager) + (let ((package-managers '(("apt" . "list --upgradable | grep \"upgradable\"") + ("apk" . "list --upgradable") + ("pacman" . "-Qu")))) + (let ((command (assoc package-manager package-managers :test #'string=))) + (if command + (count #\Newline (or (uiop:run-program `(,package-manager ,(cdr command)) :output :string :ignore-error-status t) "")) + (error "Unknown package manager: ~A" package-manager))))) + +(defun main (&rest argv) + (let* ((architecture (uiop:run-program "sh" :args '("-c" "uname -m | tr -d '\n'") :output :string)) + (upgradable (get-upgradable *package-manager*))) + (format t "# HELP ~a_upgrades_pending Packages pending updates by origin~%" *package-manager*) + (format t "# TYPE ~a_upgrades_pending gauge~%" *package-manager*) + (format t "~a_package_pending_update{arch=\"~a\"} ~d~%" *package-manager* architecture upgradable))) + +;;; vim: set ft=lisp lisp: