123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- const fs = require("./fs_promises");
- const path = require("path");
- let os = require("os");
-
- const { R_OK, W_OK } = fs.constants;
-
- /**
- * Checks that the output directory is writeable
- * @param {string} directory
- * @returns {string?}
- */
- async function get_error(directory) {
- if (!fs.existsSync(directory)) {
- return "does not exist";
- }
- if (!fs.statSync(directory).isDirectory()) {
- error = "exists, but is not a directory";
- }
- const { uid, gid } = os.userInfo();
- const tmpfile = path.join(directory, Math.random() + ".json");
- try {
- fs.writeFileSync(tmpfile, "{}");
- fs.unlinkSync(tmpfile);
- } catch (e) {
- return (
- "does not allow file creation and deletion. " +
- "Check the permissions of the directory, and if needed change them so that " +
- `user with UID ${uid} has access to them. This can be achieved by running the command: chown ${uid}:${gid} on the directory`
- );
- }
- const fileChecks = [];
- const files = await fs.promises.readdir(directory, { withFileTypes: true });
- for (const elem of files) {
- if (/^board-(.*)\.json$/.test(elem.name)) {
- const elemPath = path.join(directory, elem.name);
- if (!elem.isFile())
- return `contains a board file named "${elemPath}" which is not a normal file`;
- fileChecks.push(
- fs.promises.access(elemPath, R_OK | W_OK).catch(function () {
- return elemPath;
- })
- );
- }
- }
- const errs = (await Promise.all(fileChecks)).filter(function (x) {
- return x;
- });
- if (errs.length > 0) {
- return (
- `contains the following board files that are not readable and writable by the current user: "` +
- errs.join('", "') +
- `". Please make all board files accessible with chown 1000:1000`
- );
- }
- }
-
- /**
- * Checks that the output directory is writeable,
- * ans exits the current process with an error otherwise.
- * @param {string} directory
- */
- function check_output_directory(directory) {
- get_error(directory).then(function (error) {
- if (error) {
- console.error(
- `The configured history directory in which boards are stored ${error}.` +
- `\nThe history directory can be configured with the environment variable HISTORY_DIR. ` +
- `It is currently set to "${directory}".`
- );
- process.exit(1);
- }
- });
- }
-
- module.exports = check_output_directory;
|