13 changed files with 21 additions and 3573 deletions
@ -1,521 +0,0 @@ |
|||||
#!/bin/sh |
|
||||
|
|
||||
# Auto-Record-Cleaner (aurecl) - automatically remove old recorded events |
|
||||
|
|
||||
# Copyright (C) 2014 LtCmdrLuke |
|
||||
# |
|
||||
# This program is free software; you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU General Public License as published by |
|
||||
# the Free Software Foundation; either version 2 of the License, or |
|
||||
# (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program; if not, write to the Free Software |
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA |
|
||||
|
|
||||
|
|
||||
# This is a test-script for automatically handling the oldest records in a |
|
||||
# specified directory after the directory has reached a certain size. Files |
|
||||
# which will be deleted next are first moved to a "last-chance" directory |
|
||||
# before they are finally deleted. In each run, only as much files will be |
|
||||
# really deleted as needed to limit the maximum allowed size of the directory. |
|
||||
|
|
||||
# The main intention of this script is its usage in conjunction with the |
|
||||
# "channel-crawling"-feature of the Auto-Timer on a neutrino-based set top box. |
|
||||
# Basic idea: |
|
||||
# Record every event of certain channels and delete always the |
|
||||
# oldest recordings in the record directory, but give the user a chance |
|
||||
# to see what is about to be deleted next. By running this script regularly |
|
||||
# you can keep always the latest x days of all events from a certain channel |
|
||||
# available for watching anytime, i.e. fully independent of broadcasting |
|
||||
# times. (It basically resembles 'Sky Anytime') |
|
||||
|
|
||||
# Install & usage: |
|
||||
# - Copy the script somewhere on your box and make it executable |
|
||||
# - Edit the following variables to correspond to your environment, e.g. |
|
||||
# which directory should be watched and how much space you want to give it |
|
||||
# - call it regularly, either manually, or in some automated way. When calling |
|
||||
# it, provide the command line option "--yes" to confirm, you really want |
|
||||
# files to be deleted. Without this command line option, it will perform a |
|
||||
# dry run, i.e. just tell you what it would do now. |
|
||||
|
|
||||
# Related files: |
|
||||
# General Configuration: /var/tuxbox/config/auto-record-cleaner.conf |
|
||||
# Controlled directories: /var/tuxbox/config/auto-record-cleaner.rules |
|
||||
|
|
||||
VERSION=0.2 |
|
||||
|
|
||||
# Changelog: |
|
||||
# |
|
||||
# 0.2 |
|
||||
# - Added new command line options: |
|
||||
# -y|--yes twice to deactivate the 5s safety |
|
||||
# -q|--quiet deactivate all console output (and also deactivate the 5s safety) |
|
||||
# -h|--help shows the command line options |
|
||||
# - Logs now to a logfile (besides the console, if not deactivated with -q) |
|
||||
# - Now uses own configuration file under /var/tuxbox/config/auto-record-cleaner.conf |
|
||||
# * Here the default path for the log-file and the rule-file can be changed |
|
||||
# * Provided a template file (auto-record-cleaner.conf.template); default values should be fine. |
|
||||
# - Now uses own rules file under /var/tuxbox/config/auto-record-cleaner.rules |
|
||||
# * An arbitrary number of different directories can now be cleaned |
|
||||
# * Provided a template (auto-record-cleaner.rules.template) with examples |
|
||||
# * Basic Syntax is CLEANING_PATH,MAX_SIZE_CP;LAST_CHANCE_PATH,MAX_SIZE_LCP |
|
||||
# |
|
||||
# 0.1 |
|
||||
# - Initial release |
|
||||
# - Restrictions: |
|
||||
# * only one controlled directory |
|
||||
# * Configuration directly in the script |
|
||||
# * Shell-only, no information in neutrino |
|
||||
# * No log-file, logs to stdout |
|
||||
|
|
||||
# Beyond this point, no user-configurable settings |
|
||||
############################################################################### |
|
||||
|
|
||||
NAME="Auto-Record-Cleaner" |
|
||||
ME=${0##*/} |
|
||||
|
|
||||
CONFIG_FILE=/var/tuxbox/config/$ME.conf |
|
||||
PID_FILE=/var/run/$ME.pid |
|
||||
|
|
||||
EXIT_NORMAL=0 |
|
||||
EXIT_SIGNAL=1 |
|
||||
EXIT_NO_RULE_FILE=2 |
|
||||
EXIT_ALREADY_RUNNING=3 |
|
||||
EXIT_UNKNOWN_COMMAND_OPTION=4 |
|
||||
|
|
||||
####################################################################################### |
|
||||
#BEGIN SECTION "Helper functions" |
|
||||
|
|
||||
signal_handler() { |
|
||||
#Handle INT, TERM signals and clean up. |
|
||||
log "Caught signal. Cleaning up." |
|
||||
cleanup |
|
||||
set +f |
|
||||
log "done." |
|
||||
log "$ME V${VERSION} exiting now." |
|
||||
exit $EXIT_SIGNAL |
|
||||
} |
|
||||
|
|
||||
cleanup() { |
|
||||
# Remove the pid-file |
|
||||
rm -rf $PID_FILE 2>/dev/null |
|
||||
} |
|
||||
|
|
||||
log() { |
|
||||
#Log message to log file |
|
||||
#$*: Log message |
|
||||
if [ "$LOG_FILE" != "" ]; then |
|
||||
echo -e $(date +'%F %H:%M:%S') [$$]: "$*" >> $LOG_FILE |
|
||||
fi |
|
||||
if [ $quiet == 0 ]; then |
|
||||
echo -e "$*" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
begin_ifs_block() { |
|
||||
#Backup IFS (input field separator) to restore it after parsing arguments |
|
||||
IFS_SAVE=$IFS |
|
||||
set -f |
|
||||
} |
|
||||
|
|
||||
end_ifs_block() { |
|
||||
#Restore (input field separator) IFS after parsing arguments |
|
||||
IFS=$IFS_SAVE |
|
||||
set +f |
|
||||
} |
|
||||
|
|
||||
#END SECTION "Helper functions" |
|
||||
####################################################################################### |
|
||||
|
|
||||
####################################################################################### |
|
||||
#BEGIN SECTION "Initialization" |
|
||||
|
|
||||
init_config() { |
|
||||
#Parse config file (default: /var/tuxbox/config/auto-record-cleaner.conf) |
|
||||
if [ -e $CONFIG_FILE ]; then |
|
||||
source $CONFIG_FILE 2>/dev/null |
|
||||
fi |
|
||||
|
|
||||
# Initialize the logfile first, so we can write to it... |
|
||||
if [ ! -d "${LOG_FILE%/*}" ]; then |
|
||||
case $LOG_FILE in |
|
||||
[oO][fF][fF]) |
|
||||
LOG_FILE='' |
|
||||
;; |
|
||||
*) |
|
||||
LOG_FILE=/tmp/${ME}_$(date +'%F').log |
|
||||
;; |
|
||||
esac |
|
||||
fi |
|
||||
echo -e "\n\n========================== $NAME started new log at $(date) ======================================" >> $LOG_FILE |
|
||||
|
|
||||
# Check other settings and reset them to default if unset or invalid |
|
||||
if [ ! -e "$RULE_FILE" ]; then |
|
||||
RULE_FILE=/var/tuxbox/config/$ME.rules |
|
||||
if [ ! -e "$RULE_FILE" ]; then |
|
||||
log "ERROR: Rules file '$RULE_FILE' does not exist! Exiting." |
|
||||
exit $EXIT_NO_RULE_FILE |
|
||||
fi |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
#END SECTION "Initialization" |
|
||||
####################################################################################### |
|
||||
|
|
||||
####################################################################################### |
|
||||
#BEGIN SECTION "Command line options handling" |
|
||||
|
|
||||
parse_options() { |
|
||||
#Parse auto-record-cleaner command line arguments |
|
||||
local option |
|
||||
|
|
||||
while [ $# -gt 0 ] |
|
||||
do |
|
||||
option=$1 |
|
||||
shift |
|
||||
|
|
||||
case "$option" in |
|
||||
-y|--yes) |
|
||||
dry_run=$((dry_run-1)) |
|
||||
;; |
|
||||
-q|--quiet) |
|
||||
quiet=1 |
|
||||
;; |
|
||||
-h|--help) |
|
||||
usage |
|
||||
exit $EXIT_NORMAL |
|
||||
;; |
|
||||
*) |
|
||||
echo "Unknown command line option '$option'. What did you want to do? Exiting!" |
|
||||
usage |
|
||||
exit $EXIT_UNKNOWN_COMMAND_OPTION |
|
||||
;; |
|
||||
esac |
|
||||
done |
|
||||
} |
|
||||
|
|
||||
usage() { |
|
||||
# Print short usage message on console |
|
||||
echo -e "Usage: $ME [options]" |
|
||||
echo -e "Valid options are:" |
|
||||
echo -e "\t-y|--yes\t\tSwitches safety off and really deletes/moves files. Use twice to deactivate 5s safety interval." |
|
||||
echo -e "\t-q|--quiet\t\tDeactivates all output on console. Also deactivates 5s safety interval." |
|
||||
echo -e "\t-h|--help\t\tPrint this help and exit." |
|
||||
} |
|
||||
|
|
||||
#END SECTION "Command line options handling" |
|
||||
####################################################################################### |
|
||||
|
|
||||
####################################################################################### |
|
||||
#BEGIN SECTION "Work functions" |
|
||||
|
|
||||
limit_directory() { |
|
||||
# Moves or deletes oldest files in a given directory |
|
||||
# Parameters: |
|
||||
# $1: The directory from which the files should be moved/deleted |
|
||||
# $2: the maximum size of the directory in kB |
|
||||
# $3: optional: the directory into which files should be moved. If this |
|
||||
# parameter is missing, files will be deleted |
|
||||
# Precondition: All provided directories must exist. |
|
||||
|
|
||||
local dir max_dir_size dir_size dest_dir over_limit ts_files ts |
|
||||
|
|
||||
dir="$1" |
|
||||
max_dir_size="$2" |
|
||||
dir_size=$(du -s -k "$dir" | cut -f1) |
|
||||
dest_dir="$3" |
|
||||
|
|
||||
# in case there is a destination folder given, we need to get its size |
|
||||
# and subtract this from the current dir size |
|
||||
if [ -n "$dest_dir" ]; then |
|
||||
dest_dir_size=$(du -s -k "$dest_dir" | cut -f1) |
|
||||
dir_size=$((dir_size-dest_dir_size)) |
|
||||
log "\t\t\tLimiting '$dir' to max size $((max_dir_size/(1024*1024)))GB by moving the oldest files to '$dest_dir' ... " |
|
||||
else |
|
||||
log "\t\t\tLimiting '$dir' to max size $((max_dir_size/(1024*1024)))GB by deleting the oldest files ..." |
|
||||
fi |
|
||||
|
|
||||
if [ $dir_size -gt $max_dir_size ]; then |
|
||||
over_limit=$((dir_size-max_dir_size)) |
|
||||
if [ -z "$dest_dir" ]; then |
|
||||
log "\t\t\t\tWe need to delete $((over_limit/(1024*1024)))GB (${over_limit}kB) from '$dir' ..." |
|
||||
else |
|
||||
log "\t\t\t\tWe need to move $((over_limit/(1024*1024)))GB (${over_limit}kB) from '$dir' to '$dest_dir' ..." |
|
||||
fi |
|
||||
else |
|
||||
log "\t\t\t\tNothing to do in directory '$dir'. Current size has not reached the limit." |
|
||||
return 0 |
|
||||
fi |
|
||||
|
|
||||
# we don't want to use the ls command since its output is not POSIX-standard |
|
||||
# therefore, we first find all files and then we use the date command to |
|
||||
# determine the modification time |
|
||||
|
|
||||
# first collect all *.ts files |
|
||||
ts_files=$(find "$dir" -name "*.ts") |
|
||||
|
|
||||
# now gather additional information, like modification time and size |
|
||||
# (we could have got this info from ls in ONE call..) |
|
||||
begin_ifs_block |
|
||||
IFS=$'\n' |
|
||||
for ts in $ts_files; do |
|
||||
ts_date=$(date -r "$ts" +%s) |
|
||||
ts_size=$(du -k "$ts" | cut -f1) |
|
||||
ts_files_ext="${ts_files_ext}${ts}|$ts_date|$ts_size\n" |
|
||||
#echo "$ts|$ts_date|$ts_size" |
|
||||
done |
|
||||
end_ifs_block |
|
||||
|
|
||||
# sort the final list with respect to the modification time |
|
||||
sorted_ts_files_ext=$(echo -ne "$ts_files_ext" | sort -t '|' -k2) |
|
||||
|
|
||||
count=0 |
|
||||
# now (re)move until limit is reached |
|
||||
begin_ifs_block |
|
||||
IFS=$'\n' |
|
||||
for ts_file in $sorted_ts_files_ext; do |
|
||||
IFS='|' |
|
||||
set -- $ts_file |
|
||||
filename=$1 |
|
||||
filetime=$2 |
|
||||
filesize=$3 |
|
||||
|
|
||||
# skip the file, if it is already in dest_dir |
|
||||
if [ "${filename%/*}" == "$dest_dir" ]; then |
|
||||
#echo -e "\tSkipping $filename .." |
|
||||
continue |
|
||||
fi |
|
||||
|
|
||||
xml_file=${filename%".ts"}".xml" |
|
||||
|
|
||||
if [ $dry_run == 0 ]; then |
|
||||
if [ -z "$dest_dir" ]; then |
|
||||
log "\t\t\t\tDeleting now '$filename' (${filesize}kB).." |
|
||||
rm "$filename" 2>/dev/null |
|
||||
if [ -f "$xml_file" ];then |
|
||||
log "\t\t\t\tDeleting now also the corresponding '$xml_file' ... " |
|
||||
rm "$xml_file" 2>/dev/null |
|
||||
fi |
|
||||
else |
|
||||
log "\t\t\t\tMoving '$filename' (${filesize}kB) to '$dest_dir' ..." |
|
||||
mv "$filename" "$dest_dir" 2>/dev/null |
|
||||
if [ -f "$xml_file" ];then |
|
||||
log "\t\t\t\tMoving now also the corresponding '$xml_file' to '$dest_dir' ... " |
|
||||
mv "$xml_file" "$dest_dir" 2>/dev/null |
|
||||
fi |
|
||||
fi |
|
||||
else |
|
||||
if [ -z "$dest_dir" ]; then |
|
||||
log "\t\t\t\tDRY-RUN: Would remove now '$filename' (${filesize}kB).." |
|
||||
if [ -f "$xml_file" ];then |
|
||||
log "\t\t\t\tDRY-RUN: Would delete now also the corresponding '$xml_file' ... " |
|
||||
fi |
|
||||
else |
|
||||
log "\t\t\t\tDRY-RUN: Would move now '$filename' (${filesize}kB) to '$dest_dir' ..." |
|
||||
if [ -f "$xml_file" ];then |
|
||||
log "\t\t\t\tDRY-RUN: Would move now also the corresponding '$xml_file' to '$dest_dir' ... " |
|
||||
fi |
|
||||
fi |
|
||||
fi |
|
||||
|
|
||||
over_limit=$((over_limit-filesize)) |
|
||||
count=$((count+1)) |
|
||||
|
|
||||
if [ $over_limit -le 0 ]; then |
|
||||
removed=$((dir_size-max_dir_size-over_limit)) |
|
||||
|
|
||||
if [ $dry_run == 0 ]; then |
|
||||
if [ -z "$dest_dir" ]; then |
|
||||
log "\t\t\t\tDone. Removed $((removed/(1024*1024)))GB (${removed}kB) by deleting $count recorded events." |
|
||||
else |
|
||||
log "\t\t\t\tDone. Moved $((removed/(1024*1024)))GB (${removed}kB) in $count recorded events to directory '$dest_dir'." |
|
||||
fi |
|
||||
else |
|
||||
if [ -z "$dest_dir" ]; then |
|
||||
log "\t\t\t\tDRY_RUN: Done. Would have removed $((removed/(1024*1024)))GB (${removed}kB) by deleting $count recorded events." |
|
||||
else |
|
||||
log "\t\t\t\tDRY_RUN: Done. Would have moved $((removed/(1024*1024)))GB (${removed}kB) in $count recorded events to directory '$dest_dir'." |
|
||||
fi |
|
||||
fi |
|
||||
# we are done, so break from the loop |
|
||||
break |
|
||||
fi |
|
||||
done |
|
||||
end_ifs_block |
|
||||
|
|
||||
return 0 |
|
||||
} |
|
||||
|
|
||||
#END SECTION "Work functions" |
|
||||
####################################################################################### |
|
||||
|
|
||||
############################################################################### |
|
||||
#BEGIN Section "Main" |
|
||||
|
|
||||
# initialize some more variables |
|
||||
dry_run=1 |
|
||||
quiet=0 |
|
||||
|
|
||||
# set the signal handler |
|
||||
trap signal_handler INT TERM |
|
||||
|
|
||||
# First initialize the values from the config, otherwise we cannot log anywhere |
|
||||
init_config |
|
||||
|
|
||||
# Now get command line option, as these might override some values from the config or default variables |
|
||||
parse_options $@ |
|
||||
|
|
||||
if [ -e $PID_FILE ]; then |
|
||||
log "$ME ist already running. Exiting..." |
|
||||
exit $EXIT_ALREADY_RUNNING |
|
||||
else |
|
||||
echo $$ > $PID_FILE |
|
||||
fi |
|
||||
|
|
||||
# We happily started.. |
|
||||
log "" |
|
||||
log "$ME V$VERSION initialized and starting main operations." |
|
||||
|
|
||||
if [ $dry_run == 1 ]; then |
|
||||
log "\tThis is a dry run, i.e. no files will be harmed. Use '-y' or '--yes' to deactivate the safety." |
|
||||
elif [ $dry_run == 0 ] && [ $quiet == 0 ]; then |
|
||||
log "\t!!! WARNING!!! This is now the real thing - files WILL BE DELETED. You can still abort within the next 5 seconds. !!! WARNING !!!" |
|
||||
echo "Waiting for 5 more seconds.." |
|
||||
sleep 1 |
|
||||
echo "Waiting for 4 more seconds.." |
|
||||
sleep 1 |
|
||||
echo "Waiting for 3 more seconds.." |
|
||||
sleep 1 |
|
||||
echo "Waiting for 2 more seconds.." |
|
||||
sleep 1 |
|
||||
echo "Waiting for 1 more seconds.." |
|
||||
sleep 1 |
|
||||
echo "You have been warned. Proceeding..." |
|
||||
else |
|
||||
log "\t!!! WARNING!!! $ME is armed and targeting your files. !!! WARNING !!!" |
|
||||
fi |
|
||||
|
|
||||
# now process each directory given in the rule-file |
|
||||
|
|
||||
rule_line=0 |
|
||||
cat $RULE_FILE | while read line; do |
|
||||
rule_line=$((${rule_line}+1)) |
|
||||
if echo $line | egrep -q '^[[:space:]]*([^#;]+),([0-9]+);?([^;]+)?(,[0-9]+)?$'; then |
|
||||
|
|
||||
log "" |
|
||||
log "\tProcessing rule: '$line'" |
|
||||
|
|
||||
# split rule line |
|
||||
begin_ifs_block |
|
||||
IFS=';' |
|
||||
set -- $line |
|
||||
record_part=$1 |
|
||||
last_chance_part=$2 |
|
||||
end_ifs_block |
|
||||
|
|
||||
# split record_part |
|
||||
begin_ifs_block |
|
||||
IFS=',' |
|
||||
set -- $record_part |
|
||||
record_dir=$1 |
|
||||
record_dir_size=$2 |
|
||||
end_ifs_block |
|
||||
|
|
||||
if [ -n "$last_chance_part" ]; then |
|
||||
# split last_chance_part |
|
||||
begin_ifs_block |
|
||||
IFS=',' |
|
||||
set -- $last_chance_part |
|
||||
last_chance_dir=$1 |
|
||||
last_chance_dir_size=$2 |
|
||||
end_ifs_block |
|
||||
if [ -z $last_chance_dir_size ]; then |
|
||||
last_chance_dir_size=$((record_dir_size / 10)) |
|
||||
fi |
|
||||
else |
|
||||
last_chance_dir="last_chance" |
|
||||
last_chance_dir_size=$((record_dir_size / 10)) |
|
||||
fi |
|
||||
|
|
||||
# convert GB into kB |
|
||||
record_dir_size_k=$((record_dir_size * 1024 * 1024)) |
|
||||
last_chance_dir_size_k=$((last_chance_dir_size * 1024 * 1024)) |
|
||||
|
|
||||
# print the collected information to the log: |
|
||||
log "\t\tCleaning path: '$record_dir', Maximum size: ${record_dir_size}GB (${record_dir_size_k}kB)" |
|
||||
log "\t\tLast chance subdirectory: '$last_chance_dir', Maximum size: ${last_chance_dir_size}GB (${last_chance_dir_size_k}kB)" |
|
||||
|
|
||||
# now check if directories exist |
|
||||
# if the cleaning directory does not exist, print an error and continue with next rule |
|
||||
if [ ! -d "$record_dir" ]; then |
|
||||
log "\t\tThe given directory '$record_dir' does not exist. Create it or correct this rule. Skipping this rule." |
|
||||
continue |
|
||||
fi |
|
||||
|
|
||||
#convert the last_chance relative path to an absolut one |
|
||||
last_chance_dir="${record_dir%/}/$last_chance_dir" |
|
||||
|
|
||||
# if the last chance directory does not exist yet, create it. |
|
||||
if [ ! -d "$last_chance_dir" ]; then |
|
||||
|
|
||||
if [ $dry_run == 0 ]; then |
|
||||
log "\t\tCreating directory '$last_chance_dir' for last chance files, as it does not exist yet." |
|
||||
mkdir "$last_chance_dir" |
|
||||
else |
|
||||
log "\t\tWould now create directory '$last_chance_dir' for last chance files, as it does not exist yet. (dry-run, i.e. NOT performing any action)" |
|
||||
fi |
|
||||
fi |
|
||||
|
|
||||
# get the current size of the directories (in kB)... |
|
||||
current_record_dir_usage_k=$(du -s -k "$record_dir" | cut -f1) |
|
||||
current_last_chance_dir_size_k=$(du -s -k "$last_chance_dir" | cut -f1) |
|
||||
|
|
||||
# ... and print them into the log |
|
||||
log "\t\tCurrent full size of '$record_dir' (recursively) is $((current_record_dir_usage_k/(1024*1024)))GB (${current_record_dir_usage_k}kB)." |
|
||||
log "\t\tCurrent size of '$last_chance_dir' is $((current_last_chance_dir_size_k/(1024*1024)))GB (${current_last_chance_dir_size_k}kB)." |
|
||||
|
|
||||
# perform some initial checks, if we actually need to do something |
|
||||
if [ $((current_record_dir_usage_k-current_last_chance_dir_size_k)) -le $((record_dir_size_k-last_chance_dir_size_k)) ] && [ $current_last_chance_dir_size_k -le $last_chance_dir_size_k ] ;then |
|
||||
log "\t\tNothing to do for this rule - disk usage is within the given specification." |
|
||||
continue |
|
||||
fi |
|
||||
|
|
||||
over_limit=0 |
|
||||
if [ $current_record_dir_usage_k -gt $record_dir_size_k ];then |
|
||||
over_limit=$((current_record_dir_usage_k-record_dir_size_k)) |
|
||||
log "\t\tWe need to remove $((over_limit/(1024*1024)))GB (${over_limit}kB) from directory '$record_dir'." |
|
||||
fi |
|
||||
|
|
||||
if [ $((current_record_dir_usage_k-current_last_chance_dir_size_k-over_limit)) -gt $((record_dir_size_k-last_chance_dir_size_k)) ];then |
|
||||
move_size=$((current_record_dir_usage_k-current_last_chance_dir_size_k-over_limit-(record_dir_size_k-last_chance_dir_size_k))) |
|
||||
log "\t\tWe need to move $((move_size/(1024*1024)))GB (${move_size}kB) from directory '$record_dir' to '$last_chance_dir'." |
|
||||
fi |
|
||||
|
|
||||
# first we delete the oldest files from the main directory (including last chance) |
|
||||
# if your last_chance is too small, some files will never appear in there |
|
||||
limit_directory "$record_dir" "$record_dir_size_k" |
|
||||
|
|
||||
# now fill the last chance directory |
|
||||
limit_directory "$record_dir" "$((record_dir_size_k-last_chance_dir_size_k))" "$last_chance_dir" |
|
||||
|
|
||||
# final status |
|
||||
new_record_dir_usage_k=$(du -s -k "$record_dir" | cut -f1) |
|
||||
new_last_chance_dir_size_k=$(du -s -k "$last_chance_dir" | cut -f1) |
|
||||
|
|
||||
log "\t\tNew full size of '$record_dir' (recursively) is $((new_record_dir_usage_k/(1024*1024)))GB (${new_record_dir_usage_k}kB)." |
|
||||
log "\t\tNew size of '$last_chance_dir' is $((new_last_chance_dir_size_k/(1024*1024)))GB (${new_last_chance_dir_size_k}kB)." |
|
||||
fi |
|
||||
done |
|
||||
|
|
||||
log "" |
|
||||
log "$ME V${VERSION} finished rule processing." |
|
||||
|
|
||||
cleanup |
|
||||
log "========================== $NAME finished at $(date) ======================================" |
|
||||
exit $EXIT_NORMAL; |
|
@ -1,9 +0,0 @@ |
|||||
# General configuration for the auto-record-cleaner |
|
||||
|
|
||||
# Activate the following to change the default path of the rule file |
|
||||
#RULE_FILE=/var/tuxbox/config/$ME.rules |
|
||||
|
|
||||
# Deactivate the logfile (default is ON) |
|
||||
#LOG_FILE=off |
|
||||
# Activate the following to change the default location of the log-file |
|
||||
#LOG_FILE=/tmp/${ME}_$(date +'%F').log |
|
@ -1,47 +0,0 @@ |
|||||
# auto-record-cleaner.rules |
|
||||
# |
|
||||
# ---------------------------------------------------------------------------- |
|
||||
# |
|
||||
# Syntax: CLEANING_PATH,MAX_SIZE_CP;LAST_CHANCE_PATH,MAX_SIZE_LCP |
|
||||
# |
|
||||
# CLEANING_PATH The path which should be cleaned |
|
||||
# Example: /media/sda1/movies |
|
||||
# The argument is mandatory. |
|
||||
# |
|
||||
# MAX_SIZE_CP The maximum size of the CLEANING_PATH given in GB |
|
||||
# When the size grows beyond this value, the oldest files will be deleted |
|
||||
# Example: 450 |
|
||||
# The argument is mandatory. |
|
||||
# |
|
||||
# LAST_CHANCE_PATH The name of the directory, which should be created for files |
|
||||
# which will be deleted soon. |
|
||||
# Example: last_chance |
|
||||
# The argument is optional, if not given "last_chance" is used. |
|
||||
# |
|
||||
# MAX_SIZE_LCP The maximum size of the LAST_CHANCE_PATH given in GB |
|
||||
# Example: 50 |
|
||||
# The argument is optional, if not given 10% of MAX_SIZE_CP is used |
|
||||
# |
|
||||
|
|
||||
## Examples (remove leading # to activate): |
|
||||
|
|
||||
## Keep at most 500 GB of recorded files in /media/sda1/movies/sky |
|
||||
## The size is calculated recursive incl. the last_chance directory |
|
||||
## that is, the oldest 50 GB are in the directory last_chance |
|
||||
#/media/sda1/movies/sky,500;last_chance,50 |
|
||||
|
|
||||
## Equivalent to the above rule |
|
||||
#/media/sda1/movies/sky,500 |
|
||||
|
|
||||
## Keep at most 1TB of recorded files in /mnt/autofs/record/sky/ |
|
||||
#/mnt/autofs/record/sky,1000 |
|
||||
|
|
||||
## Like above but only keep 50 GB (instead of 100). |
|
||||
## Use the directory 'soon_deleted' |
|
||||
#/mnt/autofs/record/sky/,1000;soon_deleted,50 |
|
||||
|
|
||||
## Like above but the default 100 GB in |
|
||||
## the custom directory 'oldest' |
|
||||
#/mnt/autofs/record/sky/,1000;oldest |
|
||||
|
|
||||
# Don't forget the newline after the last entry. |
|
File diff suppressed because it is too large
@ -1,7 +0,0 @@ |
|||||
type=3 |
|
||||
name=Auto-Timer |
|
||||
desc=Automatisches Anlegen von Rec/Zap-Timern |
|
||||
needfb=1 |
|
||||
needlcd=0 |
|
||||
needrc=1 |
|
||||
needoffsets=1 |
|
@ -1,96 +0,0 @@ |
|||||
# activate the following setting to record all new movies from SKY Cinema |
|
||||
#SKY_CINEMA="HD" |
|
||||
# or |
|
||||
#SKY_CINEMA="SD;Weekend,18:00-00:00;/mnt/rec/sky_cinema" |
|
||||
|
|
||||
# The maximum time an EPG might "move" to still be considered the same event |
|
||||
MAX_DIFF_MINS=10 |
|
||||
|
|
||||
# How many tuners are available in this box (or how many are you willing to use with the autotimer?) |
|
||||
# Notes: |
|
||||
# * Setting this to more than available might break some recordings if more timers are set in a timespan, than real tuners are available |
|
||||
# * If something is to be recorded, but there are already timers blocking this time span, the new timer will not be added. |
|
||||
# Hence, make sure, that the more important shows are listed earlier in the rules-file. |
|
||||
MAX_TUNERS=2 |
|
||||
|
|
||||
# How many parallel recordings are allowed. The default ist 8, which is also the maximum the CS supports. |
|
||||
# In case your box is to slow, or you experience some problems when there are many parallel recordings, try reducing this number. |
|
||||
# Note: This is different from MAX_TUNERS, since multiple recordings on the same transponder require only a single tuner. |
|
||||
MAX_RECORDS=8 |
|
||||
|
|
||||
# Automatically generate/update the show history file. |
|
||||
# When this is set to 1, pr-auto-timer will collect all recorded shows from all paths given in MYRECORDPATHS and update the show history file. |
|
||||
# More precisely, it will search through these paths for *.xml files from recordings and extract from there the information necessary |
|
||||
# to detect if the same show was already recorded at some other time. Note that already existing entries in $ME.show_history will *not* be removed. |
|
||||
# Therefore, you can delete some recordings or add manually shows to this file and they will be kept until you delete them manually or you delete the entire file. |
|
||||
# With a big collection of recordings it might take some time, when pr-auto-timer first generates this (on the first occurrence of a rule with the D-flag) |
|
||||
# This time can be avoided by setting the following setting to 0 and calling pr-auto-timer with the command line option "--gen_show_history" before running |
|
||||
# pr-auto-timer without options. Default is 1, i.e. automatically generate this info. |
|
||||
AUTOGEN_SHOW_HISTORY=1 |
|
||||
|
|
||||
# The following setting controls the behavior of pr-auto-timer with respect to records, which went wrong. This only applies if pr-auto-timer automatically |
|
||||
# generates the show history (i.e. AUTOGEN_SHOW_HISTORY=1). Currently only two types of "broken records" can be handled: |
|
||||
# - Only the *.xml-file of some event exist and no *.ts file can be found (this could also be used to manually indicate to pr-auto-timer, that you want a event |
|
||||
# to be recorded again; to do so, simply delete ONLY the *.ts file, and leave the *.xml file intact. |
|
||||
# - The *.ts files exists but it's size is under 2k. This is a common situation, when a record goes wrong - a file of ~1k remains there, but contains nothing. |
|
||||
# Possible options: |
|
||||
# 0: Feature deactivated - no handling of broken records |
|
||||
# 1: Detect broken records and remove them from the history index. Hence, they will be recorded again if encountered. [default] |
|
||||
# 2: Detect and REMOVE broken records. Like 1, but also **DELETE** the broken files (xml and ts) from your disk. (Files will be deleted irreversible.) |
|
||||
BROKEN_RECORD_HANDLING=1 |
|
||||
|
|
||||
# Set the following to activate/deactivate saving information about manually deleted timers |
|
||||
# 0: feature is activated (saves timer info) and manually deleted timers will not be added again |
|
||||
# 1: feature is activated (saves timer info), but manually deleted timers will be added again |
|
||||
# 2: feature is deactivated, i.e. timers will not be stored [default] |
|
||||
DEL_TIMER_REFRESH=2 |
|
||||
|
|
||||
# The maximum number of timers to remember, in order to not set it again after it has been manually deleted |
|
||||
# This setting is only relevant if the above DEL_TIMER_REFRESH is 0 or 1 |
|
||||
MAX_TMR2_COUNT=250 |
|
||||
|
|
||||
# This setting limits the size of your $ME.show_history file. The feature is activated by setting the value to something else than 0, e.g. 1000 [default]. |
|
||||
# pr-auto-timer will then try to remove n entries, so that the maximum entries given in MAX_HISTORY_ENTRIES is not violated. Hereby the oldest |
|
||||
# entries, determined by the timestamp, will be removed. However, only entries, to which no recorded file exists on your disk will be removed. |
|
||||
# A setting of MAX_HISTORY_ENTRIES=0 deactivates the size check. If there are more physically available files, than entries allowed, then MAX_HISTORY_ENTRIES |
|
||||
# will be ignored and a warning is issued in the logfile. |
|
||||
MAX_HISTORY_ENTRIES=1000 |
|
||||
|
|
||||
# What should be done, after pr-auto-timer is done? |
|
||||
#0: Nothing. The box remains in its previous state. [default] |
|
||||
#1: Put the box in standby. |
|
||||
#2: Put the box in DeepStandBy |
|
||||
#3: Power off the box |
|
||||
#4: Reboot the box |
|
||||
END_SHUT_DOWN=0 |
|
||||
|
|
||||
# During which time, the should the above END-action be done? |
|
||||
#0: Do the SHUT_DOWN only from 00:00 to 06:00. [default] |
|
||||
#1: Do the SHUT_DOWN at any time. |
|
||||
SHUT_DOWN_ALSO_DAY=0 |
|
||||
|
|
||||
# Activate the following to execute an arbitrary script/program before starting |
|
||||
# Default is no action |
|
||||
#PRE_ACTION="echo 'Pre-action 1';echo 'Pre-action 2'" |
|
||||
|
|
||||
# Activate the following to execute an arbitrary script/program after finishing but before exiting. |
|
||||
# Default is no action |
|
||||
#POST_ACTION="echo 'Post-action'" |
|
||||
|
|
||||
# Change the following to determine where pr-auto-timer searches for recordings on your disk |
|
||||
# You can provide more than one path and each path will be searched recursively. Use "std::neutrino" to indicate the standard recording |
|
||||
# directory from neutrino. If this is not set or invalid, the standard neutrino recording directory is used. |
|
||||
# Separate multiple paths with a ';', i.e. MYRECORDPATHS="path[;path]... " (Note the quotes!) |
|
||||
MYRECORDPATHS="std::neutrino" |
|
||||
|
|
||||
# Activate the following to change the path of the rule files |
|
||||
#RULE_FILE=/var/tuxbox/config/$ME.rules |
|
||||
#RULE_FILE_EXT=/var/tuxbox/config/$ME.rulex |
|
||||
|
|
||||
# Activate the following to change the default place for the show history |
|
||||
#HISTORY_FILE=/var/tuxbox/config/$ME.show_history |
|
||||
|
|
||||
# Deactivate the logfile (default is ON) |
|
||||
#LOG_FILE=off |
|
||||
# Activate the following to change the default location of the log-file |
|
||||
#LOG_FILE=/tmp/${ME}_$(date +'%F').log |
|
@ -1,117 +0,0 @@ |
|||||
# pr-auto-timer.rules |
|
||||
# |
|
||||
# ---------------------------------------------------------------------------- |
|
||||
# |
|
||||
# Syntax: CHANNELNAME;DAYOFWEEK[,TIMESPAN];REGEX[,MODIFIER][;FLAGS][;RECDIR] |
|
||||
# |
|
||||
# CHANNELNAME The (exact) channelname e.g. "Das Erste HD" or |
|
||||
# a bouquet-nr prefixed with an asterisk e.g. "*1" |
|
||||
# |
|
||||
# DAYOFWEEK The day of week or an asterisk for all days of week e.g. |
|
||||
# "Weekday" or "Mon", "Tue", "Wed", "Thu", "Fri" |
|
||||
# "Weekend" or "Sat", "Sun" |
|
||||
# "*" |
|
||||
# |
|
||||
# TIMESPAN Defines a period in which the timer must start e.g. |
|
||||
# "18:45-20:15" |
|
||||
# "*" an asterisk for all times |
|
||||
# TIMESPAN is optional; default is "*" |
|
||||
# |
|
||||
# REGEX The name of the show as a regular expression e.g. |
|
||||
# "Tatort" |
|
||||
# "*" find all shows; this is only usefull in conjunction with MODIFIER |
|
||||
# NOTE: This regular expression is matched only against the epg title |
|
||||
# |
|
||||
# MODIFIER The modifier can be used to further refine the selection of the show |
|
||||
# by searching the entire description for specified words. |
|
||||
# Format is as follows: [+~!-]RegEx1 RegEx2 ... |
|
||||
# +RegEx1 RegEx2 ...: INCLUDE ALL - All of these regular expressions must match for selecting the show |
|
||||
# ~RegEx1 RegEx2 ...: INCLUDE ONE - One of these regular expressions must match for selecting the show |
|
||||
# !RegEx1 RegEx2 ...: EXCLUDE ALL - All of these regular expressions must match for excluding the show |
|
||||
# -RegEx1 RegEx2 ...: EXCLUDE ONE - One of these regular expressions must match for excluding the show |
|
||||
# MODIFIER is optional; default is no modifier. |
|
||||
# NOTE: When no modifier is given, this regular expression is matched only against the epg title |
|
||||
# |
|
||||
# FLAGS A coma-separated list of the following flags: |
|
||||
# - "R": create a record timer [default] |
|
||||
# - "Z": create a zap timer |
|
||||
# - "I": ignore time additions to timer |
|
||||
# - "F": during one run of pr-auto-timer only the first match will be added as a timer |
|
||||
# - "O": the same as "F" but additionally deactivates the corresponding rule in the rules-file |
|
||||
# - "D": prevent adding duplicate timers for the same show (at different times) |
|
||||
# - "W": Always re-add manually removed timers if the show is found again; overrides the global option DEL_TIMER_REFRESH=0 |
|
||||
# - "M": Allow empty info-fields when using duplicate detection |
|
||||
# FLAGS is optional; default is a record timer. |
|
||||
# |
|
||||
# RECDIR An alternative recording directory |
|
||||
# NOTE: flag-section can be empty, but MUST be defined! See examples below. |
|
||||
# RECDIR is optional; default is the neutrino setting |
|
||||
# |
|
||||
# ---------------------------------------------------------------------------- |
|
||||
# |
|
||||
## Examples (remove leading # to activate): |
|
||||
# |
|
||||
## Record all shows containing the word 'Tatort' |
|
||||
## on channel 'Das Erste HD' on sundays: |
|
||||
#Das Erste HD;Sun;Tatort |
|
||||
|
|
||||
## Record all shows containing the word 'Tagesschau' |
|
||||
## on channel 'Das Erste HD' on all days in a timespan between 11:55 and 12:05: |
|
||||
#Das Erste HD;*,11:55-12:05;Tagesschau |
|
||||
|
|
||||
## Record all shows containing the word 'Knollenblätterpilz' |
|
||||
## on channel 'Das Erste HD': |
|
||||
#Das Erste HD;*;Knollenblätterpilz |
|
||||
|
|
||||
## Record all shows containing the sentence 'Rumpsteak schmeckt lecker' |
|
||||
## on all channels of bouquet 1: |
|
||||
#*1;*;Rumpsteak schmeckt lecker |
|
||||
|
|
||||
## Zap to all shows containing the word 'Affenhaus' |
|
||||
## on channel 'Das Erste HD': |
|
||||
#Das Erste HD;*;Affenhaus;Z |
|
||||
|
|
||||
## Record first show found containing the word 'Tatort' |
|
||||
## on channel 'Das Erste HD' on sundays: |
|
||||
#Das Erste HD;Sun;Tatort;F |
|
||||
|
|
||||
## Record first show found containing the word 'Tatort' |
|
||||
## on channel 'Das Erste HD' on sundays. |
|
||||
## After creating timer the rule-line will be deactivated: |
|
||||
#Das Erste HD;Sun;Tatort;O |
|
||||
|
|
||||
## Record all shows containing the word 'Tatort' |
|
||||
## on channel 'Das Erste HD' on weekends. |
|
||||
## Using '/media/records/tatort' as recording directory |
|
||||
#Das Erste HD;Weekend;Tatort;R;/media/records/tatort |
|
||||
## or with empty FLAGS section |
|
||||
#Das Erste HD;Weekend;Tatort;;/media/records/tatort |
|
||||
|
|
||||
## You don't need the special episodes of LOST, |
|
||||
## if you plan to view this great series in one run. ;) |
|
||||
#FOX HD;*;LOST,!Special |
|
||||
|
|
||||
## Records all Episodes of Traumschiff but not these ones: |
|
||||
## Oman Bali Malaysia Vegas Savannah Panama Singapur Bintan Perth Spezial |
|
||||
#ZDF;*,00:00-18:15;Traumschiff,-Oman Bali Malaysia Vegas Savannah Panama Singapur Bintan Perth Spezial |
|
||||
|
|
||||
## Records only Episodes of Traumschiff: |
|
||||
## Oman Bali Malaysia Vegas Savannah Panama Singapur Bintan Perth Spezial |
|
||||
#ZDF;*,00:00-18:15;Traumschiff,~Oman Bali Malaysia Vegas Savannah Panama Singapur Bintan Perth Spezial |
|
||||
|
|
||||
## Record only Episode "Mord mit der linken Hand" from Columbo once on any channel |
|
||||
#*;*;Columbo,+Mord mit der linken Hand;O |
|
||||
|
|
||||
## Record all episodes of "Unser Kosmos: Die Reise geht weiter" from NatGeo HD |
|
||||
## Avoid recording repetitions of the same episode. |
|
||||
#NatGeo HD;*;Unser Kosmos;D |
|
||||
|
|
||||
## Record all episodes from "The Big Bang Theory" for Season 7 |
|
||||
## The regular expression excludes all episodes with the string "x. Staffel", where x=1..6. |
|
||||
#TNT Serie HD;*;The Big Bang Theory,![123456]\\.[[:blank:]]Staffel;D |
|
||||
|
|
||||
## Record all episodes from The Walking Dead's season 5 |
|
||||
## The regular expression includes only episodes where the string "5. Staffel" was found in the description |
|
||||
#Fox HD;*;Walking Dead,+5\\.[[:blank:]]Staffel;D |
|
||||
|
|
||||
# Don't forget the newline after the last entry. |
|
@ -1,2 +0,0 @@ |
|||||
#!/bin/sh |
|
||||
/lib/tuxbox/plugins/pr-auto-timer --menu |
|
Before Width: | Height: | Size: 628 B |
@ -1,26 +0,0 @@ |
|||||
#!/bin/sh |
|
||||
|
|
||||
CP=/bin/cp |
|
||||
WGET=/bin/wget |
|
||||
RM=/bin/rm |
|
||||
|
|
||||
if [ ! -e /var/tuxbox/config/pr-auto-timer.conf ]; then |
|
||||
$CP /var/tuxbox/config/pr-auto-timer.conf.template /var/tuxbox/config/pr-auto-timer.conf |
|
||||
fi |
|
||||
|
|
||||
if [ ! -e /var/tuxbox/config/pr-auto-timer.rules ]; then |
|
||||
$CP /var/tuxbox/config/pr-auto-timer.rules.template /var/tuxbox/config/pr-auto-timer.rules |
|
||||
fi |
|
||||
|
|
||||
if [ ! -e /var/tuxbox/config/auto-record-cleaner.conf ]; then |
|
||||
$CP /var/tuxbox/config/auto-record-cleaner.conf.template /var/tuxbox/config/auto-record-cleaner.conf |
|
||||
fi |
|
||||
|
|
||||
if [ ! -e /var/tuxbox/config/auto-record-cleaner.rules ]; then |
|
||||
$CP /var/tuxbox/config/auto-record-cleaner.rules.template /var/tuxbox/config/auto-record-cleaner.rules |
|
||||
fi |
|
||||
|
|
||||
$WGET -q -O - "http://localhost/control/message?popup=Auto-Timer%20installiert." |
|
||||
$WGET -q -O - "http://localhost/control/reloadplugins" |
|
||||
|
|
||||
$RM -f /tmp/pr-auto-timer_*.bin |
|
@ -1 +0,0 @@ |
|||||
#!/bin/sh |
|
Loading…
Reference in new issue