eleventy icon indicating copy to clipboard operation
eleventy copied to clipboard

Path handling error [edge case] permissions error while scanning files/directories when running --serve on a site generated into a folder in the parent folder where the parent folder has other files/folders in it

Open aral opened this issue 5 years ago • 0 comments

Eleventy’s server (--serve) fails to launch when --input is the current directory and --output is a directory in the parent directory. (Compilation – i.e., write() – and --watch succeed.)

Similar to #939, but, in this particular instance, the failure (see debug log) appears to be because scandir is trying to scan all the folders in the parent directory and it doesn’t have privileges to do so. I tried to reproduce it by creating files/folders in the parent directory owned by root but that didn’t trigger the error.

Not sure what it it is specifically about the files mentioned in the debug log that’s causing it to fail in this instance but here’s what a couple of them look like:

sudo ls -la /home/aral/sandbox/gnomit-test-build/var/run/cryptsetup
total 0
drwx------  2 root root   40 Feb 11 11:42 .
drwxr-xr-x 39 root root 1100 Feb 15 11:46 ..
sudo ls -la /home/aral/sandbox/gnomit-test-build/var/run/gdm3      
total 0
drwx--x--x  3 root gdm    60 Feb 11 11:42 .
drwxr-xr-x 39 root root 1100 Feb 15 11:46 ..
drwx------  2 gdm  gdm    40 Feb 11 11:42 greeter

Regardless, Eleventy shouldn’t be scanning the parent directory or subdirectories of the parent directory in any case. It should only be operating in ./ and ../eleventy-base-blog/.

To Reproduce

This reproduces it on my machine but you will not be able to without the troublesome files listed in the debug output. I tried zipping them up to include here but tar also failed on them.

  1. Install Eleventy.

    npm i -g @11ty/eleventy`
    
  2. Clone the base blog example.

    git clone https://github.com/11ty/eleventy-base-blog.git
    
  3. Change to the base blog example’s directory and install its dependencies

     cd eleventy-base-blog
     npm i
    
  4. Run Eleventy.

    eleventy --input=. --output=../eleventy-base-blog-site
    

What should happen

Eleventy should compile the source in ./ and output it to /.eleventy-base-blog-site.

What actually happens

The following error is triggered (compiler output truncated; full debug output at end):

…
Writing ../eleventy-base-blog-site/tags/number-2/index.html from ./tags.njk.
Copied 2 items / Wrote 16 files in 0.26 seconds (16.3ms each, v0.10.0)
Watching…
[Browsersync] Access URLs:
 -----------------------------------
    Local: http://localhost:8080
 External: http://192.168.2.134:8080
 -----------------------------------
[Browsersync] Serving files from: ../eleventy-base-blog-site
Uncaught exception: (more in DEBUG output)
> ENOENT: no such file or directory, open '_site/404.html'

`Error` was thrown:
    Error: ENOENT: no such file or directory, open '_site/404.html'
        at Object.openSync (fs.js:440:3)
        at Object.readFileSync (fs.js:342:35)
        at Object.ready (/home/aral/sandbox/eleventy-base-blog/.eleventy.js:57:32)
        at BrowserSync.callback (/home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/browser-sync.js:51:12)
        at /home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/browser-sync.js:228:12
        at /home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/utils.js:278:21
        at executeTask (/home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/browser-sync.js:136:13)
        at Object.initUserPlugins [as fn] (/home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/async.js:294:9)
        at /home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/browser-sync.js:120:14
        at iterate (/home/aral/.nvm/versions/node/v12.14.1/lib/node_modules/@11ty/eleventy/node_modules/browser-sync/dist/utils.js:269:9)

Environment:

  • OS and Version: Pop!_OS 19.10 (based on Ubuntu 19.10)
  • Eleventy Version: 0.10.0

Additional context

Full debug output (sans timings):

   Eleventy:UserConfig Resetting EleventyConfig to initial values. +0ms
  Eleventy:Config Setting up global TemplateConfig. +0ms
  Eleventy:UserConfig Adding universal filter 'slug' +3ms
  Eleventy:UserConfig Adding universal filter 'url' +0ms
  Eleventy:TemplateConfig rootConfig { templateFormats: [ 'liquid',   'ejs', 'md',       'hbs', 'mustache', 'haml', 'pug',      'njk', 'html',     'jstl', '11ty.js' ], pathPrefix: '/', markdownTemplateEngine: 'liquid', htmlTemplateEngine: 'liquid', dataTemplateEngine: 'liquid', passthroughFileCopy: true, htmlOutputSuffix: '-o', jsDataFileSuffix: '.11tydata', keys: { package: 'pkg', layout: 'layout', permalink: 'permalink', permalinkRoot: 'permalinkBypassOutputDir', engineOverride: 'templateEngineOverride' }, dir: { input: '.', includes: '_includes', data: '_data', output: '_site' }, filters: {}, handlebarsHelpers: {}, nunjucksFilters: {} } +0ms
  Eleventy:TemplateConfig Merging config with /home/aral/sandbox/.eleventy.js +1ms
  Eleventy:TemplateConfig Eleventy local project config file not found, skipping. +0ms
  Eleventy:TemplateConfig localConfig: { templateFormats: undefined, filters: {}, linters: {}, layoutAliases: {}, passthroughCopies: {}, liquidOptions: {}, liquidTags: {}, liquidFilters: { slug: [Function], url: [Function] }, liquidShortcodes: {}, liquidPairedShortcodes: {}, nunjucksFilters: { slug: [Function], url: [Function] }, nunjucksAsyncFilters: {}, nunjucksTags: {}, nunjucksAsyncShortcodes: {}, nunjucksShortcodes: {}, nunjucksAsyncPairedShortcodes: {}, nunjucksPairedShortcodes: {}, handlebarsHelpers: { slug: [Function], url: [Function] }, handlebarsShortcodes: {}, handlebarsPairedShortcodes: {}, javascriptFunctions: { slug: [Function], url: [Function] }, pugOptions: {}, ejsOptions: {}, markdownHighlighter: null, libraryOverrides: {}, dynamicPermalinks: true, useGitIgnore: true, dataDeepMerge: false, experiments: Set {}, watchJavaScriptDependencies: true, additionalWatchTargets: [], browserSyncConfig: {}, frontMatterParsingOptions: undefined, dataExtensions: Map {}, quietMode: false } +1ms
  Eleventy:TemplateConfig overrides: {} +1ms
  Eleventy:TemplateConfig Current configuration: { templateFormats: [ 'liquid',   'ejs', 'md',       'hbs', 'mustache', 'haml', 'pug',      'njk', 'html',     'jstl', '11ty.js' ], pathPrefix: '/', markdownTemplateEngine: 'liquid', htmlTemplateEngine: 'liquid', dataTemplateEngine: 'liquid', passthroughFileCopy: true, htmlOutputSuffix: '-o', jsDataFileSuffix: '.11tydata', keys: { package: 'pkg', layout: 'layout', permalink: 'permalink', permalinkRoot: 'permalinkBypassOutputDir', engineOverride: 'templateEngineOverride' }, dir: { input: '.', includes: '_includes', data: '_data', output: '_site' }, filters: {}, handlebarsHelpers: { slug: [Function], url: [Function] }, nunjucksFilters: { slug: [Function], url: [Function] }, linters: {}, layoutAliases: {}, passthroughCopies: {}, liquidOptions: {}, liquidTags: {}, liquidFilters: { slug: [Function], url: [Function] }, liquidShortcodes: {}, liquidPairedShortcodes: {}, nunjucksAsyncFilters: {}, nunjucksTags: {}, nunjucksAsyncShortcodes: {}, nunjucksShortcodes: {}, nunjucksAsyncPairedShortcodes: {}, nunjucksPairedShortcodes: {}, handlebarsShortcodes: {}, handlebarsPairedShortcodes: {}, javascriptFunctions: { slug: [Function], url: [Function] }, pugOptions: {}, ejsOptions: {}, markdownHighlighter: null, libraryOverrides: {}, dynamicPermalinks: true, useGitIgnore: true, dataDeepMerge: false, experiments: Set {}, watchJavaScriptDependencies: true, additionalWatchTargets: [], browserSyncConfig: {}, frontMatterParsingOptions: undefined, dataExtensions: Map {}, quietMode: false } +0ms
  Eleventy:CommandCheck command: eleventy  --input=. --output=../eleventy-base-blog-site --serve +0ms
  Eleventy:TemplatePassthroughManager Resetting counts to 0 +0ms
  Eleventy:EleventyFiles /home/aral/sandbox/.gitignore ignoring: !./node_modules/** +0ms
  Eleventy:EleventyFiles /home/aral/sandbox/.gitignore ignoring: !/home/aral/sandbox/node_modules/** +0ms
  Eleventy Directories:
  Eleventy Input: .
  Eleventy Data: _data
  Eleventy Includes: _includes
  Eleventy Layouts: undefined
  Eleventy Output: ../eleventy-base-blog-site
  Eleventy Template Formats: liquid,ejs,md,hbs,mustache,haml,pug,njk,html,jstl,11ty.js
  Eleventy Verbose Output: false +0ms
  Eleventy:TemplateData Could not find and/or require package.json for data preprocessing at '/home/aral/sandbox/package.json' +0ms
  Eleventy:TemplateData Could not find and/or require package.json for data preprocessing at '/home/aral/sandbox/package.json' +0ms
  Eleventy:EleventyFiles Searching for: [ './**/*.liquid', './**/*.ejs', './**/*.md', './**/*.hbs', './**/*.mustache', './**/*.haml', './**/*.pug', './**/*.njk', './**/*.html', './**/*.jstl', './**/*.11ty.js', '!./node_modules/**', '!/home/aral/sandbox/node_modules/**', '!../eleventy-base-blog-site/**', '!./_includes/**', '!./_data/**' ] +19ms
  Eleventy:EleventyErrorHandler Problem writing Eleventy templates: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/cryptsetup'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +1ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/cryptsetup' +0ms
Wrote 0 files in 0.91 seconds (v0.10.0)
  Eleventy Finished writing templates. +907ms
  Eleventy 
  Eleventy Getting frustrated? Have a suggestion/feature request/feedback?
  Eleventy I want to hear it! Open an issue: https://github.com/11ty/eleventy/issues/new +0ms
  Eleventy:TemplatePassthroughManager `passthroughFileCopy` config paths: {} +909ms
  Eleventy:TemplatePassthroughManager `passthroughFileCopy` config normalized paths: [] +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +2ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/gdm3'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/gdm3' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/lvm'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/lvm' +1ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-client'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-client' +1ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-server'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-server' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/speech-dispatcher'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/speech-dispatcher' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +1ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/sudo'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/sudo' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/udisks2'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/udisks2' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +1ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/wpa_supplicant'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/wpa_supplicant' +0ms
  Eleventy:EleventyErrorHandler Unhandled rejection in promise ([object Promise]): +154ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/cryptsetup'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/cryptsetup' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/gdm3'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/gdm3' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/lvm'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/lvm' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-client'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-client' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +1ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-server'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/openvpn-server' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/speech-dispatcher'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/speech-dispatcher' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/sudo'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/sudo' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/udisks2'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/udisks2' +0ms
  Eleventy:EleventyErrorHandler Uncaught exception: +0ms
  Eleventy:EleventyErrorHandler EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/wpa_supplicant'
  Eleventy:EleventyErrorHandler 
  Eleventy:EleventyErrorHandler `Error` was thrown: +0ms
  Eleventy:EleventyErrorHandler (error stack): Error: EACCES: permission denied, scandir '/home/aral/sandbox/gnomit-test-build/var/run/wpa_supplicant' +0ms

aral avatar Feb 15 '20 12:02 aral