aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmd/app/main.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-09-17 02:30:10 +0900
committerOphestra <cat@gensokyo.uk>2026-09-17 02:30:10 +0900
commit4078289cdadb4def6ae28428ce8bf3c7907f66f1 (patch)
treefd7c9dd9192cc4bb9aeb94c1efb7411687535231 /cmd/app/main.go
parent3fbdf138bb7ce07319d2c9e3d89b3a3892e139d2 (diff)
cmd/app: alternative merged template layout
This implements an optional, alternative template layout to accommodate ZFS and equivalent setups where each template occupies a different filesystem. In such a setup, the default, separate workdir is unusable as overlayfs requires the workdir to reside on the same filesystem as the writable upperdir. The "merge" build tag enables this alternative behaviour. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'cmd/app/main.go')
-rw-r--r--cmd/app/main.go35
1 files changed, 18 insertions, 17 deletions
diff --git a/cmd/app/main.go b/cmd/app/main.go
index 5f796cfc..9b51d601 100644
--- a/cmd/app/main.go
+++ b/cmd/app/main.go
@@ -37,7 +37,7 @@ func main() {
flagBase string
flagInsecure bool
- base, template, initial *check.Absolute
+ b *base
)
c := command.New(os.Stderr, log.Printf, "app", func([]string) (err error) {
msg.SwapVerbose(flagVerbose)
@@ -45,14 +45,15 @@ func main() {
if flagBase == "" {
flagBase = "state"
}
+
+ var a *check.Absolute
if flagBase, err = filepath.Abs(flagBase); err != nil {
return
- } else if base, err = check.NewAbs(flagBase); err != nil {
+ } else if a, err = check.NewAbs(flagBase); err != nil {
return
}
+ b = (*base)(a)
- template = base.Append("template")
- initial = base.Append("initial")
return
}).Flag(
&flagVerbose,
@@ -77,7 +78,7 @@ func main() {
"enter", "Enter mutable state template",
func(args []string) error {
if len(args) != 1 {
- return list(template, true)
+ return list(b.append("template"), true)
}
config := hst.Config{
@@ -87,9 +88,9 @@ func main() {
Filesystem: []hst.FilesystemConfigJSON{
{FilesystemConfig: &hst.FSOverlay{
Target: fhs.AbsRoot,
- Lower: []*check.Absolute{initial},
- Upper: template.Append(args[0]),
- Work: base.Append("work", args[0]),
+ Lower: []*check.Absolute{b.initial()},
+ Upper: b.template(args[0]),
+ Work: b.work(args[0]),
}},
{FilesystemConfig: &hst.FSEphemeral{
Target: fhs.AbsTmp,
@@ -123,7 +124,7 @@ func main() {
config.Container.Home = a
}
- remove, err := acquireTemplate(base, args[0])
+ remove, err := acquireTemplate(b, args[0])
if err != nil {
return err
}
@@ -149,19 +150,19 @@ func main() {
"run", "Start the named application",
func(args []string) error {
if len(args) < 1 {
- return list(base.Append("app"), false)
+ return list(b.append("app"), false)
}
var config *hst.Config
var r io.Reader
- f, err := os.Open(base.Append("app", args[0]).String())
+ f, err := os.Open(b.append("app", args[0]).String())
if err != nil {
return err
}
r = f
var common *os.File
- if common, err = os.Open(base.Append("common").String()); err != nil {
+ if common, err = os.Open(b.append("common").String()); err != nil {
if !errors.Is(err, os.ErrNotExist) {
_ = f.Close()
return err
@@ -171,7 +172,7 @@ func main() {
}
var name string
- config, err = parse(args[0], base, r, &name)
+ config, err = parse(args[0], b, r, &name)
if closeErr := f.Close(); err == nil {
err = closeErr
}
@@ -188,7 +189,7 @@ func main() {
config.Container.Args[2] = flagCommand
}
- if err = enterTemplate(base, name); err != nil {
+ if err = enterTemplate(b, name); err != nil {
return err
}
return run(ctx, msg, flagInsecure, config, args[1:]...)
@@ -231,7 +232,7 @@ func main() {
"next", "Find next unused identity",
func([]string) error {
var names []string
- if dents, err := os.ReadDir(base.Append("app").String()); err != nil {
+ if dents, err := os.ReadDir(b.append("app").String()); err != nil {
return err
} else {
names = make([]string, 0, len(dents))
@@ -246,12 +247,12 @@ func main() {
apps := make([]*hst.Config, len(names))
for i, name := range names {
- r, err := os.Open(base.Append("app", name).String())
+ r, err := os.Open(b.append("app", name).String())
if err != nil {
return err
}
- apps[i], err = parse(name, base, r, nil)
+ apps[i], err = parse(name, b, r, nil)
if closeErr := r.Close(); err == nil {
err = closeErr
}