|
|
|
"use strict";
|
|
|
|
|
|
|
|
const Promise = require("bluebird");
|
|
|
|
const memoizee = require("memoizee");
|
|
|
|
const asExpression = require("as-expression");
|
|
|
|
const fs = Promise.promisifyAll(require("fs"));
|
|
|
|
const unreachable = require("@joepie91/unreachable")("cvm");
|
|
|
|
const lsblk = require("../../packages/exec-lsblk");
|
|
|
|
const All = require("../../packages/graphql-interface/symbols/all");
|
|
|
|
const treecutter = require("../../packages/treecutter");
|
|
|
|
const findInTree = require("../../packages/find-in-tree");
|
|
|
|
const shallowMerge = require("../../packages/shallow-merge");
|
|
|
|
|
|
|
|
module.exports = function () {
|
|
|
|
let lsblkOnce = memoizee(() => {
|
|
|
|
return Promise.try(() => {
|
|
|
|
return lsblk();
|
|
|
|
}).then((tree) => {
|
|
|
|
return treecutter.flatten(tree);
|
|
|
|
}).map((device) => {
|
|
|
|
return Promise.try(() => {
|
|
|
|
return fs.realpathAsync(device.path);
|
|
|
|
}).then((actualPath) => {
|
|
|
|
return shallowMerge(device, {
|
|
|
|
path: actualPath
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}).then((devices) => {
|
|
|
|
return {
|
|
|
|
tree: treecutter.rebuild(devices),
|
|
|
|
list: devices
|
|
|
|
};
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
return function (selectors) {
|
|
|
|
return Promise.try(() => {
|
|
|
|
return lsblkOnce();
|
|
|
|
}).then(({tree, list}) => {
|
|
|
|
return selectors.map((selector) => {
|
|
|
|
if (selector === All) {
|
|
|
|
// return tree;
|
|
|
|
return list;
|
|
|
|
} else {
|
|
|
|
let { path, name } = selector;
|
|
|
|
|
|
|
|
let predicate = asExpression(() => {
|
|
|
|
if (path != null) {
|
|
|
|
return (device) => device.path === path;
|
|
|
|
} else if (name != null) {
|
|
|
|
return (device) => device.name === name;
|
|
|
|
} else {
|
|
|
|
unreachable("No selector specified for lsblk");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return findInTree({ tree, predicate });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|