aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.urpmi23
-rw-r--r--locale/de_DE.UTF-8/LC_MESSAGES/remove-old-kernels.mobin0 -> 5837 bytes
-rw-r--r--locale/en_GB.UTF-8/LC_MESSAGES/remove-old-kernels.mobin0 -> 5380 bytes
-rw-r--r--locale/en_US.UTF-8/LC_MESSAGES/remove-old-kernels.mobin0 -> 5380 bytes
-rw-r--r--locale/fr_FR.UTF-8/LC_MESSAGES/remove-old-kernels.mobin0 -> 5806 bytes
-rw-r--r--locale/nl_NL.UTF-8/LC_MESSAGES/remove-old-kernels.mobin0 -> 5783 bytes
-rw-r--r--mk-mo23
-rw-r--r--org.mageia.remove-old-kernels.policy22
-rw-r--r--po/de_DE.UTF-8.po159
-rw-r--r--po/en_GB.UTF-8.po162
-rw-r--r--po/en_US.UTF-8.po159
-rw-r--r--po/fr_FR.UTF-8.po159
-rw-r--r--po/nl_NL.UTF-8.po160
-rw-r--r--remove-old-kernels499
-rw-r--r--remove-old-kernels-pkexec3
-rw-r--r--remove-old-kernels.1187
-rw-r--r--remove-old-kernels.cfg54
-rw-r--r--remove-old-kernels.cron18
-rw-r--r--remove-old-kernels.desktop22
-rw-r--r--remove-old-kernels.svg337
-rw-r--r--remove-old-kernels_N.cfg.template48
21 files changed, 2035 insertions, 0 deletions
diff --git a/README.urpmi b/README.urpmi
new file mode 100644
index 0000000..d2b3b4a
--- /dev/null
+++ b/README.urpmi
@@ -0,0 +1,23 @@
+You have installed or updated remove-old-kernels which will automatically remove obsolete system kernels safely, using urpme.
+
+A large accumulation of these can break systems with limited disk space.
+See: https://bugs.mageia.org/show_bug.cgi?id=24403
+
+By default it will do this weekly and will leave two previous kernels plus the one in use,
+of each flavour installed. e.g. If you have 3 kernel-desktops and 3 kernel-linus installed
+then nothing will be removed. If there are 4 of one flavour then the one installed FIRST will
+be removed, or suggested for removal in interactive mode.
+
+It is intended primarily for regular users and those without the technical knowledge or motivation
+to do this manually.
+
+It also has an advanced mode to suit developers and testers. Please read the -h help or, for full details
+the man page.
+
+If this is NOT what you want, then there are several options:
+
+1. Use the available options to adjust the settings to be more appropriate for your use.
+Such as, turning off the automatic mode, invoking the advanced mode or increasing the number to keep.
+Please read the man page.
+
+2. Uninstall the remove-old-kernels package, but first explore it's capabilities, you may find it useful!
diff --git a/locale/de_DE.UTF-8/LC_MESSAGES/remove-old-kernels.mo b/locale/de_DE.UTF-8/LC_MESSAGES/remove-old-kernels.mo
new file mode 100644
index 0000000..7d7043b
--- /dev/null
+++ b/locale/de_DE.UTF-8/LC_MESSAGES/remove-old-kernels.mo
Binary files differ
diff --git a/locale/en_GB.UTF-8/LC_MESSAGES/remove-old-kernels.mo b/locale/en_GB.UTF-8/LC_MESSAGES/remove-old-kernels.mo
new file mode 100644
index 0000000..fdf738d
--- /dev/null
+++ b/locale/en_GB.UTF-8/LC_MESSAGES/remove-old-kernels.mo
Binary files differ
diff --git a/locale/en_US.UTF-8/LC_MESSAGES/remove-old-kernels.mo b/locale/en_US.UTF-8/LC_MESSAGES/remove-old-kernels.mo
new file mode 100644
index 0000000..9f8b154
--- /dev/null
+++ b/locale/en_US.UTF-8/LC_MESSAGES/remove-old-kernels.mo
Binary files differ
diff --git a/locale/fr_FR.UTF-8/LC_MESSAGES/remove-old-kernels.mo b/locale/fr_FR.UTF-8/LC_MESSAGES/remove-old-kernels.mo
new file mode 100644
index 0000000..71748d8
--- /dev/null
+++ b/locale/fr_FR.UTF-8/LC_MESSAGES/remove-old-kernels.mo
Binary files differ
diff --git a/locale/nl_NL.UTF-8/LC_MESSAGES/remove-old-kernels.mo b/locale/nl_NL.UTF-8/LC_MESSAGES/remove-old-kernels.mo
new file mode 100644
index 0000000..317cc86
--- /dev/null
+++ b/locale/nl_NL.UTF-8/LC_MESSAGES/remove-old-kernels.mo
Binary files differ
diff --git a/mk-mo b/mk-mo
new file mode 100644
index 0000000..70975ee
--- /dev/null
+++ b/mk-mo
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# Recreates ALL .mo binaries from .po text files in po directory
+
+[[ -d locale ]] && rm -r locale
+
+mkdir locale
+
+cd po
+
+for po in *.po; do
+
+echo $po
+
+molang=$(echo $po|rev|cut -d. -f2-|rev)
+
+mkdir -p ../locale/$molang/LC_MESSAGES
+
+msgfmt -vco ../locale/$molang/LC_MESSAGES/remove-old-kernels.mo $po
+
+done
+
+cd ..
diff --git a/org.mageia.remove-old-kernels.policy b/org.mageia.remove-old-kernels.policy
new file mode 100644
index 0000000..b1b7c05
--- /dev/null
+++ b/org.mageia.remove-old-kernels.policy
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+<vendor>Mageia</vendor>
+<vendor_url>http://www.mageia.org/</vendor_url>
+<action id="org.mageia.remove-old-kernels.pkexec.run">
+<description>Run Mageia Old Kernel Remover</description>
+<message>
+Authentication is required to run remove-old-kernels
+</message>
+<icon_name>remove-old-kernels</icon_name>
+<defaults>
+<allow_any>no</allow_any>
+<allow_inactive>no</allow_inactive>
+<allow_active>auth_admin_keep</allow_active>
+</defaults>
+<annotate key="org.freedesktop.policykit.exec.path">/usr/libexec/remove-old-kernels</annotate>
+<annotate key="org.freedesktop.policykit.exec.allow_gui">false</annotate>
+</action>
+</policyconfig>
diff --git a/po/de_DE.UTF-8.po b/po/de_DE.UTF-8.po
new file mode 100644
index 0000000..a074a4f
--- /dev/null
+++ b/po/de_DE.UTF-8.po
@@ -0,0 +1,159 @@
+msgid ""
+msgstr ""
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Project-Id-Version: remove-old-kernels\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Google\n"
+"Language-Team: Google\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de_DE\n"
+"X-Generator: Poedit 2.4.2\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: \n"
+
+msgid "Welcome to 'remove-old-kernels' Interactive"
+msgstr "Willkommen bei 'remove-old-kernels' Interactive"
+
+msgid "Keep"
+msgstr "Behalten"
+
+msgid "Remove"
+msgstr "Entfernen"
+
+msgid "KEEP"
+msgstr "BEHALTEN"
+
+msgid "AUTO"
+msgstr "AUTO"
+
+msgid "Must be root to allow removal"
+msgstr "Muss root sein, um das Entfernen zu ermöglichen"
+
+msgid "Must be root to edit configuration"
+msgstr "Muss root sein, um die Konfiguration zu bearbeiten"
+
+msgid "kernel"
+msgstr "kernel"
+
+msgid "kernels"
+msgstr "Kerne"
+
+msgid "y/N/i (i=confirm for each)"
+msgstr "y/N/i (y=ja N=nein i=jeweils bestätigen)"
+
+msgid "y/N/q (q=quit)"
+msgstr "y/N/q (y=ja N=nein q=verlassen)"
+
+msgid "interactive"
+msgstr "interaktiv"
+
+msgid "abort"
+msgstr "abbrechen"
+
+msgid "quit"
+msgstr "verlassen"
+
+msgid "Kernels in"
+msgstr "Kerne rein"
+
+msgid "Gain"
+msgstr "Gewinnen"
+
+msgid "Tap spacebar to exit"
+msgstr "Tippen Sie zum Beenden auf die Leertaste"
+
+msgid "Tap spacebar"
+msgstr "Tippen Sie auf die Leertaste"
+
+msgid "In use now"
+msgstr "Jetzt im Einsatz"
+
+msgid "Test mode is on - kernels will not be removed"
+msgstr "Der Testmodus ist aktiviert – Kernel werden nicht entfernt"
+
+msgid "DEBUG: Could execute: urpme"
+msgstr "DEBUG: Könnte ausführen: urpme"
+
+msgid "Command that would be used"
+msgstr "Befehl, der verwendet werden würde"
+
+msgid "Commands that would be used"
+msgstr "Befehle, die verwendet werden würden"
+
+msgid "Your alternative configuration file does not exist:"
+msgstr "Ihre alternative Konfigurationsdatei existiert nicht:"
+
+msgid "Either replace it or set ALTCFG=0 in"
+msgstr "Entweder ersetzen oder ALTCFG=0 setzen"
+
+msgid "FATAL: Failed to read:"
+msgstr "FATAL: Lesen fehlgeschlagen:"
+
+msgid "No such alternative configuration file:"
+msgstr "Keine solche alternative Konfigurationsdatei:"
+
+msgid "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+msgstr "Verwendung: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n Anzahl] [-N Anzahl] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+
+msgid " -a = automatic, no questions. Interactive if not specified. (must be root)"
+msgstr " -a = Automatisch, keine Frage. Interaktiv, falls nicht angegeben. (muss root sein)"
+
+msgid " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+msgstr " -A Wert = y oder n, um die automatische wöchentliche Entfernung von Kerneln ein- oder auszuschalten. (zB -Ay)"
+
+msgid " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+msgstr " -c = wie automatisch, prüft aber auch auf CRON=y in der cfg-Datei oder beendet sich. (muss root sein)"
+
+msgid " -t = Test mode, nothing is removed, urpme is simulated."
+msgstr " -t = Testmodus, es wird nichts entfernt, urpme wird simuliert."
+
+msgid " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+msgstr " -f Wert = Nummer der alternativen .cfg-Datei, die nur dieses Mal verwendet werden soll. Ausgänge falls fehlend."
+
+msgid " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+msgstr " -F Wert = Nummer der zu verwendenden alt .cfg-Datei. Dadurch wird die Einstellung ALTCFG= in der .cfg-Hauptdatei geändert."
+
+msgid " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+msgstr " -n Wert = Anzahl der Kernel, die nur diese Zeit behalten werden sollen. (-n5 oder -n 5 behält 5 Kernel), Min=2, Standard=3"
+
+msgid " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+msgstr " -N Wert = Anzahl der zu behaltenden Kerne. Dies ändert die Einstellung der Konfigurationsdatei. (zB -N 5)"
+
+msgid " -p = preview the urpme commands which would be used."
+msgstr " -p = Vorschau der urpme-Befehle, die verwendet werden würden."
+
+msgid " -q = advanced mode, this time only - see man page."
+msgstr " -q = Erweiterter Modus, diesmal nur - siehe Manpage."
+
+msgid " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+msgstr " -Q Wert = 1 oder 0 (1 = EIN) erweiterter Modus, dauerhaft. (zB -Q 1)"
+
+msgid " -l = list the last 1000 lines of the log."
+msgstr " -l = listet die letzten 1000 Zeilen des Protokolls auf."
+
+msgid " -m = mono. No colours in screen output."
+msgstr " -m = Mono. Keine Farben in der Bildschirmausgabe."
+
+msgid " -v = version."
+msgstr " -v = Ausführung."
+
+msgid " -? or -h = show this help."
+msgstr " -? or -h = Zeigen Sie diese Hilfe."
+
+msgid "KEY for column 3:"
+msgstr "SCHLÜSSEL für Spalte 3:"
+
+msgid " U = curently (U)sed running kernel."
+msgstr " U = aktuell (U)sed laufender Kernel."
+
+msgid " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+msgstr " V = Aufbewahrung für (V)irtualbox -neueste. (nur im erweiterten Modus)"
+
+msgid " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+msgstr " X = Aufbewahrung für (X)tables-addons -latest. (nur im erweiterten Modus)"
+
+msgid " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
+msgstr " K = keeping kernel-*-devel for installed (K)ernel. (nur im erweiterten Modus)"
diff --git a/po/en_GB.UTF-8.po b/po/en_GB.UTF-8.po
new file mode 100644
index 0000000..78b6df1
--- /dev/null
+++ b/po/en_GB.UTF-8.po
@@ -0,0 +1,162 @@
+msgid ""
+msgstr ""
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Project-Id-Version: remove-old-kernels\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"X-Generator: Poedit 2.4.2\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: \n"
+
+msgid "Welcome to 'remove-old-kernels' Interactive"
+msgstr "Welcome to 'rok' Interactive"
+
+msgid "Keep"
+msgstr "Keep"
+
+msgid "Remove"
+msgstr "Remove"
+
+msgid "KEEP"
+msgstr "KEEP"
+
+msgid "AUTO"
+msgstr "AUTO"
+
+msgid "Must be root to allow removal"
+msgstr "Must be root to allow removal"
+
+msgid "Must be root to edit configuration"
+msgstr "Must be root to edit configuration"
+
+msgid "kernel"
+msgstr "kernel"
+
+msgid "kernels"
+msgstr "kernels"
+
+# For languages where y/N/i is not appropriate DO NOT change "y/N/i"
+# but add (y=yes N=no i=confirm) with only 'yes' and 'no' translated.
+# See fr_FR.po as example
+msgid "y/N/i (i=confirm for each)"
+msgstr "y/N/i (i=confirm for each)"
+
+msgid "y/N/q (q=quit)"
+msgstr "y/N/q (q=quit)"
+
+msgid "interactive"
+msgstr "interactive"
+
+msgid "abort"
+msgstr "abort"
+
+msgid "quit"
+msgstr "quit"
+
+msgid "Kernels in"
+msgstr "Kernels in"
+
+msgid "Gain"
+msgstr "Gain"
+
+msgid "Tap spacebar to exit"
+msgstr "Tap spacebar to exit"
+
+msgid "Tap spacebar"
+msgstr "Tap spacebar"
+
+msgid "In use now"
+msgstr "In use now"
+
+msgid "Test mode is on - kernels will not be removed"
+msgstr "Test mode is on - kernels will not be removed"
+
+msgid "DEBUG: Could execute: urpme"
+msgstr "DEBUG: Could execute: urpme"
+
+msgid "Command that would be used"
+msgstr "Command that would be used"
+
+msgid "Commands that would be used"
+msgstr "Commands that would be used"
+
+msgid "Your alternative configuration file does not exist:"
+msgstr "Your alternative configuration file does not exist:"
+
+msgid "Either replace it or set ALTCFG=0 in"
+msgstr "Either replace it or set ALTCFG=0 in"
+
+msgid "FATAL: Failed to read:"
+msgstr "FATAL: Failed to read:"
+
+msgid "No such alternative configuration file:"
+msgstr "No such alternative configuration file:"
+
+msgid "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+msgstr "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+
+msgid " -a = automatic, no questions. Interactive if not specified. (must be root)"
+msgstr " -a = automatic, no questions. Interactive if not specified. (must be root)"
+
+msgid " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+msgstr " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+
+msgid " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+msgstr " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+
+msgid " -t = Test mode, nothing is removed, urpme is simulated."
+msgstr " -t = Test mode, nothing is removed, urpme is simulated."
+
+msgid " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+msgstr " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+
+msgid " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+msgstr " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+
+msgid " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+msgstr " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+
+msgid " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+msgstr " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+
+msgid " -p = preview the urpme commands which would be used."
+msgstr " -p = preview the urpme commands which would be used."
+
+msgid " -q = advanced mode, this time only - see man page."
+msgstr " -q = advanced mode, this time only - see man page."
+
+msgid " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+msgstr " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+
+msgid " -l = list the last 1000 lines of the log."
+msgstr " -l = list the last 1000 lines of the log."
+
+msgid " -m = mono. No colours in screen output."
+msgstr " -m = mono. No colours in screen output."
+
+msgid " -v = version."
+msgstr " -v = version."
+
+msgid " -? or -h = show this help."
+msgstr " -? or -h = show this help."
+
+msgid "KEY for column 3:"
+msgstr "KEY for column 3:"
+
+msgid " U = curently (U)sed running kernel."
+msgstr " U = curently (U)sed running kernel."
+
+msgid " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+msgstr " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+
+msgid " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+msgstr " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+
+msgid " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
+msgstr " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
diff --git a/po/en_US.UTF-8.po b/po/en_US.UTF-8.po
new file mode 100644
index 0000000..ec22512
--- /dev/null
+++ b/po/en_US.UTF-8.po
@@ -0,0 +1,159 @@
+msgid ""
+msgstr ""
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Project-Id-Version: remove-old-kernels\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_US\n"
+"X-Generator: Poedit 2.4.2\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: \n"
+
+msgid "Welcome to 'remove-old-kernels' Interactive"
+msgstr "Welcome to 'rok' Interactive"
+
+msgid "Keep"
+msgstr "Keep"
+
+msgid "Remove"
+msgstr "Remove"
+
+msgid "KEEP"
+msgstr "KEEP"
+
+msgid "AUTO"
+msgstr "AUTO"
+
+msgid "Must be root to allow removal"
+msgstr "Must be root to allow removal"
+
+msgid "Must be root to edit configuration"
+msgstr "Must be root to edit configuration"
+
+msgid "kernel"
+msgstr "kernel"
+
+msgid "kernels"
+msgstr "kernels"
+
+msgid "y/N/i (i=confirm for each)"
+msgstr "y/N/i (i=confirm for each)"
+
+msgid "y/N/q (q=quit)"
+msgstr "y/N/q (q=quit)"
+
+msgid "interactive"
+msgstr "interactive"
+
+msgid "abort"
+msgstr "abort"
+
+msgid "quit"
+msgstr "quit"
+
+msgid "Kernels in"
+msgstr "Kernels in"
+
+msgid "Gain"
+msgstr "Gain"
+
+msgid "Tap spacebar to exit"
+msgstr "Tap spacebar to exit"
+
+msgid "Tap spacebar"
+msgstr "Tap spacebar"
+
+msgid "In use now"
+msgstr "In use now"
+
+msgid "Test mode is on - kernels will not be removed"
+msgstr "Test mode is on - kernels will not be removed"
+
+msgid "DEBUG: Could execute: urpme"
+msgstr "DEBUG: Could execute: urpme"
+
+msgid "Command that would be used"
+msgstr "Command that would be used"
+
+msgid "Commands that would be used"
+msgstr "Commands that would be used"
+
+msgid "Your alternative configuration file does not exist:"
+msgstr "Your alternative configuration file does not exist:"
+
+msgid "Either replace it or set ALTCFG=0 in"
+msgstr "Either replace it or set ALTCFG=0 in"
+
+msgid "FATAL: Failed to read:"
+msgstr "FATAL: Failed to read:"
+
+msgid "No such alternative configuration file:"
+msgstr "No such alternative configuration file:"
+
+msgid "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+msgstr "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+
+msgid " -a = automatic, no questions. Interactive if not specified. (must be root)"
+msgstr " -a = automatic, no questions. Interactive if not specified. (must be root)"
+
+msgid " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+msgstr " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+
+msgid " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+msgstr " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+
+msgid " -t = Test mode, nothing is removed, urpme is simulated."
+msgstr " -t = Test mode, nothing is removed, urpme is simulated."
+
+msgid " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+msgstr " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+
+msgid " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+msgstr " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+
+msgid " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+msgstr " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+
+msgid " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+msgstr " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+
+msgid " -p = preview the urpme commands which would be used."
+msgstr " -p = preview the urpme commands which would be used."
+
+msgid " -q = advanced mode, this time only - see man page."
+msgstr " -q = advanced mode, this time only - see man page."
+
+msgid " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+msgstr " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+
+msgid " -l = list the last 1000 lines of the log."
+msgstr " -l = list the last 1000 lines of the log."
+
+msgid " -m = mono. No colours in screen output."
+msgstr " -m = mono. No colours in screen output."
+
+msgid " -v = version."
+msgstr " -v = version."
+
+msgid " -? or -h = show this help."
+msgstr " -? or -h = show this help."
+
+msgid "KEY for column 3:"
+msgstr "KEY for column 3:"
+
+msgid " U = curently (U)sed running kernel."
+msgstr " U = curently (U)sed running kernel."
+
+msgid " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+msgstr " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+
+msgid " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+msgstr " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+
+msgid " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
+msgstr " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
diff --git a/po/fr_FR.UTF-8.po b/po/fr_FR.UTF-8.po
new file mode 100644
index 0000000..4b71d28
--- /dev/null
+++ b/po/fr_FR.UTF-8.po
@@ -0,0 +1,159 @@
+msgid ""
+msgstr ""
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Project-Id-Version: remove-old-kernels\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Google\n"
+"Language-Team: Google\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr_FR\n"
+"X-Generator: Poedit 2.4.2\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: \n"
+
+msgid "Welcome to 'remove-old-kernels' Interactive"
+msgstr "Bienvenue sur 'remove-old-kernels' Interactive"
+
+msgid "Keep"
+msgstr "Garder"
+
+msgid "KEEP"
+msgstr "GARDER"
+
+msgid "Remove"
+msgstr "Enlever"
+
+msgid "AUTO"
+msgstr "AUTO"
+
+msgid "Must be root to allow removal"
+msgstr "Doit être root pour permettre enlever"
+
+msgid "Must be root to edit configuration"
+msgstr "Doit être root pour modifier la configuration"
+
+msgid "kernel"
+msgstr "noyau"
+
+msgid "kernels"
+msgstr "noyaux"
+
+msgid "y/N/i (i=confirm for each)"
+msgstr "y/N/i (y=oui N=non i=confirmer pour chaque)"
+
+msgid "y/N/q (q=quit)"
+msgstr "y/N/q (y=oui N=non q=quitter)"
+
+msgid "interactive"
+msgstr "interactif"
+
+msgid "abort"
+msgstr "abandonner"
+
+msgid "quit"
+msgstr "quitter"
+
+msgid "Kernels in"
+msgstr "Noyaux dans"
+
+msgid "Gain"
+msgstr "Gain"
+
+msgid "Tap spacebar to exit"
+msgstr "Appuyez sur la barre d'espace pour quitter"
+
+msgid "Tap spacebar"
+msgstr "Appuyez sur la barre d'espace"
+
+msgid "In use now"
+msgstr "En usage maintenant"
+
+msgid "Test mode is on - kernels will not be removed"
+msgstr "Le mode test est activé - les noyaux ne seront pas supprimés"
+
+msgid "DEBUG: Could execute: urpme"
+msgstr "DEBUG : Peut s'exécuter : urpme"
+
+msgid "Command that would be used"
+msgstr "Commande qui serait utilisée"
+
+msgid "Commands that would be used"
+msgstr "Commandes qui seraient utilisées"
+
+msgid "Your alternative configuration file does not exist:"
+msgstr "Votre fichier de configuration alternatif n'existe pas :"
+
+msgid "Either replace it or set ALTCFG=0 in"
+msgstr "Remplacez-le ou définissez ALTCFG=0 dans"
+
+msgid "FATAL: Failed to read:"
+msgstr "FATAL : Échec de la lecture :"
+
+msgid "No such alternative configuration file:"
+msgstr "Aucun fichier de configuration alternatif de ce type :"
+
+msgid "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+msgstr "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n numéro] [-N numéro] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+
+msgid " -a = automatic, no questions. Interactive if not specified. (must be root)"
+msgstr " -a = automatique, pas de questions. Interactif si non spécifié. (doit être root)"
+
+msgid " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+msgstr " -A valeur = y ou n pour activer ou désactiver la suppression automatique des noyaux. (e.g. -Ay)"
+
+msgid " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+msgstr " -c = comme automatique mais vérifie également CRON=y dans le fichier cfg ou quitte. (doit être root)"
+
+msgid " -t = Test mode, nothing is removed, urpme is simulated."
+msgstr " -t = Mode test, rien n'est supprimé, urpme est simulé."
+
+msgid " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+msgstr " -f valeur = numéro du fichier .cfg alternatif à utiliser cette fois uniquement. Quitte si manquant."
+
+msgid " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+msgstr " -F valeur = numéro du fichier alt .cfg à utiliser. Cela modifie le paramètre ALTCFG= dans le fichier .cfg principal."
+
+msgid " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+msgstr " -n valeur = nombre de noyaux à conserver cette fois seulement. (-n5 ou -n 5 conserve 5 noyaux), Min=2, Default=3"
+
+msgid " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+msgstr " -N valeur = nombre de noyaux à conserver. Cela modifie le paramètre du fichier de configuration. (e.g. -N 5)"
+
+msgid " -p = preview the urpme commands which would be used."
+msgstr " -p = prévisualisez les commandes urpme qui seraient utilisées."
+
+msgid " -q = advanced mode, this time only - see man page."
+msgstr " -q = mode avancé, cette fois uniquement - voir la page de manuel."
+
+msgid " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+msgstr " -Q valeur = 1 ou 0 (1 = ON) mode avancé, persistant. (e.g. -Q 1)"
+
+msgid " -l = list the last 1000 lines of the log."
+msgstr " -l = liste les 1000 dernières lignes du journal."
+
+msgid " -m = mono. No colours in screen output."
+msgstr " -m = mono. Pas de couleurs dans la sortie d'écran."
+
+msgid " -v = version."
+msgstr " -v = version."
+
+msgid " -? or -h = show this help."
+msgstr " -? or -h = montrer cette aide."
+
+msgid "KEY for column 3:"
+msgstr "LÉGENDE pour la colonne 3 :"
+
+msgid " U = curently (U)sed running kernel."
+msgstr " U = noyau en cours d'exécution actuellement."
+
+msgid " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+msgstr " V = à conserver pour (V)irtualbox -latest. (uniquement en mode avancé)"
+
+msgid " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+msgstr " X = à conserver pour (X)tables-addons -latest. (uniquement en mode avancé)"
+
+msgid " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
+msgstr " K = conserver kernel-*-devel pour le noyau installé. (uniquement en mode avancé)"
diff --git a/po/nl_NL.UTF-8.po b/po/nl_NL.UTF-8.po
new file mode 100644
index 0000000..3b7c297
--- /dev/null
+++ b/po/nl_NL.UTF-8.po
@@ -0,0 +1,160 @@
+msgid ""
+msgstr ""
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Project-Id-Version: remove-old-kernels\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Google\n"
+"Language-Team: Google\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl_NL\n"
+"X-Generator: Poedit 2.4.2\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: \n"
+
+msgid "Welcome to 'remove-old-kernels' Interactive"
+msgstr "Welkom bij 'oude kernels verwijderen' Interactive"
+
+msgid "Keep"
+msgstr "Houden"
+
+msgid "Remove"
+msgstr "Verwijderen"
+
+msgid "KEEP"
+msgstr "HOUDEN"
+
+msgid "AUTO"
+msgstr "AUTO"
+
+msgid "Must be root to allow removal"
+msgstr "Moet root zijn om verwijdering mogelijk te maken"
+
+msgid "Must be root to edit configuration"
+msgstr "Moet root zijn om de configuratie te bewerken"
+
+msgid "kernel"
+msgstr "kernel"
+
+msgid "kernels"
+msgstr "kernels"
+
+msgid "y/N/i (i=confirm for each)"
+msgstr "y/N/i (y=ja N=nee i=bevestig voor elk)"
+
+msgid "y/N/q (q=quit)"
+msgstr "y/N/q (y=ja N=nee q=vertrekken)"
+
+msgid "interactive"
+msgstr "interactief"
+
+msgid "abort"
+msgstr "abort"
+
+msgid "quit"
+msgstr "vertrekken"
+
+msgid "Kernels in"
+msgstr "Kernels in"
+
+msgid "Gain"
+msgstr "Winnen"
+
+msgid "Tap spacebar to exit"
+msgstr "Tik op de spatiebalk om af te sluiten"
+
+msgid "Tap spacebar"
+msgstr "Tik op de spatiebalk"
+
+msgid "In use now"
+msgstr "Nu in gebruik"
+
+msgid "Test mode is on - kernels will not be removed"
+msgstr "Testmodus is ingeschakeld - kernels worden niet verwijderd"
+
+msgid "DEBUG: Could execute: urpme"
+msgstr "DEBUG: Kan uitvoeren: urpme"
+
+msgid "Command that would be used"
+msgstr "Commando dat zou worden gebruikt"
+
+msgid "Commands that would be used"
+msgstr "Commando's die zouden worden gebruikt"
+
+msgid "Your alternative configuration file does not exist:"
+msgstr "Uw alternatieve configuratiebestand bestaat niet:"
+
+msgid "Either replace it or set ALTCFG=0 in"
+msgstr "Vervang het of stel ALTCFG=0 in"
+
+msgid "FATAL: Failed to read:"
+msgstr "FATAL: Kan niet lezen:"
+
+msgid "No such alternative configuration file:"
+msgstr "Geen dergelijk alternatief configuratiebestand:"
+
+msgid "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+msgstr "Gebruik: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n nummer] [-N nummer] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]"
+
+msgid " -a = automatic, no questions. Interactive if not specified. (must be root)"
+msgstr " -a = automatisch, geen vragen. Interactief indien niet gespecificeerd. (moet root zijn)"
+
+msgid " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)"
+msgstr " -A waarde = y of n om automatische wekelijkse verwijdering van kernels AAN of UIT te zetten. (bijv. -Ay)"
+
+msgid " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)"
+msgstr " -c = als automatisch maar controleert ook op CRON=y in het cfg-bestand of sluit af. (moet root zijn)"
+
+msgid " -t = Test mode, nothing is removed, urpme is simulated."
+msgstr " -t = Testmodus, niets wordt verwijderd, urpme wordt gesimuleerd."
+
+msgid " -f value = number of the alternate .cfg file to use this time only. Exits if missing."
+msgstr " -f waarde = nummer van het alternatieve .cfg-bestand dat alleen deze keer moet worden gebruikt. Uitgangen indien vermist."
+
+msgid " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file."
+msgstr " -F waarde = aantal te gebruiken alt .cfg-bestanden. Dit verandert de ALTCFG=-instelling in het .cfg-hoofdbestand."
+
+msgid " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3"
+msgstr " -n waarde = aantal kernels om alleen deze tijd te behouden. (-n5 of -n 5 behouden 5 kernels), Min=2, Standaard=3"
+
+msgid " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)"
+msgstr " -N waarde = aantal te behouden kernels. Dit verandert de instelling van het configuratiebestand. (bijv. -N 5)"
+
+msgid " -p = preview the urpme commands which would be used."
+msgstr " -p = bekijk een voorbeeld van de urpme-commando's die zouden worden gebruikt."
+
+msgid " -q = advanced mode, this time only - see man page."
+msgstr " -q = geavanceerde modus, alleen deze keer - zie man-pagina."
+
+msgid " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)"
+msgstr " -Q waarde = 1 of 0 (1 = AAN) geavanceerde modus, permanent. (bijv. -Q 1)"
+
+msgid " -l = list the last 1000 lines of the log."
+msgstr " -l = maak een lijst van de laatste 1000 regels van het logboek."
+
+msgid " -m = mono. No colours in screen output."
+msgstr " -m = mono. Geen kleuren in schermuitvoer."
+
+msgid " -v = version."
+msgstr " -v = versie."
+
+msgid " -? or -h = show this help."
+msgstr " -? or -h = laat deze hulp zien."
+
+msgid "KEY for column 3:"
+msgstr "SLEUTEL voor kolom 3:"
+
+msgid " U = curently (U)sed running kernel."
+msgstr " U = momenteel gebruikte lopende kernel."
+
+msgid " V = keeping for (V)irtualbox -latest. (only in advanced mode)"
+msgstr " V = bewaren voor Virtualbox -latest. (alleen in geavanceerde modus)"
+
+msgid " X = keeping for (X)tables-addons -latest. (only in advanced mode)"
+msgstr " X = behouden voor Xtables-add-ons -nieuwste. (alleen in geavanceerde modus)"
+
+msgid " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
+msgstr " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)"
+
diff --git a/remove-old-kernels b/remove-old-kernels
new file mode 100644
index 0000000..2f7eb0a
--- /dev/null
+++ b/remove-old-kernels
@@ -0,0 +1,499 @@
+#!/usr/bin/bash
+#
+# Remove old kernels safely and cleanly using urpme.
+#
+# LISTK contains the list of kernels to analyse
+# The script keeps NBK most recent kernels
+# (c) Pierre Jarillon - 2018-04-03 - 2021-11-27
+# (c) Jean-Baptiste Biernacki 2021
+# (c) Barry C Jackson 2022-2023
+####################################
+#
+# Do not edit the values below unless you know 'exactly' what you are doing.
+# You can pass parameters on the command line to acheive the same functionality.
+NBK=3 # Default number of kernels to keep.
+DEBUG=0 # 1 for test mode, urpme is simulated and not applied
+MODE="I" # mode A)utomatic, I)nteractve (DO NOT CHANGE THIS)
+VISU=0 # If VISU=1, show commands which can be used
+LANG=$(echo $LANGUAGE|cut -d: -f1)
+
+# Colours for display Defaults Used for
+Normal="\e[0m" # System default f/g colour
+KeepCol="\e[92m" # Light Green Keep text
+RemvCol="\e[91m" # Light Red Remove text
+InfoCol="\e[33m" # Orange Information text
+HdBgCol="\e[102;30m" # Light Green Background Heading background
+WarnBgCol="\e[101m" # Light Red Background Warnings in heading
+ClearLine="\r\e[2K" # Clear the line
+
+# List of kernel types to include.
+# This list is only used if LISTK is omitted from the .cfg file in use.
+LISTK=\
+"kernel-desktop586
+kernel-desktop
+kernel-desktop-devel
+kernel-server
+kernel-server-devel
+kernel-source
+kernel-tmb-desktop
+kernel-tmb-desktop-devel
+kernel-tmb-source
+kernel-linus
+kernel-linus-devel
+kernel-linus-source
+"
+prog="remove-old-kernels"
+cfgpath="/etc/"
+maincfg="${cfgpath}${prog}.cfg"
+currcfg=${maincfg}
+
+# Perform translations
+i18n() {
+gettext $prog "$1"
+}
+
+# Display -help
+usage() {
+echo "$(i18n "Usage: <remove-old kernels|rok> [-a] [-A <y/n>] [-c] [-t] [-f 0-9] [-F 0-9] [-n number] [-N number] [-p] [-q] [-Q 0|1][-l] [-m] [-v] [-h|-?]")"
+echo "$(i18n " -a = automatic, no questions. Interactive if not specified. (must be root)")"
+echo "$(i18n " -A value = y or n to turn ON or OFF automatic weekly removal of kernels. (e.g. -Ay)")"
+echo "$(i18n " -c = as automatic but also checks for CRON=y in the cfg file or exits. (must be root)")"
+echo "$(i18n " -t = Test mode, nothing is removed, urpme is simulated.")"
+echo "$(i18n " -f value = number of the alternate .cfg file to use this time only. Exits if missing.")"
+echo "$(i18n " -F value = number of alt .cfg file to use. This changes the ALTCFG= setting in the main .cfg file.")"
+echo "$(i18n " -n value = number of kernels to keep this time only. (-n5 or -n 5 keep 5 kernels), Min=2, Default=3")"
+echo "$(i18n " -N value = number of kernels to keep. This changes the config file setting. (e.g. -N 5)")"
+echo "$(i18n " -p = preview the urpme commands which would be used.")"
+echo "$(i18n " -q = advanced mode, this time only - see man page.")"
+echo "$(i18n " -Q value = 1 or 0 (1 = ON) advanced mode, persistent. (e.g. -Q 1)")"
+echo "$(i18n " -l = list the last 1000 lines of the log.")"
+echo "$(i18n " -m = mono. No colours in screen output.")"
+echo "$(i18n " -v = version.")"
+echo "$(i18n " -? or -h = show this help.")"
+echo ""
+echo "$(i18n "KEY for column 3:")"
+echo "$(i18n " U = curently (U)sed running kernel.")"
+echo "$(i18n " V = keeping for (V)irtualbox -latest. (only in advanced mode)")"
+echo "$(i18n " X = keeping for (X)tables-addons -latest. (only in advanced mode)")"
+echo "$(i18n " K = keeping kernel-*-devel for installed (K)ernel. (only advanced mode)")"
+echo ""
+}
+
+# Source main .cfg file if it exists, or issue warning and abort.
+source ${maincfg} || { echo -e "${RemvCol}$(i18n "FATAL: Failed to read:")${Normal} ${maincfg}"; exit 1; }
+
+# If an alt .cfg is set in main .cfg
+if cat ${maincfg}|grep -q "ALTCFG=" && [[ $ALTCFG -gt 0 ]]; then
+ # Check it really exists
+ if [[ -f /etc/remove-old-kernels_$ALTCFG.cfg ]]; then
+ # Set current cfg to it
+ currcfg="${cfgpath}${prog}_${ALTCFG}.cfg"
+ source $currcfg
+ else
+ echo -e "${RemvCol}$(i18n "Your alternative configuration file does not exist:")${Normal}\
+ /etc/remove-old-kernels_$ALTCFG.cfg\n$(i18n "Either replace it or set ALTCFG=0 in") /etc/remove-old-kernels.cfg"
+ exit 1
+ fi
+fi
+
+# Check for CRON variable in config or add default. (Some users may have early version without this feature)
+if ! grep -q -e "CRON=" ${maincfg}; then
+ echo -e "\n# # Allow cron to run 'remove-old-kernels' weekly. Replace 'y' with 'n' (lower case) to disable it.\nCRON=y" >> ${maincfg}
+fi
+
+# Check dnf limit before option parsing
+dnfNBK=0; dnfmsg=false
+[[ -f /etc/dnf/dnf.conf ]] && dnfNBK=$(cat /etc/dnf/dnf.conf|grep "installonly_limit="|cut -d= -f2)
+
+# Check running as root
+chkroot() {
+if (((UID))); then
+ echo -e "${RemvCol}$(i18n "Must be root to edit configuration")${Normal}\nHit spacebar"
+ read -n1; echo -en "${ClearLine}"
+ exit 0
+fi
+}
+
+# Function to handle -f or -F options
+altcfg() {
+cfgno=$1
+# Called with f
+if [[ ed -ne 1 ]]; then
+ # Check for cfg 0
+ if [[ $cfgno -eq 0 ]]; then
+ source ${maincfg}
+ ALTCFG=${cfgno}
+ else
+ # If alt cfg file exists source it
+ if [[ -f /etc/remove-old-kernels_${cfgno}.cfg ]]; then
+ source /etc/remove-old-kernels_${cfgno}.cfg
+ ALTCFG=${cfgno}
+ else
+ echo -e "${RemvCol}$(i18n "No such alternative configuration file:")${Normal} /etc/remove-old-kernels_${cfgno}.cfg"
+ exit 1
+ fi
+ fi
+else
+ # Called with F
+ # If ALTCFG var is missing from the main .cfg file, add it
+ if ! cat ${maincfg} |grep -q "ALTCFG="; then
+ echo "ALTCFG=" >> ${maincfg}
+ fi
+ # Switch back to .cfg 0
+ if [[ $cfgno -eq 0 ]]; then
+ /usr/bin/sed -i "s/ALTCFG=.*/ALTCFG=${cfgno}/" ${maincfg}
+ source ${maincfg}; currcfg=${maincfg}
+ else
+ # If alt cfg file exists
+ if [[ -f /etc/remove-old-kernels_${cfgno}.cfg ]]; then
+ # Add it in main .cfg
+ /usr/bin/sed -i "s/ALTCFG=.*/ALTCFG=${cfgno}/" ${maincfg}
+ ALTCFG=${cfgno};
+ currcfg="${cfgpath}${prog}_${ALTCFG}.cfg"
+ source $currcfg
+ else
+ echo -e "${RemvCol}$(i18n "No such alternative configuration file:")${Normal} /etc/remove-old-kernels_${cfgno}.cfg"
+ exit 1
+ fi
+ fi
+fi
+}
+
+# Parse arguments from command line which take precedence over script and cfg file
+if [[ ${#} -gt 0 ]] ; then
+ while getopts aA:ctf:F:plmvn:N:qQ:?h NAME; do
+ case ${NAME} in
+ a) MODE="A"
+ ;;
+ A) chkroot
+ echo ${currcfg}
+ CRONN=${OPTARG} && [[ ${#CRONN} = 1 ]] && [[ "yn" =~ "$CRONN" ]] && \
+ /usr/bin/sed -i "s/CRON=.*/CRON=${CRONN}/" ${currcfg} && CRON=$CRONN
+ ;;
+ c) MODE="A" && [[ ${#CRON} -gt 0 ]] && [[ "$CRON" == "y" ]] || exit 0
+ ;;
+ t) DEBUG=1
+ ;;
+ f) [[ ${OPTARG} =~ ^[0-9] ]] && altcfg ${OPTARG}
+ ;;
+ F) chkroot
+ [[ ${OPTARG} =~ ^[0-9] ]] && ed=1 && altcfg ${OPTARG}
+ ;;
+ p) VISU=1
+ ;;
+ q) QA=1
+ ;;
+ Q) chkroot
+ [[ ${OPTARG} =~ ^[0-1] ]] && QAN="${OPTARG}"
+ if cat ${currcfg}|grep -q "QA="; then
+ /usr/bin/sed -i "s/QA=.*/QA=${QAN}/" ${currcfg} && QA=${QAN}
+ else
+ echo "QA=${QAN}" >> ${currcfg} && QA=${QAN}
+ fi
+ ;;
+ n) [[ ${OPTARG} =~ ^[0-9]+$ ]] && NBK=${OPTARG}
+ ;;
+ N) chkroot
+ NBKN=${OPTARG}
+ if [[ $NBKN =~ ^[0-9]+$ ]] && [[ $NBKN -ge $dnfNBK ]]; then
+ /usr/bin/sed -i "s/NBK=.*/NBK=$NBKN/" ${currcfg} && NBK=$NBKN
+ else
+ dnfmsg=true
+ fi
+ ;;
+ l) tail -n1000 /var/log/remove-old-kernels.log && { echo -e "\n$(i18n "Tap spacebar")\n"; read -n1; echo -en "${ClearLine}"; }
+ ;;
+ m) Normal="";RemvCol="";KeepCol="";InfoCol="";HdBgCol="";WarnBgCol="";Clearline=""
+ ;;
+ v) printf "$(rpm -q remove-old-kernels)\n"
+ exit 2
+ ;;
+ ?|h) clear; usage
+ exit 2
+ ;;
+ esac
+ done
+ # Don't allow NBK < 2
+ if (( NBK < 2 )); then
+ NBK=2
+ fi
+fi
+
+# Only use greeting in interactive mode
+if [[ $MODE == "I" ]]; then
+clear
+echo -e " $(i18n "Welcome to 'remove-old-kernels' Interactive")\n"
+
+fi
+
+# Use dnf kernel 'number to keep' if installed
+if [[ $dnfNBK -gt $NBK ]] || $dnfmsg; then
+ NBK=$dnfNBK
+ dnfmssg="${InfoCol}INFO: Number to keep is restricted to $dnfNBK, by the dnf 'installonly_limit' set in /etc/dnf/dnf.conf${Normal}"
+fi
+
+# Get info for status message
+if [[ "$CRON" == "y" ]]; then autostat="ON"; else autostat="${Normal}${WarnBgCol}OFF${HdBgCol}"; fi
+if [[ "$QA" == "1" ]]; then qamssg="| Q:ON "; fi
+if [[ $ALTCFG -gt 0 ]]; then cfgmssg="|${Normal}${WarnBgCol}F:${ALTCFG}${HdBgCol} "; fi
+
+# Check that the running kernel is still installed: https://bugs.mageia.org/show_bug.cgi?id=31015
+[[ -e /lib/modules/$(uname -r) ]] || { echo -e "${RemvCol}FATAL: Has the running kernel been uninstalled since last boot? - Aborting."; exit 1; }
+
+# Get the full name of the current running kernel
+CURK=$(rpm -qf /lib/modules/$(uname -r))
+
+# Storage for the list of kernels to remove
+TMPKTR=$(mktemp)
+
+# Check storage usage on root partition
+OCCDISK1=$(df -B 1M -l --output=used / | tail -n1 | awk '{ print $1 }')
+
+# Pad translated strings for column 2
+ keepstr=$(i18n "Keep"); remstr=$(i18n "Remove")
+ if [[ ${#keepstr} != ${#remstr} ]]; then
+ if [[ ${#keepstr} > ${#remstr} ]]; then
+ while (( ${#remstr} < ${#keepstr} )); do remstr="${remstr} "; done
+ else
+ while (( ${#remstr} > ${#keepstr} )); do keepstr="${keepstr} "; done
+ fi
+ fi
+
+#========================= Analyse /boot/ =============================
+
+NK=$(ls /boot/vmlinuz*.mga* | wc -l)
+
+# In automatic mode exit immediately if kernels in boot <= number allowed to be removed
+ [[ $MODE = "A" ]] && [[ ${NK} -le ${NBK} ]] && exit 0
+
+#================================ Show status ==============================
+
+echo -e "${HdBgCol} System: $(cat /etc/mageia-release) | $(i18n "Kernels in") /boot/:${NK} | AUTO:$autostat | $(i18n "KEEP"):$NBK ${qamssg}${cfgmssg}${Normal} "
+
+#================================= Analyse rpms =============================
+# Get master list from rpm -qa --last
+allkernels=$(rpm -qa --last|grep "kernel-")
+
+# Get the kernel version and release required by the installed virtualbox-flavour-latest
+get_vbox_kern() {
+if echo "$allkernels"|grep -q "virtualbox-${kernelType}-latest"; then
+ vb_latest_ver=$(echo "$allkernels"|grep "virtualbox-${kernelType}-latest"|cut -d- -f5-|rev|cut -d. -f2-|rev)
+else
+ qavkern=; return
+fi
+depkern=$(echo "$allkernels"|grep $vb_latest_ver|grep -v latest|grep virtualbox-kernel-[0-9])
+kern_ver=$(echo $depkern|cut -d- -f3-|cut -d- -f1)
+kern_rel=$(echo $depkern|cut -d- -f5-|cut -d. -f1)
+[[ ${#kern_ver} > 0 ]] && [[ ${#kern_rel} > 0 ]] && qavkern="${kern_ver}-${kern_rel}"
+}
+
+# Get the kernel version and release required by the installed xtables-addons-flavour-latest
+get_xtables_kern() {
+if echo "$allkernels"|grep -q "xtables-addons-${kernelType}-latest"; then
+ xt_latest_ver=$(echo "$allkernels"|grep kernel-|grep "xtables-addons-kernel"|grep "latest"|cut -d- -f6-|rev|cut -d. -f2-|rev)
+else
+ qaxkern=; return
+fi
+depkern=$(echo "$allkernels"|grep $xt_latest_ver|grep xtables-addons-kernel-[0-9]|cut -d ' ' -f1)
+kern_ver=$(echo $depkern|cut -d- -f4)
+kern_rel=$(echo $depkern|cut -d- -f6 -|cut -d. -f1)
+[[ ${#kern_ver} > 0 ]] && [[ ${#kern_rel} > 0 ]] && qaxkern="${kern_ver}-${kern_rel}"
+}
+
+# Keep the -devel package for any installed kernel package
+depdev() {
+# Reset some vars
+pkg=; kpkgname=; nnk=""
+ # Is current pkg a -devel
+ if echo "${installedKernelPackage}" | grep -q "\-devel"; then
+ # Get matching kernel package name
+ kpkgname=$(echo "${installedKernelPackage}"| /usr/bin/sed -e 's/\-devel//')
+ # Find kernel in installed list without timestamp
+ for pkg in $(echo "$allkernels"|cut -d ' ' -f1); do
+ # Look through installed kernels for kernel package
+ if [[ ${pkg} == ${kpkgname} ]]; then
+ nnk="K"; REMVBL=0
+ # Is kernel flagged for removal?
+ if cat ${TMPKTR} | grep -q $kpkgname ; then
+ # Then this -devel is also removable
+ nnk=""; REMVBL=1
+ fi
+ # We are done here
+ break
+ fi
+ done
+ fi
+}
+
+# Exclude 'latest' packages from installed kernel list
+rpmqaList=$(echo "$allkernels"|grep -v latest)
+
+# Loop through kernel types in LISTK
+for kernelType in ${LISTK}; do
+ [[ $QA -eq 1 ]] && get_vbox_kern && get_xtables_kern
+ installedKernelCounter=0;
+# Scan through installed kernels to match with kernel type in LISTK
+ echo "$rpmqaList"|grep "${kernelType}-[0-9]"|while read installedKernel; do
+ # Clear these for each loop
+ NOTA=""; REMVBL=1
+# Increment installedKernelCounter
+ installedKernelCounter=$((${installedKernelCounter} + 1))
+
+# Return to the line if there exists at least one installedKernel of this kernelType
+ if [[ ${installedKernelCounter} -eq 1 ]] ; then
+ echo -ne "\r ==> ${kernelType}"
+ echo ""
+ fi
+
+# Remove time stamp
+ installedKernelPackage=$(echo ${installedKernel} | cut -d ' ' -f 1 )
+
+# Check for current kernel
+ if [[ $(echo ${installedKernel} | grep ${CURK} | wc -l ) -eq 1 ]] ; then
+ NOTA="U" # current kernel
+ REMVBL=0 # not removable
+ fi
+
+# Check if kernel is required by vbox latest kernel
+ if [[ $QA -eq 1 ]] && [[ ${#qavkern} -gt 0 ]] && [[ $(echo ${installedKernel} | grep "$qavkern" | wc -l ) -eq 1 ]]; then
+ NOTA="${NOTA}V" # Required by VBox
+ REMVBL=0 # not removable
+ fi
+
+# Check if kernel is required by xtables latest kernel
+ if [[ $QA -eq 1 ]] && [[ ${#qaxkern} -gt 0 ]] && [[ $(echo ${installedKernel} | grep "$qaxkern" | wc -l ) -eq 1 ]]; then
+ NOTA="${NOTA}X" # Required by xtables
+ REMVBL=0 # not removable
+ fi
+
+# If a kernel devel package has the corresponding kernel package keep it
+ if [[ $QA -eq 1 ]]; then
+ depdev
+ NOTA="${NOTA}${nnk}"
+ fi
+
+# Pad NOTA to 4
+ while (( ${#NOTA} < 4 )); do NOTA="${NOTA} "; done
+
+# Pad installedKernelCounter (col 1) to 3
+ while (( ${#installedKernelCounter} < 3 )); do installedKernelCounter="${installedKernelCounter} "; done
+
+ if [[ ${installedKernelCounter} -gt $NBK ]]; then
+ if [[ ${REMVBL} -ne 1 ]] ; then
+ echo -e "\r ${installedKernelCounter}${KeepCol} : $keepstr: ${NOTA}: ${installedKernel} ${Normal}"
+ else
+ echo -e "\r ${installedKernelCounter}${RemvCol} : $remstr: ${NOTA}: ${installedKernel} ${Normal}"
+ # Add package to removal list
+ echo ${installedKernelPackage} >> ${TMPKTR}
+ fi
+ else
+ echo -e "\r ${installedKernelCounter}${KeepCol} : $keepstr: ${NOTA}: ${installedKernel} ${Normal}"
+ fi
+ done
+done
+
+# Position 'in use' key under symbol below column 3
+padUse=$((${#keepstr}+9)); padstr=""
+while (( ${#padstr} < $padUse )); do padstr="${padstr} "; done
+
+echo -en "${ClearLine}"
+echo -e "${padstr}${KeepCol}U${InfoCol} = $(i18n "In use now")${Normal}"
+if [[ ${#dnfmssg} > 0 ]];then echo -e "${dnfmssg}"; fi
+
+#================================= Mode of execution ===================
+
+nbt=$(cat ${TMPKTR} | wc -l)
+if [[ ${nbt} -ne 0 ]] ; then
+ (((UID))) && echo -e "${RemvCol}$(i18n "Must be root to allow removal")\n${Normal}"
+ if [[ ${VISU} -eq 1 ]]; then
+ plural="s"; [[ ${nbt} -eq 1 ]] && plural=""
+ echo "$(i18n "Command${plural} that would be used"):"
+ for f in $(tac ${TMPKTR}); do
+ echo "urpme ${f}"
+ done
+ i18n "Tap spacebar to exit"
+ read -n1
+ echo -en "${ClearLine}"
+ rm -f ${TMPKTR}
+ exit 0
+ fi
+
+ if [[ ${MODE} != "A" ]] ; then
+ if [[ ${DEBUG} -eq 1 ]] ; then
+ echo -e "\n${KeepCol}>> $(i18n "Test mode is on - kernels will not be removed") <<${Normal}"
+ fi
+ plural="s"; [[ ${nbt} -eq 1 ]] && plural=""
+ read -p "$(i18n "Remove") ${nbt} $(i18n "kernel${plural}") ? $(i18n "y/N/i (i=confirm for each)") " -n 1 response
+ if [[ -z ${response} ]] ; then response="n" ; fi
+ case ${response} in
+ [Yy])
+ AUTO="--auto"
+ ASK=0
+ MODE="A"
+ echo -e " \n"
+ ;;
+ [Ii])
+ AUTO="--auto"
+ MODE="I"
+ echo " $(i18n "interactive")"
+ ;;
+ *)
+ echo -e "\n$(i18n "Aborted")\n"
+ rm -f ${TMPKTR}
+ exit 0
+ ;;
+ esac
+ fi
+
+#================================= Execution ===========================
+
+ for installedKernelPackage in $(tac ${TMPKTR}) ; do
+ if [[ ${MODE} = "I" ]] ; then # --- interactive mode ---
+ read -p "$(i18n "Remove") ${installedKernelPackage} ? $(i18n "y/N/q (q=quit)") " -n 1 response
+ echo -e " \n"
+ if [[ -z ${response} ]]; then
+ response="N"
+ fi
+ case ${response} in
+ [Yy])
+ if [[ ${DEBUG} -eq 1 ]] ; then
+ echo -e "\n${InfoCol}$(i18n "DEBUG: Could execute: urpme") ${AUTO} ${installedKernelPackage}${Normal}"
+ nbt=$((${nbt} - 1))
+ else
+ urpme ${installedKernelPackage}
+ nbt=$((${nbt} - 1))
+ fi
+ ;;
+ [qQ])
+ echo -e "\n$(i18n "Aborted")"
+ rm -f ${TMPKTR};
+ exit 0
+ ;;
+ *)
+ echo " "
+ ;;
+ esac
+ else # --- automatic mode ---
+ if [[ ${DEBUG} -eq 1 ]] ; then
+ echo -e "${InfoCol}$(i18n "DEBUG: Could execute: urpme") ${AUTO} ${installedKernelPackage}${Normal}"
+ nbt=$((${nbt} - 1))
+ else
+ # echo "Auto execution"
+ echo -ne 'y\n' | urpme ${AUTO} ${installedKernelPackage}
+ nbt=$((${nbt} - 1))
+ fi
+ fi
+ done
+ NK=$(ls /boot/vmlinuz*.mga[0-9] | wc -l)
+ OCCDISK2=$(df -B 1M -l --output=used / | tail -n1 | awk '{ print $1 }')
+ echo -e "${HdBgCol} $(i18n "Gain") : $((OCCDISK1 - OCCDISK2)) MB - $(i18n "Kernels in") /boot/: ${NK} ${Normal}"
+fi
+
+[[ $MODE == "I" ]] && { i18n "Tap spacebar to exit"; read -n1; echo -en "${ClearLine}"; }
+
+rm -f ${TMPKTR}
+
+# Run again if some removable kernels are left
+(((UID))) && exit 0 # Not root user so exit
+[ ${MODE} != "I" ] && exit 0 # Auto so exit
+[ ${nbt} -gt 0 ] && ${0} # Root user and interactive so run again if removable kernels left
diff --git a/remove-old-kernels-pkexec b/remove-old-kernels-pkexec
new file mode 100644
index 0000000..c8ca9f4
--- /dev/null
+++ b/remove-old-kernels-pkexec
@@ -0,0 +1,3 @@
+#!/bin/sh
+pkexec "/usr/sbin/remove-old-kernels" "$@"
+
diff --git a/remove-old-kernels.1 b/remove-old-kernels.1
new file mode 100644
index 0000000..95e9664
--- /dev/null
+++ b/remove-old-kernels.1
@@ -0,0 +1,187 @@
+.TH remove-old-kernels "22 Nov 2022"
+.SH NAME
+remove-old-kernels \- Utility to remove obsolete kernels in Mageia Systems using urpme.
+.SH SYNOPSIS
+\fBremove-old-kernels\fP [\fI\-option\fP]
+
+\fBrok\fP [\fI\-option\fP]
+
+.SH DESCRIPTION
+\fBremove-old-kernels\fR runs automatically under cron.weekly using configuration settings in /etc/remove-old-kernels.cfg. This is the default in order to avoid system failure due to old kernels filling the root file system.
+.br
+For most users it can be left, as installed, to do it's job without any user intervention or concern.
+
+.br
+It keeps the default (3) kernels of EACH kernel flavour, NOT 3 in total. If there are kernels of various flavours installed, then only the flavours with more than 3 would see any removed.
+
+.br
+It will never remove the running kernel.
+
+.br
+If the running kernel has been accidentally removed by some utility since boot then it will report the error and abort, removing nothing.
+
+\fBremove-old-kernels\fP also allows interactive command\-line removal of kernel packages using various options.
+
+\fBremove-old-kernels\fR with no arguments as a regular user, will display the current kernel(s) installed, the one in use, marked with 'U', and the ones it suggests to remove in red, if any.
+.br
+This is a good way to make a quick check without any risk of error.
+
+\fBremove-old-kernels\fP is also available from the Mageia main menu system in graphical desktops for ease of use by users unfamiliar with the command line. Usually found under Tools -> System Tools. It will ask for the root password.
+
+\fBIn automatic mode a log is kept at /var/log/remove-old-kernels.log. The log is limited to 1000 lines (up to a year) and will then start to remove the oldest entries whilst adding new ones. See the -l option to view the log.
+
+.SH DISPLAY
+
+.TP
+\fB\The header bar.
+This shows:
+.br
+The system release information.
+.br
+The number of kernels found in the /boot directory
+.br
+Whether the automatic mode is on or off. OFF is highlighted in red as a warning.
+.br
+The number of kernels to be kept per flavour.
+.br
+Whether in advanced mode. Not shown when OFF. e.g. Q:1
+.br
+The configuration file in use. Not shown for the main configuration file. e.g. F:1
+
+.TP
+\fB\The list columns.
+.br
+Column 1 shows the number of kernels found of each flavour.
+.br
+Column 2 indicates whether the kernel will be kept or removed.
+.br
+Column 3 shows a key letter to indicate the reason for keeping. Run 'rok -h' for key.
+.br
+Column 4 shows the full kernel package name concerned.
+.br
+Column 5 shows the date and time that the kernel was installed.
+
+.SH CONFIGURATION
+
+\fBThe configuration file is /etc/remove-old-kernels.cfg which may be edited manually if desired.
+.br
+\fBThere are several options below which can also be used more conveniently to change settings in the configuration file
+from the command line when run as root.
+.br
+.br
+Several alternative configuration files may be added manually if desired. They must be named as follows:
+.br
+/etc/remove-old-kernels_N.cfg where N is a digit from 1 to 9.
+.br
+A template configuration file is provided containing default values which may be copied:
+/usr/share/doc/remove-old-kernels/remove-old-kernels_N.cfg.template.
+.br
+To use a new alternative configuration file for the current run you can use the -f N option, or -F N to switch to it persistently.
+NOTE that any changes like auto ON/OFF, or the number of kernels to keep, that are made while running an alternative configuration
+will be saved to THAT configuration file. They will not affect the default 'main' configuration.
+.br
+To switch back to the original configuration use -F 0.
+
+.SH OPTIONS
+
+.TP
+\fI\-h -?\fP help
+
+Displays the available options and a key to column 3 of the display.
+
+.TP
+\fI\-n N\fP Set the number of kernels to keep. ONLY for the current run.
+
+This parameter sets the number of kernels to keep (this time) in interactive mode. It must be 2 or more, it's value may be restricted by the setting in etc/dnf/dnf.conf if dnf is installed, in which case there is an on-screen warning. dnf sets a default value of 3.
+
+.TP
+\fI\-N N\fP Like -n but stores the 'number of kernels to keep' persistently in the config file. e.g. -N 4
+
+It must be run as root to take effect.
+
+.TP
+\fI\-a\fP automatic mode. Run once with no questions asked.
+
+Similar to the weekly cron job and will use settings from /etc/remove-old-kernels.cfg.
+.br
+It may be used with the -n N option if desired. NOTE: No output is sent to the log when run manually.
+
+.TP
+\fI\-A [y|n]\fP Automatic mode ON/OFF switch.
+
+This switches the automatic weekly run ON (y) or OFF (n).
+It directly edits /etc/remove-old-kernels.cfg, setting CRON=y or CRON=n so must be run as root to have any effect.
+
+.TP
+\fI\-c\fP Special option for system automatic mode. This option is NOT intended for manual use.
+
+Checks if CRON=y is in /etc/remove-old-kernels.cfg before running, or exits. The output is logged to /var/log/remove-old-kernels.log.
+It is run by /etc/cron.weekly/remove-old-kernels.cron which also trims the log to 1000 lines if it is greater. This equates to something over one year of use for basic systems.
+See the -l option for viewing the log.
+
+.TP
+\fI\-f N\fP Switch to an alternative configuration file. ONLY for the current run.
+
+N is any number from 1 to 9. Alternative configuration files need to be prepared in advance.
+
+.TP
+\fI\-F N\fP Switch to an alternative configuration file. Persistently. (Must be root)
+
+N is any number from 1 to 9. Alternative configuration files need to be prepared in advance.
+
+.TP
+\fI\-t\fP Test mode.
+
+A test mode where nothing is removed, to see what would be done.
+
+.TP
+\fI\-p\fP Preview mode.
+
+Dry run showing the urpme commands that would be used.
+
+.TP
+\fI\-q\fP Advanced mode, run once.
+
+An advanced mode (developed for Mageia QA testers).
+.br
+In addition to the regular mode, when ON this will also NOT remove:
+.br
+A kernel devel package of the same version as a corresponding installed kernel, unless the kernel is going to be removed as well.
+.br
+A kernel potentially needed by an installed virtualbox kernel latest.
+.br
+A kernel potentially needed by an installed xtables-addons kernel latest.
+
+.TP
+\fI\-Q N\fP Advanced mode, persistent. OFF by default.
+When ON, "Q:ON" is displayed near the right end of the header bar.
+
+N = 1 for enable, 0 to disable. Default disabled.
+
+.TP
+\fI\-l N\fP Display the log file. (Only created by the weekly automatic runs)
+.br
+The last 1000 lines of the log are retained. If no log has yet been created then it will exit.
+
+.TP
+\fI\-v\fP Show the version of the installed remove-old-kernels package.
+
+.SH EXAMPLES
+\fBrok\fP
+.br
+A shorthand link to 'remove-old-kernels'. Run as root to remove kernels or change settings.
+
+\fBremove-old-kernels -n4\fP
+.br
+Remove old kernels interactively, this time, keeping 4 kernels of each flavour.
+
+\fBrok -l\fP
+.br
+Display the log file.
+
+.SH BUGS
+None known. Report any issues with the program or documentation to https://bugs.mageia.org/
+
+.SH AUTHOR
+\fBremove-old-kernels is by Pierre Jarillon (2018-2021) Jean-Baptiste Biernacki (2021) Barry C Jackson (2022)\fP
+This document is by Barry C Jackson <barjac@mageia.org>.
diff --git a/remove-old-kernels.cfg b/remove-old-kernels.cfg
new file mode 100644
index 0000000..ee2c56a
--- /dev/null
+++ b/remove-old-kernels.cfg
@@ -0,0 +1,54 @@
+# remove-old-kernels.cfg
+
+# This is the main configuration file for 'remove-old-kernels' and must exist.
+
+# Installed location is /etc/remove-old-kernels.cfg
+
+# NOTE: Some of these settings may be changed by command line options, see the man page.
+
+# If dnf is installed then 'remove-old-kernels' will always
+# leave at least the number of kernels set in /etc/dnf/dnf.conf
+# which defaults to three.
+
+# Number of kernels of each flavour to keep - Must be 2 or greater.
+NBK=3
+
+# Handy info: https://misc.flogisoft.com/bash/tip_colors_and_formatting#colors
+# Colours for display Defaults Used for
+Normal="\e[0m"
+KeepCol="\e[92m" # Light Green Keep text
+RemvCol="\e[91m" # Light Red Remove text
+InfoCol="\e[33m" # Orange Information text
+HdBgCol="\e[102;30m" # Light Green Background Heading background
+WarnBgCol="\e[101m" # Light Red Background Warnings in heading
+ClearLine="\r\e[2K" # Clear the line
+
+# Kernel types to test for removal - keep the same order i.e. kernel before -devel etc.
+LISTK=\
+"kernel-desktop586
+kernel-desktop
+kernel-desktop-devel
+kernel-server
+kernel-server-devel
+kernel-source
+kernel-tmb-desktop
+kernel-tmb-desktop-devel
+kernel-tmb-source
+kernel-linus
+kernel-linus-devel
+kernel-linus-source
+"
+
+# Allow cron to run 'remove-old-kernels' weekly. Replace 'y' with 'n' (lower case) to disable it.
+CRON=y
+
+# Turn on the advanced mode. [0|1] (1 is ON)
+QA=0
+
+# Alternate config file to use, 0 is default (none). 1 to 9 are allowed which must be named as:
+# /etc/remove-old-kernels_N.cfg (e.g. /etc/remove-old-kernels_3.cfg)
+# To create an alternative .cfg file use a copy of the template here:
+# /usr/share/doc/remove-old-kernels/remove-old-kernels_N.cfg.template
+# Do not edit this line, use the -f or -F options which will validate that it exists. See man page.
+ALTCFG=0
+# DO NOT include the above line in any alternative .cfg files!
diff --git a/remove-old-kernels.cron b/remove-old-kernels.cron
new file mode 100644
index 0000000..df583d8
--- /dev/null
+++ b/remove-old-kernels.cron
@@ -0,0 +1,18 @@
+#!/usr/bin/bash
+
+# cron job to remove old kernels
+# this runs remove-old-kernels to remove old kernels according
+# to the settings in /etc/remove-old-kernels.cfg
+
+if [[ -x /usr/sbin/remove-old-kernels ]]; then
+# Trim log before starting remove-old-kernels with colours disabled
+ if [[ -f /var/log/remove-old-kernels.log ]]; then
+ keeplines=1000; fail=""
+ roktmplog=$(mktemp)
+ ( tail -n $keeplines /var/log/remove-old-kernels.log > $roktmplog && \
+ cat $roktmplog > /var/log/remove-old-kernels.log && rm -f $roktmplog ) || fail="WARNING: log trim failed"
+ fi
+echo -e "\n=========================== $(date +%d/%m/%Y-%H:%M) ===========================\n$fail" >> /var/log/remove-old-kernels.log
+# Use -c option to check that CRON=y is in the cfg file before running in auto mode.
+ /usr/sbin/remove-old-kernels -c -m >> /var/log/remove-old-kernels.log
+fi
diff --git a/remove-old-kernels.desktop b/remove-old-kernels.desktop
new file mode 100644
index 0000000..1288b93
--- /dev/null
+++ b/remove-old-kernels.desktop
@@ -0,0 +1,22 @@
+[Desktop Entry]
+Comment=Removal tool for obsolete system kernels
+Comment[en_GB]=Removal tool for obsolete system kernels
+Exec=/usr/sbin/remove-old-kernels-pkexec
+GenericName=Remove Old Kernels
+GenericName[en_GB]=Remove Old Kernels
+GenericName[fr]=Enlever les noyaux superflus
+Icon=/usr/share/icons/hicolor/scalable/apps/remove-old-kernels.svg
+MimeType=
+Name=Remove Old Kernels
+Name[en]=Remove Old Kernels
+Name[en_GB]=Remove Old Kernels
+Name[fr]=Enlever les noyaux superflus
+StartupNotify=true
+Terminal=true
+Type=Application
+Categories=System;Utility;X-Mageia-CrossDesktop;
+X-DBUS-ServiceName=
+X-DBUS-StartupType=none
+X-KDE-SubstituteUID=false
+X-KDE-Username=
+X-KeepTerminal=false
diff --git a/remove-old-kernels.svg b/remove-old-kernels.svg
new file mode 100644
index 0000000..b848b03
--- /dev/null
+++ b/remove-old-kernels.svg
@@ -0,0 +1,337 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="32"
+ height="32"
+ id="svg5453"
+ version="1.1"
+ inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
+ sodipodi:docname="mageiawelcome.svg"
+ inkscape:export-filename="mgaonline48.png"
+ inkscape:export-xdpi="135"
+ inkscape:export-ydpi="135"
+ xml:space="preserve"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
+ id="defs5455"><linearGradient
+ id="linearGradient4290"
+ inkscape:collect="always"><stop
+ id="stop4292"
+ offset="0"
+ style="stop-color:#7cbaf8;stop-opacity:1" /><stop
+ id="stop4294"
+ offset="1"
+ style="stop-color:#f4fcff;stop-opacity:1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4290"
+ id="linearGradient4194"
+ x1="398.57144"
+ y1="535.79797"
+ x2="398.57144"
+ y2="527.79797"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4290"
+ id="linearGradient4175"
+ gradientUnits="userSpaceOnUse"
+ x1="398.57144"
+ y1="535.79797"
+ x2="398.57144"
+ y2="527.79797" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4290"
+ id="linearGradient7775"
+ gradientUnits="userSpaceOnUse"
+ x1="398.57144"
+ y1="535.79797"
+ x2="398.57144"
+ y2="527.79797" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4290"
+ id="linearGradient7777"
+ gradientUnits="userSpaceOnUse"
+ x1="398.57144"
+ y1="535.79797"
+ x2="398.57144"
+ y2="527.79797" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4290"
+ id="linearGradient7779"
+ gradientUnits="userSpaceOnUse"
+ x1="398.57144"
+ y1="535.79797"
+ x2="398.57144"
+ y2="527.79797" /></defs><sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="15.999999"
+ inkscape:cx="17.187501"
+ inkscape:cy="15.937501"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4171"
+ showgrid="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1280"
+ inkscape:window-height="959"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:showpageshadow="false"
+ borderlayer="true"
+ showguides="true"
+ inkscape:snap-midpoints="false"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"><inkscape:grid
+ type="xygrid"
+ id="grid4063" /><sodipodi:guide
+ position="1.1650391e-05,32.000026"
+ orientation="32,0"
+ id="guide4157"
+ inkscape:locked="false" /><sodipodi:guide
+ position="1.1650391e-05,2.6367188e-05"
+ orientation="0,32"
+ id="guide4159"
+ inkscape:locked="false" /><sodipodi:guide
+ position="32.000012,2.6367188e-05"
+ orientation="-32,0"
+ id="guide4161"
+ inkscape:locked="false" /><sodipodi:guide
+ position="32.000012,32.000026"
+ orientation="0,-32"
+ id="guide4163"
+ inkscape:locked="false" /><sodipodi:guide
+ position="2.0000117,30.000026"
+ orientation="28,0"
+ id="guide4167"
+ inkscape:locked="false" /><sodipodi:guide
+ position="2.0000117,2.0000264"
+ orientation="0,28"
+ id="guide4169"
+ inkscape:locked="false" /><sodipodi:guide
+ position="30.000012,2.0000264"
+ orientation="-28,0"
+ id="guide4171"
+ inkscape:locked="false" /><sodipodi:guide
+ position="30.000012,30.000026"
+ orientation="0,-28"
+ id="guide4173"
+ inkscape:locked="false" /><sodipodi:guide
+ position="2.0000117,30.000026"
+ orientation="28,0"
+ id="guide4181"
+ inkscape:locked="false" /><sodipodi:guide
+ position="2.0000117,2.0000264"
+ orientation="0,14"
+ id="guide4183"
+ inkscape:locked="false" /><sodipodi:guide
+ position="16.771352,12.721507"
+ orientation="-28,0"
+ id="guide4185"
+ inkscape:locked="false" /><sodipodi:guide
+ position="16.000012,30.000026"
+ orientation="0,-14"
+ id="guide4187"
+ inkscape:locked="false" /><sodipodi:guide
+ position="9.0000117,23.000026"
+ orientation="14,0"
+ id="guide4193"
+ inkscape:locked="false" /><sodipodi:guide
+ position="9.0000117,9.0000264"
+ orientation="0,14.000031"
+ id="guide4195"
+ inkscape:locked="false" /><sodipodi:guide
+ position="23.000042,9.0000264"
+ orientation="-14,0"
+ id="guide4197"
+ inkscape:locked="false" /><sodipodi:guide
+ position="23.000042,23.000026"
+ orientation="0,-14.000031"
+ id="guide4199"
+ inkscape:locked="false" /></sodipodi:namedview><metadata
+ id="metadata5458"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-384.57143,-515.798)"><g
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:'Clear Sans';-inkscape-font-specification:'Clear Sans Bold';letter-spacing:0px;word-spacing:0px;opacity:1;fill:url(#linearGradient4194);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4184"><g
+ id="g4171"
+ style="fill:url(#linearGradient4175);fill-opacity:1"><g
+ id="g996"
+ transform="matrix(0.15262653,0,0,0.16081363,384.87993,516.57173)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:'Clear Sans';-inkscape-font-specification:'Clear Sans Bold';letter-spacing:0px;word-spacing:0px;fill:url(#linearGradient7779);fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><g
+ inkscape:label="Layer 1"
+ id="layer1-3"
+ style="fill:url(#linearGradient7775)"><rect
+ style="fill:#000000;stroke-width:0.264583"
+ id="rect970"
+ width="183.85124"
+ height="173.59367"
+ x="11.346816"
+ y="7.5816488"
+ ry="2.1122603" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect2012-9"
+ width="13.423958"
+ height="3.4610584"
+ x="164.3107"
+ y="31.344818"
+ ry="1.7305292" /><rect
+ style="fill:#ff0000;stroke-width:0.264583"
+ id="rect1809-62"
+ width="101.7161"
+ height="3.5737784"
+ x="56.477978"
+ y="70.711464"
+ ry="1.4358689"
+ rx="0" /><rect
+ style="fill:#ff0000;stroke-width:0.264583"
+ id="rect1809-35"
+ width="101.7161"
+ height="3.5737784"
+ x="56.513832"
+ y="64.224121"
+ ry="1.4358689"
+ rx="0" /><rect
+ style="fill:#ff0000;stroke-width:0.264583"
+ id="rect1809-5"
+ width="101.7161"
+ height="3.5737784"
+ x="56.626263"
+ y="57.83477"
+ ry="1.4358689"
+ rx="0" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect1809-7"
+ width="101.7161"
+ height="3.5737784"
+ x="56.835758"
+ y="51.083687"
+ ry="1.4358689"
+ rx="0" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect1809-6"
+ width="101.7161"
+ height="3.5737784"
+ x="56.679832"
+ y="44.480804"
+ ry="1.4358689"
+ rx="0" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect1809-3"
+ width="101.7161"
+ height="3.5737784"
+ x="56.633389"
+ y="37.959045"
+ ry="1.4358689"
+ rx="0" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect2012"
+ width="13.423958"
+ height="3.4610584"
+ x="37.35762"
+ y="31.250603"
+ ry="1.7305292" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect2012-1"
+ width="13.423958"
+ height="3.4610584"
+ x="37.538624"
+ y="38.143776"
+ ry="1.7305292" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect2012-2"
+ width="13.423958"
+ height="3.4610584"
+ x="37.703911"
+ y="44.413418"
+ ry="1.7305292" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect2012-1-7"
+ width="13.423958"
+ height="3.4610584"
+ x="37.748642"
+ y="51.306591"
+ ry="1.7305292" /><rect
+ style="fill:#ff0000;stroke-width:0.264583"
+ id="rect2012-0"
+ width="13.423958"
+ height="3.4610584"
+ x="37.784607"
+ y="57.461933"
+ ry="1.7305292" /><rect
+ style="fill:#ff0000;stroke-width:0.264583"
+ id="rect2012-1-9"
+ width="13.423958"
+ height="3.4610584"
+ x="37.787979"
+ y="63.980339"
+ ry="1.7305292" /><rect
+ style="fill:#ff0000;stroke-width:0.264583"
+ id="rect2012-1-9-3"
+ width="13.423958"
+ height="3.4610584"
+ x="37.851917"
+ y="70.556793"
+ ry="1.7305292" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:105.941px;line-height:1.25;font-family:sans-serif;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.397278"
+ x="25.86445"
+ y="163.02611"
+ id="text2222"
+ transform="scale(1.004718,0.99530419)"><tspan
+ sodipodi:role="line"
+ id="tspan2220"
+ style="font-size:105.941px;fill:#ff0000;stroke-width:0.397278"
+ x="25.86445"
+ y="163.02611">K</tspan></text><text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:35.2778px;line-height:1.25;font-family:sans-serif;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ x="148.46155"
+ y="134.78926"
+ id="text2276"><tspan
+ sodipodi:role="line"
+ id="tspan2274"
+ style="font-size:35.2778px;fill:#00ff00;fill-opacity:1;stroke-width:0.264583"
+ x="148.46155"
+ y="134.78926">K</tspan></text><path
+ style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 90.378872,111.20479 55.839798,15.47269 -56.508459,16.6052 0.122513,-32.239 z"
+ id="path2332" /><path
+ style="fill:#ffff00;fill-opacity:1;stroke-width:0.314619"
+ d="m 89.98093,121.5599 v -15.73221 l 2.123676,0.58895 c 1.168024,0.32393 13.542994,3.74824 27.499934,7.60958 13.95695,3.86135 25.34945,7.04879 25.31667,7.0832 -0.0328,0.0344 -12.15998,3.61401 -26.94935,7.95466 -14.78937,4.34065 -27.137527,7.96768 -27.440345,8.06006 -0.519263,0.15842 -0.550585,-0.72693 -0.550585,-15.56424 z"
+ id="path2472" /></g><g
+ id="layer2"
+ inkscape:label="Layer 2"
+ style="fill:url(#linearGradient7777)"><rect
+ style="fill:#ffffff;stroke-width:0.246766"
+ id="rect1755"
+ width="57.971539"
+ height="3.7839279"
+ x="37.402649"
+ y="23.341612"
+ ry="1.8373547" /><rect
+ style="fill:#00ff00;stroke-width:0.264583"
+ id="rect1809"
+ width="101.7161"
+ height="3.5737784"
+ x="56.536282"
+ y="31.34889"
+ ry="1.4358689"
+ rx="0" /></g></g></g></g></g></svg>
diff --git a/remove-old-kernels_N.cfg.template b/remove-old-kernels_N.cfg.template
new file mode 100644
index 0000000..8e95d97
--- /dev/null
+++ b/remove-old-kernels_N.cfg.template
@@ -0,0 +1,48 @@
+# remove-old-kernels_N.cfg.template
+
+# NOTE: This is a default template to use for 'alternative' .cfg files
+# All settings in here are the default as used in the main configuration file.
+
+#===========================================
+# This file may be copied as /etc/remove-old-kernels_N.cfg and edited as desired.
+# N must only be a single digit from 1 to 9.
+#===========================================
+
+# If dnf is installed then 'remove-old-kernels' will always
+# keep at least the number of kernels set in /etc/dnf/dnf.conf
+# which defaults to three.
+
+# Number of kernels of each flavour to keep - Must be 2 or greater.
+NBK=3
+
+# Handy info: https://misc.flogisoft.com/bash/tip_colors_and_formatting#colors
+# Colours for display Defaults Used for
+Normal="\e[0m"
+KeepCol="\e[92m" # Light Green Keep text
+RemvCol="\e[91m" # Light Red Remove text
+InfoCol="\e[33m" # Orange Information text
+HdBgCol="\e[102;30m" # Light Green Background Heading background
+WarnBgCol="\e[101m" # Light Red Background Warnings in heading
+ClearLine="\r\e[2K" # Clear the line
+
+# Kernel types to test for removal - keep the same order i.e. kernels before -devel etc. or leave alone.
+LISTK=\
+"kernel-desktop586
+kernel-desktop
+kernel-desktop-devel
+kernel-server
+kernel-server-devel
+kernel-source
+kernel-tmb-desktop
+kernel-tmb-desktop-devel
+kernel-tmb-source
+kernel-linus
+kernel-linus-devel
+kernel-linus-source
+"
+
+# Allow cron to run 'remove-old-kernels' weekly. Replace 'y' with 'n' (lower case) to disable it.
+CRON=y
+
+# Turn on the advanced mode. [0|1] (1 is ON)
+QA=0