cloudflare/cloudflared · error

error creating %s: %v

Error message

error creating %s: %v

What it means

This error is returned by ServiceTemplate.Generate when os.MkdirAll fails to create the parent directory of the resolved service file path (e.g. /Library/LaunchDaemons on macOS). MkdirAll fails when a path component exists as a non-directory, or permission is denied. The message names the plist folder it tried to create.

Source

Thrown at cmd/cloudflared/service_template.go:61

	}
	if _, err = os.Stat(resolvedPath); err == nil {
		return errors.New(serviceAlreadyExistsWarn(resolvedPath))
	}

	var buffer bytes.Buffer
	err = tmpl.Execute(&buffer, args)
	if err != nil {
		return fmt.Errorf("error generating %s: %v", st.Path, err)
	}
	fileMode := os.FileMode(0o644)
	if st.FileMode != 0 {
		fileMode = st.FileMode
	}

	plistFolder := filepath.Dir(resolvedPath)
	err = os.MkdirAll(plistFolder, 0o755)
	if err != nil {
		return fmt.Errorf("error creating %s: %v", plistFolder, err)
	}

	err = os.WriteFile(resolvedPath, buffer.Bytes(), fileMode)
	if err != nil {
		return fmt.Errorf("error writing %s: %v", resolvedPath, err)
	}
	return nil
}

func (st *ServiceTemplate) Remove() error {
	resolvedPath, err := st.ResolvePath()
	if err != nil {
		return err
	}
	err = os.Remove(resolvedPath)
	if err != nil {
		return fmt.Errorf("error deleting %s: %v", resolvedPath, err)
	}

View on GitHub (pinned to 2253eeeb25)

Solutions

  1. Run the install command with elevated privileges (sudo cloudflared service install)
  2. Check that no file exists at any component of the plist folder path: ls -la /Library/LaunchDaemons
  3. Verify filesystem permissions/ACLs on the parent directory
  4. Install to a user-writable location if root is unavailable

Example fix

// before
$ cloudflared service install  // permission denied
// after
$ sudo cloudflared service install
Defensive patterns

Strategy: try-catch

Validate before calling

plistFolder := filepath.Dir(resolvedPath)
if fi, err := os.Stat(plistFolder); err == nil && !fi.IsDir() {
	return fmt.Errorf("%s exists but is not a directory", plistFolder)
}
if _, err := os.Stat(plistFolder); err != nil {
	// will need to create: verify parent is writable
	if err := unix.Access(filepath.Dir(plistFolder), unix.W_OK); err != nil {
		return errors.New("need elevated privileges (sudo) to create service directory")
	}
}

Type guard

func dirWritable(path string) bool {
	f, err := os.CreateTemp(path, ".probe")
	if err != nil { return false }
	oname := f.Name()
	_ = f.Close()
	_ = os.Remove(oname)
	return true
}

Try / catch

if err := st.Generate(args); err != nil {
	if strings.Contains(err.Error(), "error creating") && strings.Contains(err.Error(), "permission denied") {
		// advise: re-run install with sudo
	}
	return err
}

Prevention

When it happens

Trigger: Calling Generate() (via installLaunchd) where filepath.Dir(resolvedPath) cannot be created: permission denied writing to /Library/LaunchDaemons without root, or a file already exists at a parent path component.

Common situations: Running 'cloudflared service install' without sudo on macOS; corporate-managed machines restricting /Library/LaunchDaemons; an unexpected file named like the target directory blocking MkdirAll.

Understand the failure class

Background: mkdir permission denied (EACCES): failed to create directory errors explained — this error's family across 32 libraries.

Related errors


AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06). Data as JSON: /api/errors/da35bdb579dd9b70. Report an issue: GitHub.