49 lines
1.9 KiB
Common Lisp
Executable file
49 lines
1.9 KiB
Common Lisp
Executable file
#!/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 '("uname" "-m") :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* (string-trim '(#\Newline) architecture) upgradable)))
|
|
|
|
;;; vim: set ft=lisp lisp:
|