summaryrefslogtreecommitdiffstats
path: root/logd/src/apps/retention/retention-enforcer.sh
blob: de95cfb8f7edbe122a4ea0bd1f3d76e872bfffd5 (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
116
117
118
119
120
121
122
123
124
125
126
#!/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
}

bad_timestamp() {
	now=$(date +%s)
	if [ "$1" ] && [ "$1" -ge 1514764800 ] && [ "$1" -le $now ]; then
		# sane timestamp:
		return 1
	fi
	# bad timestamp:
	return 0
}

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() {
	timestamp=$1
	logfilename=$2

	if bad_timestamp "$1"; then
		echo "WARNING: bad timestamp '$timestamp' for logfilename '$logfilename'"
		return
	fi

	add=$((86400 * $RETAIN_DAYS))
	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
}

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

process_file() {
	dbfile="$1"
	now=$(date +%s)
	found=0
	while read timestamp logfilename; do
		for fn in $logfilename $logfilename.*z*; do
			if [ -f "$fn" ]; then
				found=1
				maybe_collect "$timestamp" "$fn"
			fi
		done
	done < $dbfile
	if [ $found = 0 ]; then
		ts=${dbfile##*.}00000
		maybe_collect "$ts" "$dbfile"
	fi
}

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

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

prepare_stuff
mainloop
exit 0