summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-statistics/root/etc/init.d/luci_statistics
blob: 20acf70019ed2232c90e00a22714cb359ffb587b (plain)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/bin/sh /etc/rc.common

# run luci_statistics before collectd starts (80) and stop after
# collectd stops (10):
START=79
STOP=11
USE_PROCD=1

BACKUP_DIR="/etc/luci_statistics"
BACKUP_FILE="${BACKUP_DIR}/rrdbackup.tgz"
SYSUPGRADE_BACKUP_FILE="${BACKUP_DIR}/rrdbackup.sysupgrade.tgz"
SYSUPGRADE_BACKUP_TWIN_A="${BACKUP_DIR}/sysupgrade.trustme.txt"
SYSUPGRADE_BACKUP_TWIN_B="${BACKUP_DIR}/sysupgrade.dont.trustme.txt"
EXTRA_COMMANDS="backup sysupgrade_backup"
EXTRA_HELP="\
	backup          Backup current rrd database if configured to do so"
TRACE=0

doing_backups() {
	### Determine if we should do backups/restores
	local rrd_enabled=$(uci -q get luci_statistics.collectd_rrdtool.enable)
	local rrd_backups_enabled=$(uci -q get luci_statistics.collectd_rrdtool.backup)
	rrd_dir=$(uci -q get luci_statistics.collectd_rrdtool.DataDir)

	[ "$rrd_enabled" = "1" \
			 -a "$rrd_backups_enabled" = "1" \
			 -a -n "$rrd_dir" ] && {
		return 0
	}
	return 1
}

service_triggers()
{
	procd_add_reload_trigger "luci_statistics"
}

start_service() {
	### replace shipped config with symlink
	mkdir -p /var/etc
	if [ ! -L /etc/collectd.conf ]; then
		test -f /etc/collectd.conf && mv /etc/collectd.conf /etc/collectd.conf.bak
		ln -s /var/etc/collectd.conf /etc/collectd.conf
	fi

	### create config
	/usr/libexec/stat-genconfig > /var/etc/collectd.conf

	### workaround broken permissions on /tmp
	chmod 1777 /tmp

	### restore if necessary
	rrd_restore

	### stop collectd if it was running before us
	/etc/init.d/collectd status >/dev/null 2>&1 && /etc/init.d/collectd stop >/dev/null 2>&1
	### always start it so we have functioning statistics
	/etc/init.d/collectd start
}

matched_twins() {
	cmp -s "${SYSUPGRADE_BACKUP_TWIN_A}" "${SYSUPGRADE_BACKUP_TWIN_B}"
}

remove_sysupgrade_backup() {
	[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics removing stale sysupgrade backup
	rm -f "${SYSUPGRADE_BACKUP_FILE}"
	rm -f "${SYSUPGRADE_BACKUP_TWIN_A}" "${SYSUPGRADE_BACKUP_TWIN_B}"
}

rrd_restore() {
	[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics rrd_restore
	doing_backups && {
		### Restore backup if backups enabled and we have a
		### nonzero backup file and the twins are unequal
		### (absent or one missing or both present but
		### mismatched).
		[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics checking sysupgrade backup
		[ -s "${SYSUPGRADE_BACKUP_FILE}" ] && ! matched_twins && {
			### restore sysupgrade file to replace any
			### backup temporarily in place during various
			### upgrades or reboots
			[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics restoring sysupgrade backup
			mv -f "${SYSUPGRADE_BACKUP_FILE}" "${BACKUP_FILE}"
		}
		[ -s "${BACKUP_FILE}" ] && {
			[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics restoring backup
			### unpack only files/directories under the configured rrd_dir
			data_relative=${rrd_dir#/}
			[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics restoring only ${data_relative}
			tar -xzf "${BACKUP_FILE}" -C / ${data_relative}
		}
	}
}

rrd_backup() {
	[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics rrd_backup
	doing_backups && [ -d "$rrd_dir" ] && {
		[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics making backup
		local tmp_file=$(mktemp -u)
		tar -czf "$tmp_file" -C / "$rrd_dir" 2>/dev/null
		mkdir -p "${BACKUP_DIR}"
		mv "$tmp_file" "${BACKUP_FILE}"
		rm -f "$tmp_file"

		### remove backup if it's stale
		matched_twins && remove_sysupgrade_backup
	}
}

backup() {
	[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics backup
	/etc/init.d/collectd status >/dev/null 2>&1 && {
		[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics stopping collectd
		collectd_restart=yes
		/etc/init.d/collectd stop >/dev/null 2>&1
	}
	rrd_backup
	[ "$collectd_restart" = "yes" ] && {
		[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics starting collectd
		/etc/init.d/collectd start >/dev/null 2>&1
	}
}

stop_service() {
	/etc/init.d/collectd stop
	backup
}

reload_service() {
	restart "$@"
}

restart() {
	### Stop data collection (and make a backup if configured)
	stop

	### regenerate config / prepare environment
	start
}

copy_backup_for_sysupgrade() {
	local backup_date=$(date -Iseconds)
	cp -p ${BACKUP_FILE} ${SYSUPGRADE_BACKUP_FILE}
	echo ${backup_date} >${SYSUPGRADE_BACKUP_TWIN_A}
	echo ${backup_date} >${SYSUPGRADE_BACKUP_TWIN_B}
}

sysupgrade_backup() {
	local filelist="$1"
	[ -z "$filelist" -o ! -f "$filelist" ] && {
	    echo sysupgrade_backup requires an existing filename argument 1>&2
	    exit 1
	}
	[ ${TRACE} -gt 0 ] && logger -t ${0##*/} -- luci_statistics sysupgrade_backup CONF_BACKUP_LIST=${CONF_BACKUP_LIST}
	doing_backups && {
		### CONF_BACKUP_LIST=1 means we are generating the
		### list, so we don't make the actual backup.
		[ "$CONF_BACKUP_LIST" != "1" ] && {
			### backup now if running
			status >/dev/null 2>&1 && backup
			### Copy the backup to use for sysupgrade
			copy_backup_for_sysupgrade
		}
		### Edit the backup file list to remove everything else
		sed -i -e /${BACKUP_DIR//\//\\/}/d $filelist
		### Add only the files we need to ensure proper
		### restore behavior
		echo ${SYSUPGRADE_BACKUP_FILE} >>$filelist
		echo ${SYSUPGRADE_BACKUP_TWIN_A} >>$filelist
	}
}