#!/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="-%" OPT_CRLF="-r" 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=80 # ---------- 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 " $OPT_CRLF the optional option to print each status on next line" echo echo "Usage example" printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_LOG" "[-y2000]" "[-%85] [-r]" printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_ERR" "[-y2000]" "[-%85] [-r]" printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_CLD" "[-y2000]" "[-%85] [-r]" printf "$format" "$0" "$OPT_TYPE$LOG_TYPE_NAME_TXR" "[-y2000]" "[-%30] [-r]" 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_CRLF) PRINTF_SAME_LINE=0 ;; $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 | tail -n 1 | 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 stopped [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 "$@"