aboutsummaryrefslogtreecommitdiffstats
path: root/main/freeradius/radacct-rotate
diff options
context:
space:
mode:
Diffstat (limited to 'main/freeradius/radacct-rotate')
-rw-r--r--main/freeradius/radacct-rotate87
1 files changed, 87 insertions, 0 deletions
diff --git a/main/freeradius/radacct-rotate b/main/freeradius/radacct-rotate
new file mode 100644
index 00000000000..5dc03458c34
--- /dev/null
+++ b/main/freeradius/radacct-rotate
@@ -0,0 +1,87 @@
+#!/bin/sh
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Jakub Jirutka <jakub@jirutka.cz>
+#---help---
+# Usage: radacct-rotate [options]
+#
+# Compress and later remove old FreeRADIUS' radacct log files with "-YYYYMMDD"
+# suffix. This script is provided by the freeradius package in Alpine Linux.
+#
+# Options:
+# -C FILE Location of radacct-rotate config file (defaults to
+# /etc/raddb/radacct-rotate.conf).
+#
+# -c DAYS Compress files older than DAYS (overrides option
+# compress_after_days from the config).
+#
+# -r DAYS Remove compressed files older than DAYS (overrides
+# option remove_after_days from the config).
+#
+# -d Run in dry-run mode (only print what would be done).
+#
+# -h Show this message and exit.
+#---help---
+set -eu
+
+readonly PROGNAME='radacct-rotate'
+# Y Y Y Y m m d d
+readonly DATE_GLOB='[1-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9]'
+readonly HELP_TAG='#---help---'
+
+# Defaults
+CONFIG='/etc/raddb/radacct-rotate.conf'
+DRY_RUN=false
+radacct_dir='/var/log/radius/radacct'
+compress_cmd='gzip -9'
+compress_ext='.gz'
+compress_after_days=2
+remove_after_days=180
+
+while getopts ':C:c:dr:h' OPT; do
+ case "$OPT" in
+ C) CONFIG=$OPTARG;;
+ c) COMPRESS_AFTER_DAYS=$OPTARG;;
+ d) DRY_RUN=true;;
+ r) REMOVE_AFTER_DAYS=$OPTARG;;
+ h) sed -n "/^$HELP_TAG/,/^$HELP_TAG/{/^$HELP_TAG/d; s/^# \\?//; p;}" "$0"; exit 0;;
+ \?) echo "$PROGNAME: invalid option: -$OPTARG (see '$PROGNAME -h')" >&2; exit 100;;
+ esac
+done
+
+readonly CONFIG COMPRESS_AFTER_DAYS DRY_RUN REMOVE_AFTER_DAYS
+
+sh -n "$CONFIG" || exit 100
+. "$CONFIG"
+
+compress_after_days=${COMPRESS_AFTER_DAYS:-$compress_after_days}
+remove_after_days=${REMOVE_AFTER_DAYS:-$remove_after_days}
+
+
+find_compressible() {
+ find "$radacct_dir" -type f -name "*-$DATE_GLOB" -mtime "+$compress_after_days" "$@"
+}
+
+find_deletable() {
+ find "$radacct_dir" -type f -name "*-${DATE_GLOB}${compress_ext}" -mtime "+$remove_after_days" "$@"
+}
+
+check_number() {
+ case "$1" in
+ ''|*[!0-9]*) echo "$PROGNAME: option '$2' must be a number, but given: '$1'" >&2; exit 100;;
+ esac
+}
+check_number "$compress_after_days" 'compress_after_days'
+check_number "$remove_after_days" 'remove_after_days'
+
+rc=0
+if $DRY_RUN; then
+ find_compressible -exec echo $compress_cmd {} \; || rc=111
+ find_deletable -exec echo rm {} \; || rc=111
+else
+ for path in $(find_compressible -print); do
+ $compress_cmd "$path" >&2 && touch -ct "${path##*-}0000" "$path".* || rc=111
+ done
+ find_deletable -exec rm '{}' \; >&2 || rc=111
+fi
+
+exit $rc