diff --git a/roles/ftp/files/deleteoldfiles.sh b/roles/ftp/files/deleteoldfiles.sh new file mode 100644 index 0000000..64eb06e --- /dev/null +++ b/roles/ftp/files/deleteoldfiles.sh @@ -0,0 +1,156 @@ +#!/bin/bash +# +############################################################################### +# Author : Louwrentius +# Contact : louwrentius@gmail.com +# Initial release : August 2011 +# Licence : Simplified BSD License +############################################################################### + +VERSION=1.01 + +# +# Mounted volume to be monitored. +# +MOUNT="$1" +# +# Maximum threshold of volume used as an integer that represents a percentage: +# 95 = 95%. +# +MAX_USAGE="$2" +# +# Failsafe mechansim. Delete a maxium of MAX_CYCLES files, raise an error after +# that. Prevents possible runaway script. Disable by choosing a high value. +# +MAX_CYCLES=10 + + +show_header () { + + echo + echo DELETE OLD FILES $VERSION + echo + +} + +show_header + +reset () { + CYCLES=0 + OLDEST_FILE="" + OLDEST_DATE=0 + ARCH=`uname` +} + +reset + +if [ -z "$MOUNT" ] || [ ! -e "$MOUNT" ] || [ ! -d "$MOUNT" ] || [ -z "$MAX_USAGE" ] +then + echo "Usage: $0 " + echo "Where threshold is a percentage." + echo + echo "Example: $0 /storage 90" + echo "If disk usage of /storage exceeds 90% the oldest" + echo "file(s) will be deleted until usage is below 90%." + echo + echo "Wrong command line arguments or another error:" + echo + echo "- Directory not provided as argument or" + echo "- Directory does not exist or" + echo "- Argument is not a directory or" + echo "- no/wrong percentage supplied as argument." + echo + exit 1 +fi + +check_capacity () { + + USAGE=`df -h | grep "$MOUNT" | awk '{ print $5 }' | sed s/%//g` + if [ ! "$?" == "0" ] + then + echo "Error: mountpoint $MOUNT not found in df output." + exit 1 + fi + + if [ -z "$USAGE" ] + then + echo "Didn't get usage information of $MOUNT" + echo "Mountpoint does not exist or please remove trailing slash." + exit 1 + fi + + if [ "$USAGE" -gt "$MAX_USAGE" ] + then + echo "Usage of $USAGE% exceeded limit of $MAX_USAGE percent." + return 0 + else + echo "Usage of $USAGE% is within limit of $MAX_USAGE percent." + return 1 + fi +} + +check_age () { + + FILE="$1" + if [ "$ARCH" == "Linux" ] + then + FILE_DATE=`stat -c %Z "$FILE"` + elif [ "$ARCH" == "Darwin" ] + then + FILE_DATE=`stat -f %Sm -t %s "$FILE"` + else + echo "Error: unsupported architecture." + echo "Send a patch for the correct stat arguments for your architecture." + fi + + NOW=`date +%s` + AGE=$((NOW-FILE_DATE)) + if [ "$AGE" -gt "$OLDEST_DATE" ] + then + export OLDEST_DATE="$AGE" + export OLDEST_FILE="$FILE" + fi +} + +process_file () { + + FILE="$1" + + # + # Replace the following commands with wathever you want to do with + # this file. You can delete files but also move files or do something else. + # + echo "Deleting oldest file $FILE" + rm -f "$FILE" +} + +while check_capacity +do + if [ "$CYCLES" -gt "$MAX_CYCLES" ] + then + echo "Error: after $MAX_CYCLES deleted files still not enough free space." + exit 1 + fi + + reset + + FILES=`find "$MOUNT" -type f` + + IFS=$'\n' + for x in $FILES + do + check_age "$x" + done + + if [ -e "$OLDEST_FILE" ] + then + # + # Do something with file. + # + process_file "$OLDEST_FILE" + else + echo "Error: somehow, item $OLDEST_FILE disappeared." + fi + ((CYCLES++)) +done +echo diff --git a/roles/ftp/tasks/main.yml b/roles/ftp/tasks/main.yml index dc77114..cf39c1b 100644 --- a/roles/ftp/tasks/main.yml +++ b/roles/ftp/tasks/main.yml @@ -23,3 +23,17 @@ group: root notify: restart vsftpd +- name: Put control size script + copy: + src: files/deleteoldfiles.sh + dest: /usr/local/sbin/deleteoldfiles.sh + owner: root + group: root + mode: '0700' + +- name: Cron control size script + cron: + name: Delete oldest file + user: root + minute: '0' + job: "/usr/local/sbin/deleteoldfiles.sh /srv 90 &> /dev/null"