mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	* improve errors for missing directories Fixes #1761 Updates #1760 Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * update container docs Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> * update changelog with /var changes Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com> --------- Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package util
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"io/fs"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/spf13/viper"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	Base8              = 8
 | |
| 	Base10             = 10
 | |
| 	BitSize16          = 16
 | |
| 	BitSize32          = 32
 | |
| 	BitSize64          = 64
 | |
| 	PermissionFallback = 0o700
 | |
| )
 | |
| 
 | |
| func AbsolutePathFromConfigPath(path string) string {
 | |
| 	// If a relative path is provided, prefix it with the directory where
 | |
| 	// the config file was found.
 | |
| 	if (path != "") && !strings.HasPrefix(path, string(os.PathSeparator)) {
 | |
| 		dir, _ := filepath.Split(viper.ConfigFileUsed())
 | |
| 		if dir != "" {
 | |
| 			path = filepath.Join(dir, path)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return path
 | |
| }
 | |
| 
 | |
| func GetFileMode(key string) fs.FileMode {
 | |
| 	modeStr := viper.GetString(key)
 | |
| 
 | |
| 	mode, err := strconv.ParseUint(modeStr, Base8, BitSize64)
 | |
| 	if err != nil {
 | |
| 		return PermissionFallback
 | |
| 	}
 | |
| 
 | |
| 	return fs.FileMode(mode)
 | |
| }
 | |
| 
 | |
| func EnsureDir(dir string) error {
 | |
| 	if _, err := os.Stat(dir); os.IsNotExist(err) {
 | |
| 		err := os.MkdirAll(dir, PermissionFallback)
 | |
| 		if err != nil {
 | |
| 			if errors.Is(err, os.ErrPermission) {
 | |
| 				return fmt.Errorf(
 | |
| 					"creating directory %s, failed with permission error, is it located somewhere Headscale can write?",
 | |
| 					dir,
 | |
| 				)
 | |
| 			}
 | |
| 
 | |
| 			return fmt.Errorf("creating directory %s: %w", dir, err)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 |