summaryrefslogtreecommitdiffstats
path: root/logd/src/apps/retention/retention-enforcer.sh
blob: 8c8f56a7fea179d723a7b87ad79b212a911cc31b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/sh

DBGF=logs/vespa/debug.retention-enforcer
DBDIR=var/db/vespa/logfiledb
PIDF=$DBDIR/retention-enforcer.pid
RETAIN_DAYS=31

prereq_dir() {
	if [ -d $1 ] && [ -w $1 ]; then
		:
	else
		echo "$0: missing directory '$1' in '`pwd`'" >&2
		exit 1
	fi
}

check_prereqs() {
	prereq_dir var/db/vespa
	prereq_dir logs/vespa
}

ensure_dir () {
	if [ -d $1 ] && [ -w $1 ]; then
		return 0
	fi
	echo "Creating directory '$1' in '`pwd`'"
	mkdir -p $1 || exit 1
}

prepare_stuff() {
	check_prereqs
	exec > $DBGF.$$.log 2>&1
	ensure_dir $DBDIR
}

mark_pid() {
	echo $$ > $PIDF.$$.tmp
	mv $PIDF.$$.tmp $PIDF || exit 1
}

check_pidfile() {
	read pid < $PIDF
	[ "$pid" = $$ ] && return 0
	if [ "$pid" ] && [ $pid -gt $$ ]; then
		sleep 30
		read pid_again < $PIDF
		if [ "$pid_again" != "$pid" ]; then return 1; fi
		ps -p $pid >/dev/null 2>&1 || return 1
		proc=$(ps -p $pid 2>&1)
		case $proc in *retention*) ;; *) return 1;; esac
		echo "$0 [$$]: Yielding my place to pid '$pid'"
		exit 1
	fi
}

maybe_collect() {
	now=$(date +%s)
	chopnow=${now%?????}
	ts=${1##*/*.}
	[ "$ts" ] || return 1
	[ "$ts" -gt 0 ] || return 1
	add=$((3 * $RETAIN_DAYS))
	lim1=$(($ts + $add))
	mod_time=$(get_mode_time "$1")
	add=$((3 * 86400 * $RETAIN_DAYS))
	lim2=$(($mod_time + $add))
	if [ $lim1 -lt $chopnow ] && [ $lim2 -lt $now ]; then
		echo "Collect meta-logfile '$1' ts '$ts' (lim $lim, now $chopnow)"
		rm -f "$1"
	fi
}

get_mod_time() {
	perl -e 'print (((stat("'"$1"'"))[9]) . "\n")'
}

process_file() {
	now=$(date +%s)
	add=$((86400 * $RETAIN_DAYS))
	found=0
	while read timestamp logfilename; do
		if [ -f "$logfilename" ]; then
			found=1
			lim1=$(($timestamp + $add))
			mod_time=$(get_mod_time "$logfilename")
			lim2=$((mod_time + $add))
			if [ $lim1 -lt $now ] && [ $lim2 -lt $now ]; then
				echo "Collect logfile '$logfilename' timestamped $timestamp modified $mod_time"
				rm -f "$logfilename"
			fi
		fi
	done < $1
	if [ $found = 0 ]; then
		maybe_collect $1
	fi
}

process_all() {
	for dbf in $DBDIR/logfiles.* ; do
		[ -f "$dbf" ] && process_file "$dbf"
	done
}

mainloop() {
	while true; do
		mark_pid
		process_all
		sleep 3600
		check_pidfile
	done
}

prepare_stuff
mainloop
exit 0