All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 34s
				
			Test / Sandbox (push) Successful in 2m13s
				
			Test / Hakurei (push) Successful in 3m6s
				
			Test / Hpkg (push) Successful in 4m2s
				
			Test / Sandbox (race detector) (push) Successful in 4m5s
				
			Test / Hakurei (race detector) (push) Successful in 4m51s
				
			Test / Flake checks (push) Successful in 1m30s
				
			This is now part of the hst API. This change also improves identifier generation and serialisation. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			147 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package hst exports stable shared types for interacting with hakurei.
 | |
| package hst
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"math"
 | |
| 	"net"
 | |
| 	"os"
 | |
| 
 | |
| 	"hakurei.app/container/check"
 | |
| 	"hakurei.app/container/fhs"
 | |
| )
 | |
| 
 | |
| // An AppError is returned while starting an app according to [hst.Config].
 | |
| type AppError struct {
 | |
| 	// A user-facing description of where the error occurred.
 | |
| 	Step string `json:"step"`
 | |
| 	// The underlying error value.
 | |
| 	Err error `json:"err"`
 | |
| 	// An arbitrary error message, overriding the return value of Message if not empty.
 | |
| 	Msg string `json:"message,omitempty"`
 | |
| }
 | |
| 
 | |
| func (e *AppError) Error() string { return e.Err.Error() }
 | |
| func (e *AppError) Unwrap() error { return e.Err }
 | |
| func (e *AppError) Message() string {
 | |
| 	if e.Msg != "" {
 | |
| 		return e.Msg
 | |
| 	}
 | |
| 
 | |
| 	switch {
 | |
| 	case errors.As(e.Err, new(*os.PathError)),
 | |
| 		errors.As(e.Err, new(*os.LinkError)),
 | |
| 		errors.As(e.Err, new(*os.SyscallError)),
 | |
| 		errors.As(e.Err, new(*net.OpError)):
 | |
| 		return "cannot " + e.Error()
 | |
| 
 | |
| 	default:
 | |
| 		return "cannot " + e.Step + ": " + e.Error()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Paths contains environment-dependent paths used by hakurei.
 | |
| type Paths struct {
 | |
| 	// Temporary directory returned by [os.TempDir], usually equivalent to [fhs.AbsTmp].
 | |
| 	TempDir *check.Absolute `json:"temp_dir"`
 | |
| 	// Shared directory specific to the hsu userid, usually (`/tmp/hakurei.%d`, [Info.User]).
 | |
| 	SharePath *check.Absolute `json:"share_path"`
 | |
| 	// Checked XDG_RUNTIME_DIR value, usually (`/run/user/%d`, uid).
 | |
| 	RuntimePath *check.Absolute `json:"runtime_path"`
 | |
| 	// Shared directory specific to the hsu userid located in RuntimePath, usually (`/run/user/%d/hakurei`, uid).
 | |
| 	RunDirPath *check.Absolute `json:"run_dir_path"`
 | |
| }
 | |
| 
 | |
| // Info holds basic system information collected from the implementation.
 | |
| type Info struct {
 | |
| 	// Version is a hardcoded version string.
 | |
| 	Version string `json:"version"`
 | |
| 	// User is the userid according to hsu.
 | |
| 	User int `json:"user"`
 | |
| 
 | |
| 	Paths
 | |
| }
 | |
| 
 | |
| // Template returns a fully populated instance of Config.
 | |
| func Template() *Config {
 | |
| 	return &Config{
 | |
| 		ID: "org.chromium.Chromium",
 | |
| 
 | |
| 		Enablements: NewEnablements(EWayland | EDBus | EPulse),
 | |
| 
 | |
| 		SessionBus: &BusConfig{
 | |
| 			See: nil,
 | |
| 			Talk: []string{"org.freedesktop.Notifications", "org.freedesktop.FileManager1", "org.freedesktop.ScreenSaver",
 | |
| 				"org.freedesktop.secrets", "org.kde.kwalletd5", "org.kde.kwalletd6", "org.gnome.SessionManager"},
 | |
| 			Own: []string{"org.chromium.Chromium.*", "org.mpris.MediaPlayer2.org.chromium.Chromium.*",
 | |
| 				"org.mpris.MediaPlayer2.chromium.*"},
 | |
| 			Call:      map[string]string{"org.freedesktop.portal.*": "*"},
 | |
| 			Broadcast: map[string]string{"org.freedesktop.portal.*": "@/org/freedesktop/portal/*"},
 | |
| 			Log:       false,
 | |
| 			Filter:    true,
 | |
| 		},
 | |
| 		SystemBus: &BusConfig{
 | |
| 			See:       nil,
 | |
| 			Talk:      []string{"org.bluez", "org.freedesktop.Avahi", "org.freedesktop.UPower"},
 | |
| 			Own:       nil,
 | |
| 			Call:      nil,
 | |
| 			Broadcast: nil,
 | |
| 			Log:       false,
 | |
| 			Filter:    true,
 | |
| 		},
 | |
| 		DirectWayland: false,
 | |
| 
 | |
| 		ExtraPerms: []ExtraPermConfig{
 | |
| 			{Path: fhs.AbsVarLib.Append("hakurei/u0"), Ensure: true, Execute: true},
 | |
| 			{Path: fhs.AbsVarLib.Append("hakurei/u0/org.chromium.Chromium"), Read: true, Write: true, Execute: true},
 | |
| 		},
 | |
| 
 | |
| 		Identity: 9,
 | |
| 		Groups:   []string{"video", "dialout", "plugdev"},
 | |
| 
 | |
| 		Container: &ContainerConfig{
 | |
| 			Hostname:  "localhost",
 | |
| 			WaitDelay: -1,
 | |
| 			// example API credentials pulled from Google Chrome
 | |
| 			// DO NOT USE THESE IN A REAL BROWSER
 | |
| 			Env: map[string]string{
 | |
| 				"GOOGLE_API_KEY":               "AIzaSyBHDrl33hwRp4rMQY0ziRbj8K9LPA6vUCY",
 | |
| 				"GOOGLE_DEFAULT_CLIENT_ID":     "77185425430.apps.googleusercontent.com",
 | |
| 				"GOOGLE_DEFAULT_CLIENT_SECRET": "OTJgUOQcT7lO7GsGZq2G4IlT",
 | |
| 			},
 | |
| 			Filesystem: []FilesystemConfigJSON{
 | |
| 				{&FSBind{Target: fhs.AbsRoot, Source: fhs.AbsVarLib.Append("hakurei/base/org.debian"), Write: true, Special: true}},
 | |
| 				{&FSBind{Target: fhs.AbsEtc, Source: fhs.AbsEtc, Special: true}},
 | |
| 				{&FSEphemeral{Target: fhs.AbsTmp, Write: true, Perm: 0755}},
 | |
| 				{&FSOverlay{
 | |
| 					Target: check.MustAbs("/nix/store"),
 | |
| 					Lower:  []*check.Absolute{fhs.AbsVarLib.Append("hakurei/base/org.nixos/ro-store")},
 | |
| 					Upper:  fhs.AbsVarLib.Append("hakurei/nix/u0/org.chromium.Chromium/rw-store/upper"),
 | |
| 					Work:   fhs.AbsVarLib.Append("hakurei/nix/u0/org.chromium.Chromium/rw-store/work"),
 | |
| 				}},
 | |
| 				{&FSLink{Target: fhs.AbsRun.Append("current-system"), Linkname: "/run/current-system", Dereference: true}},
 | |
| 				{&FSLink{Target: fhs.AbsRun.Append("opengl-driver"), Linkname: "/run/opengl-driver", Dereference: true}},
 | |
| 				{&FSBind{Source: fhs.AbsVarLib.Append("hakurei/u0/org.chromium.Chromium"),
 | |
| 					Target: check.MustAbs("/data/data/org.chromium.Chromium"), Write: true, Ensure: true}},
 | |
| 				{&FSBind{Source: fhs.AbsDev.Append("dri"), Device: true, Optional: true}},
 | |
| 			},
 | |
| 
 | |
| 			Username: "chronos",
 | |
| 			Shell:    fhs.AbsRun.Append("current-system/sw/bin/zsh"),
 | |
| 			Home:     check.MustAbs("/data/data/org.chromium.Chromium"),
 | |
| 
 | |
| 			Path: fhs.AbsRun.Append("current-system/sw/bin/chromium"),
 | |
| 			Args: []string{
 | |
| 				"chromium",
 | |
| 				"--ignore-gpu-blocklist",
 | |
| 				"--disable-smooth-scrolling",
 | |
| 				"--enable-features=UseOzonePlatform",
 | |
| 				"--ozone-platform=wayland",
 | |
| 			},
 | |
| 
 | |
| 			// Set all bits here so new flags trip the template test.
 | |
| 			Flags: math.MaxUint,
 | |
| 		},
 | |
| 	}
 | |
| }
 |