snapshotset.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. var toDestroy = snaps.slice(0, snaps.length - num);
  40. async.eachSeries(toDestroy, function (snap, cb) {
  41. util.log('destroy ' + snap)
  42. zfs(['destroy', '-r', snap], cb);
  43. }, cb);
  44. });
  45. };
  46. module.exports = SnapshotSet;