-
Notifications
You must be signed in to change notification settings - Fork 0
/
znap-util.sh
269 lines (217 loc) · 5.49 KB
/
znap-util.sh
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
#!/bin/sh
#
# ----------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42):
# <[email protected]> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a beer in return. Mikal Sande
# ----------------------------------------------------------------------------
#
# znap-util.sh - utility script for znap
# usage: znap.sh <pool> <actip>
#
set -u
########################
# Script Configuration #
########################
# Configuration files
CONFIG='./'
CONFIG_FILE="${CONFIG}/znap.conf"
CONFIG_DIR="${CONFIG}/znap.d"
FOUND_CONFIG='no'
#############
# Functions #
#############
# number of snapshots
count ()
{
total_snapshots=$( zfs list -t snapshot | grep "^${POOL}" \
| wc -l | tr -d ' ' )
znap_snapshots=$( zfs list -t snapshot | grep "^${POOL}" \
| grep _${SNAPSHOT_NAME}_ | wc -l | tr -d ' ' )
echo
echo "znap snapshots: ${znap_snapshots}"
echo "Total snapshots: ${total_snapshots}"
}
# List all toplevel znap snapshots
list ()
{
zfs list -H -t snapshot -o name | grep "^${POOL}" \
| grep "_${SNAPSHOT_NAME}_" \
| grep --only-matching "${POOL}@.*" \
| sort | uniq
}
# List all snapshots with unique data
list_unique ()
{
zfs list -t snapshot -S used -o name,refer,used \
| grep "^${POOL}" | grep -v '0$'
}
# List datasets by snapshot usage
list_dataset ()
{
zfs list -o space -S usedsnap -o name,used,usedsnap \
| grep "^${POOL}" | grep -v '0$'
}
# List datasets with script.znap properties
list_properties ()
{
# script.znap:nosnapshots
echo
echo '### script.znap:nosnapshots ###'
zfs get -r -t filesystem -o name,value -H script.znap:nosnapshots $POOL \
| grep '1$' | cut -f1
# script.znap:nomonthly
echo
echo '### script.znap:nomonthly ###'
zfs get -r -t filesystem -o name,value -H script.znap:nomonthly $POOL \
| grep '1$' | cut -f1
# script.znap:noweekly
echo
echo '### script.znap:noweekly ###'
zfs get -r -t filesystem -o name,value -H script.znap:noweekly $POOL \
| grep '1$' | cut -f1
# script.znap:nodaily
echo
echo '### script.znap:nodaily ###'
zfs get -r -t filesystem -o name,value -H script.znap:nodaily $POOL \
| grep '1$' | cut -f1
# script.znap:nohourly
echo
echo '### script.znap:nohourly ###'
zfs get -r -t filesystem -o name,value -H script.znap:nohourly $POOL \
| grep '1$' | cut -f1
}
# Show config
show_config ()
{
cat << EOF
Config
Poolname: $POOL
Config file: $CONFIG_FILE
Config directory: $CONFIG_DIR
Lifetimes
Hourly snapshot: $HOURLY_LIFETIME hours
Daily snapshot: $DAILY_LIFETIME days
Weekly snapshot: $WEEKLY_LIFETIME days
Monthly snapshot: $MONTHLY_LIFETIME days
Destroy times
Hourly snapshots: $HOURLY_DESTROY_TIME
Daily snapshots: $DAILY_DESTROY_DATE
Weekly snapshots: $WEEKLY_DESTROY_DATE
Monthly snapshots: $MONTHLY_DESTROY_DATE
Weekdays (1 = monday, 7 = sunday)
Weekly snapshots: $WEEKLY_DAY
Monthly snapshots: $MONTHLY_DAY
Name included in all snapshots: $SNAPSHOT_NAME
Old snapshots destroyed per run: $DESTROY_LIMIT
Supported user properties:
script.znap:nosnapshots All znap snapshots are deleted for the destroyed
script.znap:nomonthly All znap monthly snapshots are destroyed
script.znap:noweekly All znap weekly snapshots are destroyed
script.znap:nodaily All znap daily snapshots are destroyed
script.znap:nohourly All znap hourly snapshots are destroyed
ssh replication config
Username: $REMOTE_USER
Host: $REMOTE_HOST
Pool: $REMOTE_POOL
EOF
}
# Print help
print_help ()
{
cat << EOF
Usage: $(basename $0) <pool> <action>
Actions:
config Show znap config
count Show number of snapshots
dataset List datasets where snapshots contain data
Shows the fields name,used,usedsnap
list List all toplevel snapshots
properties List datasets with znap properties
uniq List all snapshots that have unique data
Shows the fields name,refer,used
EOF
exit
}
#################
# Runtime tests #
#################
# Is a poolname given?
if [ "$#" -eq '0' ]
then
echo "$0 - Please enter a poolname"
print_help
fi
POOL="$1"
# Is an action given?
if [ "$#" -eq '2' ]
then
ACTION="$2"
else
print_help
fi
# Does the pool exist?
zpool list "$POOL" > /dev/null 2>&1
if [ "$?" -ne '0' ]
then
echo "$0 - No such pool: $POOL"
exit 2
fi
# Is there a general config?
if [ -r "$CONFIG_FILE" ]
then
. $CONFIG_FILE
FOUND_CONFIG='yes'
fi
# Is there a specific config for this pool?
POOL_CONFIG="${CONFIG_DIR}/${POOL}.conf"
if [ -f "$POOL_CONFIG" ]
then
. $POOL_CONFIG
FOUND_CONFIG='yes'
fi
# Exit if no configs were found
if [ "$FOUND_CONFIG" != 'yes' ]
then
echo "$0 - No config found at $CONFIG_FILE or $POOL_CONFIG, exiting"
exit 2
fi
#########################
# Runtime configuration #
#########################
# find the threshold date for destroying snapshots
HOURLY_DESTROY_TIME="$(date -v -${HOURLY_LIFETIME}H '+%Y%m%d%H%M')"
DAILY_DESTROY_DATE="$(date -v -${DAILY_LIFETIME}d '+%Y%m%d%H%M')"
WEEKLY_DESTROY_DATE="$(date -v -${WEEKLY_LIFETIME}d '+%Y%m%d%H%M')"
MONTHLY_DESTROY_DATE="$(date -v -${MONTHLY_LIFETIME}d '+%Y%m%d%H%M')"
# todays date, day of week and day of month
TODAY_DATE="$(date '+%Y%m%d%H%M')"
TODAY_DAY_OF_WEEK="$(date '+%u')"
TODAY_DAY_OF_MONTH="$(date '+%d')"
########
# Main #
########
case "$ACTION" in
config)
show_config
;;
count)
count
;;
dataset)
list_dataset
;;
list)
list
;;
uniq)
list_unique
;;
properties)
list_properties
;;
*)
echo "Unrecognized action."
print_help
esac