Add ignore support and logging
[dtbartle/zfs.git] / snapshot-rotate.py
1 #!/usr/bin/python
2 import sys, re, time
3 from zfs import *
4
5 verbose = False
6
7 if len(sys.argv) < 4:
8     print "Usage: snapshot-rotate.py zpool name number [ignore-datasets...]"
9     sys.exit(0)
10 zpool = sys.argv[1]
11 name = sys.argv[2]
12 number = int(sys.argv[3])
13 ignore = sys.argv[4:]
14
15 # iterate over all filesystems
16 snapre = re.compile("%s\.([0-9]+)" % re.escape(name))
17 for fs in zfs_list(zpool, 'filesystem'):
18     if fs in ignore:
19         continue
20
21     # delete old snapshots, and note snapshots to be moved
22     snaps = zfs_list("%s/%s" % (zpool, fs), 'snapshot')
23     snapnums = []
24     for snap in snaps:
25         match = snapre.match(snap)
26         if match != None:
27             snapnum = int(match.group(1))
28             if (snapnum + 1) >= number:
29                 try:
30                     if verbose:
31                         print "zfs destroy %s/%s@%s.%d" % (zpool, fs, name, snapnum)
32                     zfs_destroy("%s/%s@%s.%d" % (zpool, fs, name, snapnum))
33                 except ZfsException, zfs:
34                     print zfs.err
35             else:
36                 snapnums.append(snapnum)
37
38     # rename old snapshots
39     snapnums.sort()
40     snapnums.reverse()
41     for snapnum in snapnums:
42         try:
43             if verbose:
44                 print "zfs rename %s/%s@%s.%d %s/%s@%s.%d" % \
45                     (zpool, fs, name, snapnum, zpool, fs, name, snapnum + 1)
46             zfs_rename("%s/%s@%s.%d" % (zpool, fs, name, snapnum),
47                 "%s/%s@%s.%d" % (zpool, fs, name, snapnum + 1))
48         except ZfsException, zfs:
49             print zfs.err
50
51     # create new snapshot
52     try:
53         if verbose:
54             print "zfs snapshot %s/%s@%s.0" % (zpool, fs, name)
55         zfs_snapshot("%s/%s@%s.0" % (zpool, fs, name))
56     except ZfsException, zfs:
57         print zfs.err
58
59 # write log
60 log = open("/var/log/snapshot-rotate.log", "w")
61 cur_time = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())
62 log.write("%s: Done %s snapshot.\n" % (cur_time, name))