zfs.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. "use strict";
  2. var execFile = require('child_process').execFile;
  3. var fs = require('fs');
  4. var path = require('path');
  5. var util = require('util');
  6. function compact(array) {
  7. return array.filter(function (i) {
  8. if (typeof i.length !== 'undefined')
  9. return i.length > 0;
  10. return !!i;
  11. });
  12. }
  13. function findCmd(name) {
  14. "use strict";
  15. var paths = process.env['PATH'].split(':');
  16. var pathLen = paths.length;
  17. for (var i = 0; i < pathLen; i++) {
  18. var sp = path.resolve(paths[i]);
  19. var fname = path.normalize(path.join(sp, name));
  20. if (fs.existsSync(fname)) {
  21. return fname;
  22. }
  23. }
  24. return null;
  25. }
  26. var zfsBin = findCmd('zfs');
  27. function zfs(args, callback) {
  28. execFile(zfsBin, args, {maxBuffer: 8000000}, function (err, stdout, stderr) {
  29. if (callback && typeof callback === 'function') {
  30. if (err) {
  31. err.message = compact(err.message.split('\n')).join('; ').trim();
  32. callback(err);
  33. } else {
  34. callback(null, stdout);
  35. }
  36. }
  37. });
  38. }
  39. zfs.list = function list(extraParams, cb) {
  40. var params = ['list', '-H', '-o', 'name'].concat(extraParams || []);
  41. zfs(params, function (err, stdout) {
  42. if (cb && typeof cb === 'function') {
  43. var lines = compact(stdout.split('\n'));
  44. cb(err, lines);
  45. }
  46. });
  47. };
  48. module.exports = zfs;