summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/skiff/main.go28
1 files changed, 27 insertions, 1 deletions
diff --git a/cmd/skiff/main.go b/cmd/skiff/main.go
index 1c48681..7c9d505 100644
--- a/cmd/skiff/main.go
+++ b/cmd/skiff/main.go
@@ -16,6 +16,7 @@ import (
"skiff/internal/envfile"
"skiff/internal/jailmgr"
"skiff/internal/layout"
+ "skiff/internal/lock"
"skiff/internal/sh"
"skiff/internal/tmpl"
"skiff/internal/zfsutil"
@@ -65,7 +66,14 @@ func cmdDeploy(args []string) error {
return nil
}
- return deploy.Run(context.Background(), os.Stdout, layout.Default(), *app, *newSHA)
+ cfg := layout.Default()
+ unlock, err := lock.Acquire(cfg.LockPath(*app))
+ if err != nil {
+ return fmt.Errorf("acquire app lock: %w", err)
+ }
+ defer unlock.Release()
+
+ return deploy.Run(context.Background(), os.Stdout, cfg, *app, *newSHA)
}
func cmdNewApp(args []string) error {
@@ -89,6 +97,12 @@ func cmdNewApp(args []string) error {
out := os.Stdout
cfg := layout.Default()
+ unlock, err := lock.Acquire(cfg.LockPath(*name))
+ if err != nil {
+ return fmt.Errorf("acquire app lock: %w", err)
+ }
+ defer unlock.Release()
+
fmt.Fprintf(out, "==> cloning %s@%s -> %s\n", cfg.BaseDataset, *baseSnapshot, cfg.AppDataset(*name))
if err := zfsutil.Clone(ctx, out, cfg.BaseDataset, *baseSnapshot, cfg.AppDataset(*name), cfg.JailRoot(*name)); err != nil {
return fmt.Errorf("clone base dataset: %w", err)
@@ -161,6 +175,12 @@ func cmdRollback(args []string) error {
return fmt.Errorf("--to is required (use --list to see snapshots)")
}
+ unlock, err := lock.Acquire(cfg.LockPath(*app))
+ if err != nil {
+ return fmt.Errorf("acquire app lock: %w", err)
+ }
+ defer unlock.Release()
+
if err := zfsutil.Rollback(ctx, os.Stdout, dataset, *to); err != nil {
return fmt.Errorf("rollback: %w", err)
}
@@ -275,6 +295,12 @@ func applyConfigChange(app string, mutate func(map[string]string) error) error {
return fmt.Errorf("app %q not found: %w", app, err)
}
+ unlock, err := lock.Acquire(cfg.LockPath(app))
+ if err != nil {
+ return fmt.Errorf("acquire app lock: %w", err)
+ }
+ defer unlock.Release()
+
kv, err := envfile.Load(cfg.EnvPath(app))
if err != nil {
return fmt.Errorf("load config: %w", err)