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