|
|
|
"use strict";
|
|
|
|
|
|
|
|
const Promise = require("bluebird");
|
|
|
|
const fs = Promise.promisifyAll(require("fs"));
|
|
|
|
const matchValue = require("match-value");
|
|
|
|
|
|
|
|
const { createDataObject, LocalProperties, ID, Dynamic } = require("../../packages/graphql-interface/data-object");
|
|
|
|
const All = require("../../packages/graphql-interface/symbols/all");
|
|
|
|
const treecutter = require("../../packages/treecutter");
|
|
|
|
|
|
|
|
module.exports = function (types) {
|
|
|
|
return function BlockDevice({ name, path, _treecutterDepth, _treecutterSequenceNumber }) {
|
|
|
|
// if (name != null) {
|
|
|
|
// path = `/dev/${name}`;
|
|
|
|
// } else if (path != null) {
|
|
|
|
// name = deviceNameFromPath(path);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return Promise.try(() => {
|
|
|
|
// return fs.realpathAsync(path);
|
|
|
|
// }).then((realPath) => {
|
|
|
|
/* FIXME: parent */
|
|
|
|
return createDataObject({
|
|
|
|
[LocalProperties]: {
|
|
|
|
_treecutterDepth,
|
|
|
|
_treecutterSequenceNumber
|
|
|
|
},
|
|
|
|
[Dynamic]: {
|
|
|
|
mounts: function ({ type }, { resolveProperty, resolvePropertyPath, resolveDataSource }) {
|
|
|
|
return Promise.try(() => {
|
|
|
|
return resolveDataSource("findmnt", All);
|
|
|
|
}).then((allMounts) => {
|
|
|
|
return treecutter.flatten(allMounts);
|
|
|
|
}).map((mount) => {
|
|
|
|
return types.Mount({ mountpoint: mount.mountpoint });
|
|
|
|
}).filter((mount) => {
|
|
|
|
return Promise.try(() => {
|
|
|
|
return resolvePropertyPath([ "sourceDevice", "path" ], mount);
|
|
|
|
}).then((sourceDevicePath) => {
|
|
|
|
// FIXME: Get own path dynamically
|
|
|
|
return (sourceDevicePath === path);
|
|
|
|
});
|
|
|
|
}).then((mounts) => {
|
|
|
|
if (type != null) {
|
|
|
|
return Promise.filter(mounts, (mount) => {
|
|
|
|
return Promise.try(() => {
|
|
|
|
return resolveProperty("type", mount);
|
|
|
|
}).then((mountType) => {
|
|
|
|
return (mountType === type);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
return mounts;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// findmnt: {
|
|
|
|
// [ID]: All,
|
|
|
|
// mounts: function (allMounts, { type }, context) {
|
|
|
|
// let { resolveProperty } = context;
|
|
|
|
// console.log("CONTEXT", context);
|
|
|
|
|
|
|
|
// // FIXME: Why is this called so often?
|
|
|
|
|
|
|
|
// }
|
|
|
|
// },
|
|
|
|
lsblk: {
|
|
|
|
[ID]: { name, path },
|
|
|
|
name: "name",
|
|
|
|
path: (device) => {
|
|
|
|
return fs.realpathAsync(device.path);
|
|
|
|
},
|
|
|
|
type: (device) => {
|
|
|
|
return matchValue(device.type, {
|
|
|
|
partition: "PARTITION",
|
|
|
|
disk: "DISK",
|
|
|
|
loopDevice: "LOOP_DEVICE"
|
|
|
|
});
|
|
|
|
},
|
|
|
|
size: "size",
|
|
|
|
mountpoint: "mountpoint", // FIXME: Isn't this obsoleted by `mounts`?
|
|
|
|
deviceNumber: "deviceNumber",
|
|
|
|
removable: "removable",
|
|
|
|
readOnly: "readOnly",
|
|
|
|
children: (device) => {
|
|
|
|
return device.children.map((child) => {
|
|
|
|
return BlockDevice({ name: child.name });
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
};
|
|
|
|
};
|