forked from evolix/ansible-roles
158 lines
5.2 KiB
Bash
Executable file
158 lines
5.2 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
: "${AUTOSYSADMIN_LIB:=/usr/local/lib/autosysadmin}"
|
|
source "${AUTOSYSADMIN_LIB}/common.sh" || exit 1
|
|
source "${AUTOSYSADMIN_LIB}/repair.sh" || exit 1
|
|
|
|
pre_repair
|
|
|
|
|
|
# We always keep some reserved blocks to avoid missing some logs
|
|
# https://gitea.evolix.org/evolix/autosysadmin/issues/22
|
|
RESERVED_BLOCKS_MIN=1
|
|
|
|
get_mountpoints() {
|
|
# the $(...) get the check_disk1 command
|
|
# the cut command selects the critical part of the check_disk1 output
|
|
# the grep command extracts the mountpoints and available disk space
|
|
# the last cut command selects the mountpoints
|
|
check_disk1_command=$(grep check_disk1 /etc/nagios/nrpe.d/evolix.cfg | cut -d'=' -f2-)
|
|
|
|
${check_disk1_command} -e | cut -d'|' -f1 | grep --extended-regexp --only-matching '/[[:graph:]]* [0-9]+ [A-Z][A-Z]' | cut -d' ' -f1
|
|
}
|
|
|
|
is_reserved_blocks_nominal() {
|
|
partition=${1}
|
|
|
|
fs_type="$(findmnt -n --output=fstype "${partition}")"
|
|
if [ "${fs_type}" = "ext4" ]; then
|
|
device="$(findmnt -n --output=source "${partition}")"
|
|
reserved_block_count="$(tune2fs -l "${device}" | grep 'Reserved block count' | awk -F':' '{ gsub (" ", "", $0); print $2}')"
|
|
block_count="$(tune2fs -l "${device}" | grep 'Block count' | awk -F':' '{ gsub (" ", "", $0); print $2}')"
|
|
percentage=$(awk "BEGIN { pc=100*${reserved_block_count}/${block_count}; i=int(pc); print (pc-i<0.5)?i:i+1 }")
|
|
|
|
log_run "Reserved blocks for ${partition} is currently at ${percentage}%"
|
|
if [ "${percentage}" -gt "${RESERVED_BLOCKS_MIN}" ]; then
|
|
log_run "Allowing tune2fs action to reduce the number of reserved blocks"
|
|
return 0
|
|
else
|
|
log_run "Reserved blocks already at or bellow ${RESERVED_BLOCKS_MIN}%, no automatic action possible"
|
|
return 1
|
|
fi
|
|
else
|
|
log_run "Filesystem for ${partition} (${fs_type}) is incompatible with reserved block reduction."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
reduce_reserved_blocks() {
|
|
partition=${1}
|
|
|
|
device=$(findmnt -n --output=source "${partition}")
|
|
tune2fs -m "${RESERVED_BLOCKS_MIN}" "${device}"
|
|
log_action "Reserved blocks for ${partition} changed to ${RESERVED_BLOCKS_MIN} percent"
|
|
}
|
|
|
|
is_tmp_to_delete() {
|
|
size="$(find /var/log/ -type f -ctime +1 -exec du {} \+ | awk '{s+=$1}END{print s / 1024}')"
|
|
if [ -n "${size}" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
is_log_to_delete() {
|
|
size="$(find /var/log/ -type f -mtime +365 -exec du {} \+ | awk '{s+=$1}END{print s / 1024}')"
|
|
if [ -n "${size}" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
clean_apt_cache() {
|
|
for container in $(lxc-ls -1); do
|
|
if [ -e "$(lxc-config lxc.lxcpath)/${container}/rootfs/var/cache" ]; then
|
|
lxc-attach --name "${container}" -- apt-get clean
|
|
log_action "Clean apt cache in LXC container ${container}";
|
|
fi
|
|
done
|
|
|
|
# NOTE: "head -n 1" might be superfluous, but let's be sure to have only the first returned value
|
|
biggest_subdir=$(du --summarize --one-file-system "/var/*" | sort --numeric-sort --reverse | sed 's/^[0-9]\+[[:space:]]\+//;q' | head -n 1)
|
|
case "${biggest_subdir}" in
|
|
'/var/cache')
|
|
apt-get clean
|
|
log_action 'Clean apt cache'
|
|
;;
|
|
esac
|
|
}
|
|
|
|
clean_amavis_virusmails() {
|
|
if du --inodes /var/lib/* | sort --numeric-sort | tail -n 3 | grep --quiet 'virusmails$'; then
|
|
find /var/lib/amavis/virusmails/ -type f -atime +30 -delete
|
|
log_action 'Clean amavis infected mails'
|
|
fi
|
|
}
|
|
|
|
critical_mountpoints=$(get_mountpoints)
|
|
|
|
if [ -z "${critical_mountpoints}" ]; then
|
|
log_abort_and_quit "No partition is in critical state, nothing left to do."
|
|
else
|
|
for mountpoint in ${critical_mountpoints}; do
|
|
case "${mountpoint}" in
|
|
/var)
|
|
#if is_log_to_delete
|
|
#then
|
|
# find /var/log/ -type f -mtime +365 -delete
|
|
# log_action "$size Mo of disk space freed in /var"
|
|
#fi
|
|
if is_reserved_blocks_nominal /var; then
|
|
reduce_reserved_blocks /var
|
|
clean_apt_cache
|
|
clean_amavis_virusmails
|
|
fi
|
|
;;
|
|
/tmp)
|
|
#if is_tmp_to_delete
|
|
#then
|
|
# find /tmp/ -type f -ctime +1 -delete
|
|
# log_action "$size Mo of disk space freed in /tmp"
|
|
#fi
|
|
if is_reserved_blocks_nominal /tmp; then
|
|
reduce_reserved_blocks /tmp
|
|
fi
|
|
;;
|
|
/home)
|
|
if is_reserved_blocks_nominal /home; then
|
|
reduce_reserved_blocks /home
|
|
fi
|
|
;;
|
|
/srv)
|
|
if is_reserved_blocks_nominal /srv; then
|
|
reduce_reserved_blocks /srv
|
|
fi
|
|
;;
|
|
/filer)
|
|
if is_reserved_blocks_nominal /filer; then
|
|
reduce_reserved_blocks /filer
|
|
fi
|
|
;;
|
|
/)
|
|
if is_reserved_blocks_nominal /; then
|
|
reduce_reserved_blocks /
|
|
# Suggest remove old kernel ?
|
|
fi
|
|
;;
|
|
*)
|
|
# unknown
|
|
log_run 'Unknown partition (or weird case) or nothing to do'
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
post_repair
|