coreybutler/node-mac

Permission error

linonetwo opened this issue · 1 comments

I install my script like this:

sudo node scripts/installServer.js

with

const path = require('path');

const Service = require('node-mac').Service; // require('./node-mac-windows-linux')

const scriptsFolder = path.join(path.dirname(__filename));
const scriptPath = path.join(scriptsFolder, 'startAndWatchNodeJSWiki.js');

const service = new Service({
  name: 'TiddlyWiki',
  description: 'Local TiddlyWiki server for my knowledge management.',
  script: scriptPath,
});

service.on('install', () => {
  service.start();
  console.log(`${scriptPath} started.`)
});
service.on('alreadyinstalled', () => {
  console.log(`${scriptPath} already installed.`)
});
service.on('invalidinstallation', () => {
  console.log(`${scriptPath} is invalid.`)
});
service.on('uninstall', () => {
  console.log(`${scriptPath} is uninstalled.`)
});
service.on('error', () => {
  console.log(`${scriptPath} errors.`)
});

service.install();

and

/// node-mac-windows-linux.js
const path = require('path');
const os = require('os');
const execSync = require('child_process').execSync;
const { existsSync } = require('fs');

let Service;
if (os.platform() === 'darwin') {
  Service = require('node-mac').Service;
  if (!existsSync('/Library/Logs/TiddlyWiki')) {
    execSync('sudo mkdir -p /Library/Logs/TiddlyWiki && sudo chown -R $(whoami) /Library/Logs/TiddlyWiki');
  }
} else if (os.platform() === 'win32') {
  Service = require('node-windows').Service;
} else {
  Service = require('node-linux').Service;
}

module.exports = Service;

I got:

# TiddlyWiki Errorsinternal/fs/utils.js:230
    throw err;
    ^

Error: EPERM: operation not permitted, open '/xxx/node_modules/node-mac/lib/wrapper.js'
    at Object.openSync (fs.js:462:3)
    at Object.readFileSync (fs.js:364:35)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1166:22)
    at Module.load (internal/modules/cjs/loader.js:996:32)
    at Function.Module._load (internal/modules/cjs/loader.js:896:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  errno: -1,
  syscall: 'open',
  code: 'EPERM',
  path: '/xxx/node_modules/node-mac/lib/wrapper.js'
}
internal/fs/utils.js:230
    throw err;
    ^

Error: EPERM: operation not permitted, open '/xxx/node_modules/node-mac/lib/wrapper.js'
    at Object.openSync (fs.js:462:3)
    at Object.readFileSync (fs.js:364:35)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1166:22)
    at Module.load (internal/modules/cjs/loader.js:996:32)
    at Function.Module._load (internal/modules/cjs/loader.js:896:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  errno: -1,
  syscall: 'open',
  code: 'EPERM',
  path: '/xxx/node_modules/node-mac/lib/wrapper.js'
}

Fixed by letting VSCode and terminal have full desk access https://osxdaily.com/2018/10/09/fix-operation-not-permitted-terminal-error-macos/

If I'm going to run this install script from VSCode:

Screen Shot 2020-04-16 at 3 19 04 PM

It is crutial to let VSCode to have full desk access:

Screen Shot 2020-04-16 at 3 18 51 PM