Index: test/logs_rotation.sh =================================================================== diff -u --- test/logs_rotation.sh (revision 0) +++ test/logs_rotation.sh (revision 01436dda9dce9b0f6911e65f9d9f1eb68473eaad) @@ -0,0 +1,351 @@ +#!/bin/sh + +# ---------- constants ---------- + +PRINTF_SAME_LINE=1 + +LOG_FILE_SIZE_MB="bs=1024 count=10k" +LOG_FILE_SIZE_KB="bs=1024 count=100" + +PARTITION_SDCARD="/media/sd-card" +PARTITION_CONFIG="/var/configurations" + +OPT_HELP="-h" +OPT_TYPE="-t" +OPT_YEAR="-y" +OPT_PCNT="-%" + +LOG_DAY_MIN=1 +LOG_DAY_MAX=28 + +LOG_MONTH_MIN=1 +LOG_MONTH_MAX=12 + +LOG_YEAR_MIN=2000 +LOG_YEAR_MAX=$(date +%Y) + +CUR_YEAR_MAX=$LOG_YEAR_MAX +CUR_MONTH_MAX=$(date +%m) +CUR_DAY_MAX=$(date +%d) +CUR_HOUR="00" +CUR_MINUTE="00" + +LOG_PCNT_MIN=5 +LOG_PCNT_MAX=95 + +LOG_TYPE_SIZE_LOG=$LOG_FILE_SIZE_MB +LOG_TYPE_NAME_LOG="log" +LOG_TYPE_PART_LOG=$PARTITION_SDCARD +LOG_TYPE_PATH_LOG="log" +LOG_TYPE_EXTN_LOG="log" +LOG_TYPE_EXTR_LOG="" +LOG_TYPE_PCNT_LOG=85 + +LOG_TYPE_SIZE_ERR=$LOG_FILE_SIZE_MB +LOG_TYPE_NAME_ERR="service" +LOG_TYPE_PART_ERR=$PARTITION_SDCARD +LOG_TYPE_PATH_ERR="service" +LOG_TYPE_EXTN_ERR="err" +LOG_TYPE_EXTR_ERR="" +LOG_TYPE_PCNT_ERR=85 + +LOG_TYPE_SIZE_CLD=$LOG_FILE_SIZE_MB +LOG_TYPE_NAME_CLD="cloudsync" +LOG_TYPE_PART_CLD=$PARTITION_SDCARD +LOG_TYPE_PATH_CLD="cloudsync/log" +LOG_TYPE_EXTN_CLD="log" +LOG_TYPE_EXTR_CLD="" +LOG_TYPE_PCNT_CLD=85 + +LOG_TYPE_SIZE_TXR=$LOG_FILE_SIZE_KB +LOG_TYPE_NAME_TXR="treatment" +LOG_TYPE_PART_TXR=$PARTITION_CONFIG +LOG_TYPE_PATH_TXR="treatment" +LOG_TYPE_EXTN_TXR="txr" +LOG_TYPE_EXTR_TXR=".p" +LOG_TYPE_PCNT_TXR=70 + +# ---------- variables ---------- +paramlist="$@" + +part_size=0 +part_free_s=0 +part_used_s=0 +part_free_p=0 +part_used_p=0 + +path_used_s=0 +path_used_p=0 +path_free_p=0 + +logs_used_p=0 +logs_free_p=0 + + +log_year=$LOG_YEAR_MIN +log_size="" +log_type="" +log_partition="" +log_folder="" +log_extension="" +log_extension_extra="" + +cur_day=0 +cur_month=$LOG_MONTH_MIN +cur_year=$LOG_YEAR_MIN +cur_hour=$CUR_HOUR +cur_minute=$CUR_MINUTE +cur_timestamp="" +cur_fullName="" +cur_fullPathName="" +cur_counter=0 +cur_doGenerate=1 + +cur_DD="" +cur_MM="" +cur_YY="" + + +# ---------- functions ---------- +function error() { + echo "ERROR: $1" + exit 1 +} + +function isNumeric() { + [[ $1 =~ ^[0-9]+$ ]] && return 0 || return 1 +} + +function addLeadingZero() { + if (( $1 < 10 )); then + echo "0$1" + else + echo "$1" + fi +} + +function displayHelp() { + local format="%s %-15s %s %s\n" + echo + echo "$0 [-h | options]" + echo " -h display the current help" + echo " $OPT_TYPE log type to test" + echo " $OPT_YEAR starting year of the file creation date" + echo " $OPT_PCNT the optional max percentage of the partition to fill" + echo + echo "Usage example" + printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_LOG" "[-y2000]" "[-%85]" + printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_ERR" "[-y2000]" "[-%85]" + printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_CLD" "[-y2000]" "[-%85]" + printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_TXR" "[-y2000]" "[-%30]" + + exit 0 +} + +function checkParams() { + # check $1 + for param in $paramlist; do + case "$param" in + $OPT_TYPE$LOG_TYPE_NAME_LOG) + log_type=$LOG_TYPE_NAME_LOG + log_size=$LOG_TYPE_SIZE_LOG + log_partition=$LOG_TYPE_PART_LOG + log_folder=$LOG_TYPE_PATH_LOG + log_extension=$LOG_TYPE_EXTN_LOG + log_extension_extra=$LOG_TYPE_EXTR_LOG + logs_used_p=$LOG_TYPE_PCNT_LOG + ;; + + $OPT_TYPE$LOG_TYPE_NAME_ERR) + log_type=$LOG_TYPE_NAME_ERR + log_size=$LOG_TYPE_SIZE_ERR + log_partition=$LOG_TYPE_PART_ERR + log_folder=$LOG_TYPE_PATH_ERR + log_extension=$LOG_TYPE_EXTN_ERR + log_extension_extra=$LOG_TYPE_EXTR_ERR + logs_used_p=$LOG_TYPE_PCNT_ERR + ;; + + $OPT_TYPE$LOG_TYPE_NAME_CLD) + log_type=$LOG_TYPE_NAME_CLD + log_size=$LOG_TYPE_SIZE_CLD + log_partition=$LOG_TYPE_PART_CLD + log_folder=$LOG_TYPE_PATH_CLD + log_extension=$LOG_TYPE_EXTN_CLD + log_extension_extra=$LOG_TYPE_EXTR_CLD + logs_used_p=$LOG_TYPE_PCNT_CLD + ;; + + $OPT_TYPE$LOG_TYPE_NAME_TXR) + log_type=$LOG_TYPE_NAME_TXR + log_size=$LOG_TYPE_SIZE_TXR + log_partition=$LOG_TYPE_PART_TXR + log_folder=$LOG_TYPE_PATH_TXR + log_extension=$LOG_TYPE_EXTN_TXR + log_extension_extra=$LOG_TYPE_EXTR_TXR + logs_used_p=$LOG_TYPE_PCNT_TXR + ;; + + $OPT_PCNT*) + logs_used_p="$param" + logs_used_p="${logs_used_p:${#OPT_PCNT}}" + ;; + + $OPT_YEAR*) + log_year="$param" + log_year="${log_year:${#OPT_YEAR}}" + ;; + + $OPT_HELP) + displayHelp + ;; + + *) + error "invalid option '$param'" + ;; + esac + done + + # check the type + if [ -z $log_type ]; then + error "log type is missing" + fi + + # check year + if ! isNumeric $log_year; then + error "invalid log start year: '$log_year'" + fi + + if (( $log_year < $LOG_YEAR_MIN || $LOG_YEAR_MAX < $log_year )); then + error "invalid log year range: '$log_year' [$LOG_YEAR_MIN, $LOG_YEAR_MAX]" + fi + cur_year=$log_year + + # check percent + if ! isNumeric $logs_used_p; then + error "invalid log fill usage percent: '$log_year'" + fi + logs_free_p=$(( 100 - $logs_used_p )) + + if (( $logs_used_p < $LOG_PCNT_MIN || $LOG_PCNT_MAX < $logs_used_p )); then + error "invalid log fill usage percent range: '$logs_used_p' [$LOG_PCNT_MIN, $LOG_PCNT_MAX]" + fi + + echo "log type '$log_type'" + echo "location '$log_partition/$log_folder'" + echo "start year from '$log_year'" + echo "stops at '$logs_used_p%' total percent used" +} + +function incDate() { + cur_day=$(( $cur_day + 1 )) + if (( $cur_day > $LOG_DAY_MAX )); then + cur_day=$LOG_DAY_MIN + cur_month=$(( $cur_month + 1 )) + fi + + if (( $cur_month > $LOG_MONTH_MAX )); then + cur_month=$LOG_MONTH_MIN + cur_year=$(( $cur_year + 1 )) + fi + + # if (( $cur_year >= $LOG_YEAR_MAX )); then + # #TODO: the fact that we can pass today date is not checked + # fi + + + cur_DD=$(addLeadingZero $cur_day) + cur_MM=$(addLeadingZero $cur_month) + cur_YY="$cur_year" +} + +# 1 2 3 4 5 6 +#Filesystem 1K-blocks Used Available Use% Mounted on +#/dev/mmcblk1p1 15247276 591392 13861644 5% /media/sd-card +function getPartitionSize() { + part_size=$(df $log_partition | awk 'NR==2 {print $2}') +} + +function getSpacePercents() { + part_used_s=$(df $log_partition | awk 'NR==2 {print $3}') + part_free_s=$(df $log_partition | awk 'NR==2 {print $4}') + part_used_p=$(df $log_partition | awk 'NR==2 {print $5}') + #part_used_p=$(( $part_used_s * 100 / $part_size )) # this percentage cannot be calculated from df and it is not accurate. + part_free_p=$(( $part_free_s * 100 / $part_size )) + + path_used_s=$(du $log_partition/$log_folder 2>/dev/null | cut -f1) + path_used_p=$(( $path_used_s * 100 / $part_size )) + path_free_p=$(( 100 - $path_used_p )) +} + +function generateLog() { + dd if=/dev/urandom of="$cur_fullPathName" $log_size status=none + touch -t $log_timestamp $cur_fullPathName +} + +function printStatus() { + local format="| %-10s | %-50s | Used:%5s | Total Used:%5s |\n" + local message="" + if (( cur_doGenerate == 0 )); then + message=" ~ $log_type log generation stoped [CTRL+C to exit] ~ " + else + message=$cur_fullPathName + fi + + if (( $PRINTF_SAME_LINE == 1 )); then + format="\r| %-10s | %-50s | Used:%5s | Total Used:%5s |" + fi + + printf "$format" \ + "$cur_counter" "$message" "$path_used_p%" "$part_used_p" +} + +function setTimestamp() { + log_timestamp="$cur_YY$cur_MM$cur_DD$cur_hour$cur_minute" +} + +function setFullPathName() { + local extra="" + if (( $cur_counter % 2 == 0 )); then + extra="$log_extension_extra" + fi + cur_fullName="$cur_YY-$cur_MM-$cur_DD.$log_extension$extra" + cur_fullPathName="$log_partition/$log_folder/$cur_fullName" +} + +function generate() { + + getPartitionSize + + while true; do + getSpacePercents + + if (( $cur_doGenerate == 1 )); then + if (( $part_free_p < $logs_free_p ));then + cur_doGenerate=0 + echo + fi + fi + + if (( $cur_doGenerate == 0 )); then + printStatus + else + cur_counter=$(( cur_counter + 1 )) + incDate + setTimestamp + setFullPathName + generateLog + printStatus + fi + done + echo "Done total files added $cur_counter" +} + +function main() { + checkParams "$@" + generate "$@" +} + +# start the script +main "$@" +