snapshotset.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. "use strict";
  2. var async = require('async');
  3. var util = require('util');
  4. var zfs = require('./zfs');
  5. function snapshotName(base) {
  6. var when = (new Date()).toISOString().replace(/[-:]|(\.\d\d\d)/g, '');
  7. return base + '-' + when;
  8. }
  9. function SnapshotSet(dataset, tag) {
  10. this.dataset = dataset;
  11. this.tag = tag;
  12. }
  13. SnapshotSet.prototype.snapshot = function (cb) {
  14. var name = snapshotName(this.tag);
  15. var snap = this.dataset + '@' + name;
  16. util.log('snapshot ' + snap)
  17. zfs(['snapshot', '-r', this.dataset + '@' + name], cb);
  18. };
  19. SnapshotSet.prototype.list = function (cb) {
  20. var self = this;
  21. var re = new RegExp(self.dataset + '@' + self.tag + '-');
  22. zfs.list(['-t', 'snapshot', '-r', '-d', '1', self.dataset], function (err, snaps) {
  23. if (err) {
  24. return cb(err);
  25. }
  26. var names = snaps.filter(function (n) {
  27. return n.match(re);
  28. });
  29. names.sort();
  30. cb(null, names);
  31. });
  32. };
  33. SnapshotSet.prototype.prune = function (num, cb) {
  34. var self = this;
  35. self.list(function (err, snaps) {
  36. if (err) {
  37. return cb(err);
  38. }
  39. if (snaps.length > num) {
  40. var toDestroy = snaps.slice(0, snaps.length - num);
  41. async.eachSeries(toDestroy, function (snap, cb) {
  42. util.log('destroy ' + snap)
  43. zfs(['destroy', '-r', snap], cb);
  44. }, cb);
  45. } else {
  46. cb(null);
  47. }
  48. });
  49. };
  50. module.exports = SnapshotSet;