diff --git a/cmd/backup.go b/cmd/backup.go index 812f6f4..a489331 100644 --- a/cmd/backup.go +++ b/cmd/backup.go @@ -58,7 +58,7 @@ func (bk backup) Run(context wisski_distillery.Context) error { }) if err != nil { - return errBackupFailed.Wrap(err) + return errBackupFailed.WrapError(err) } return nil } diff --git a/cmd/rebuild.go b/cmd/rebuild.go index cf2336f..6a6566d 100644 --- a/cmd/rebuild.go +++ b/cmd/rebuild.go @@ -83,15 +83,7 @@ func (rb rebuild) Run(context wisski_distillery.Context) (err error) { } } - smanager := instance.SystemManager() - - if err := smanager.Apply(context.Context, writer, sys, true); err != nil { - return err - } - if err := smanager.RebuildSettings(context.Context, writer); err != nil { - return err - } - return nil + return instance.SystemManager().Apply(context.Context, writer, sys) }, wissKIs, status.SmartMessage(func(item *wisski.WissKI) string { return fmt.Sprintf("rebuild %q", item.Slug) })) diff --git a/internal/dis/component/server/admin/socket/actions/rebuild.go b/internal/dis/component/server/admin/socket/actions/rebuild.go index 9a22c6c..93dade5 100644 --- a/internal/dis/component/server/admin/socket/actions/rebuild.go +++ b/internal/dis/component/server/admin/socket/actions/rebuild.go @@ -30,19 +30,11 @@ func (*Rebuild) Action() InstanceAction { } func (r *Rebuild) Act(ctx context.Context, instance *wisski.WissKI, in io.Reader, out io.Writer, params ...string) error { - // read the flags of the instance to be provisioned + // read the flags of the instance to be rebuilt var system models.System if err := json.Unmarshal([]byte(params[0]), &system); err != nil { return err } - smanager := instance.SystemManager() - - if err := smanager.Apply(ctx, out, system, true); err != nil { - return err - } - if err := smanager.RebuildSettings(ctx, out); err != nil { - return err - } - return nil + return instance.SystemManager().Apply(ctx, out, system) } diff --git a/internal/dis/component/stack.go b/internal/dis/component/stack.go index 4d80b17..e112c18 100644 --- a/internal/dis/component/stack.go +++ b/internal/dis/component/stack.go @@ -13,6 +13,7 @@ import ( "github.com/FAU-CDI/wisski-distillery/pkg/execx" "github.com/FAU-CDI/wisski-distillery/pkg/unpack" "github.com/pkg/errors" + "github.com/tkw1536/pkglib/fsx" "github.com/tkw1536/pkglib/fsx/umaskfree" "github.com/tkw1536/pkglib/stream" "gopkg.in/yaml.v3" @@ -188,8 +189,9 @@ type StackWithResources struct { MakeDirsPerm fs.FileMode // permission for dirctories, defaults to [environment.DefaultDirCreate] MakeDirs []string // directories to ensure that exist - TouchFilesPerm fs.FileMode // permission for new files to touch, defaults to [environment.DefaultFileCreate] - TouchFiles []string // Files to 'touch', i.e. ensure that exist; guaranteed to be run after MakeDirs + TouchFilesPerm fs.FileMode // permission for new files to touch or create, defaults to [environment.DefaultFileCreate] + TouchFiles []string // Files to 'touch', i.e. ensure that exist; guaranteed to be run after MakeDirs + CreateFiles map[string]string // Files to 'create' but not update after they are setup; guaranteed to be run after MakeDirs } // InstallationContext is a context to install data in @@ -270,7 +272,7 @@ func (is StackWithResources) Install(ctx context.Context, progress io.Writer, co } } - // make sure that certain files exist + // touch files that should be created empty for _, name := range is.TouchFiles { // find the destination! dst := filepath.Join(is.Dir, name) @@ -280,6 +282,26 @@ func (is StackWithResources) Install(ctx context.Context, progress io.Writer, co return err } } + // make sure that certain files exist + for name, content := range is.CreateFiles { + // find the destination! + dst := filepath.Join(is.Dir, name) + + exists, err := fsx.Exists(dst) + if err != nil { + return err + } + + // create the file if it doesn't exist + if !exists { + fmt.Fprintf(progress, "[create] %s\n", dst) + if err := umaskfree.WriteFile(dst, []byte(content), umaskfree.DefaultFilePerm); err != nil { + return err + } + } else { + fmt.Fprintf(progress, "[skip] %s\n", dst) + } + } // check that the stack can be loaded { diff --git a/internal/wisski/ingredient/barrel/barrel.go b/internal/wisski/ingredient/barrel/barrel.go index f7ffc0b..c95a3c1 100644 --- a/internal/wisski/ingredient/barrel/barrel.go +++ b/internal/wisski/ingredient/barrel/barrel.go @@ -22,4 +22,7 @@ const ( OntologyDirectory = SitesDirectory + "/default/files/ontology" SitesDirectory = WebDirectory + "/sites" WissKIDirectory = WebDirectory + "/modules/contrib/wisski" + + LocalSettingsPath = "/settings/local.php" + GlobalSettingsPath = "/settings/global.php" ) diff --git a/internal/wisski/ingredient/barrel/barrel/docker-compose.yml b/internal/wisski/ingredient/barrel/barrel/docker-compose.yml index bc94b85..cacecdb 100644 --- a/internal/wisski/ingredient/barrel/barrel/docker-compose.yml +++ b/internal/wisski/ingredient/barrel/barrel/docker-compose.yml @@ -1,3 +1,4 @@ +# THIS FILE IS GENERATED AUTOMATICALLY. DO NOT EDIT. version: "3.7" services: @@ -43,6 +44,7 @@ services: - ${DATA_PATH}/data:/var/www/data:rw - ${DATA_PATH}/home:/var/www:rw - ${DATA_PATH}/hostkeys:/ssh/hostkeys:rw + - ${LOCAL_SETTINGS_PATH}:${LOCAL_SETTINGS_MOUNT}:ro networks: default: diff --git a/internal/wisski/ingredient/barrel/local.settings.php b/internal/wisski/ingredient/barrel/local.settings.php new file mode 100644 index 0000000..3dc292d --- /dev/null +++ b/internal/wisski/ingredient/barrel/local.settings.php @@ -0,0 +1,16 @@ +"; + $code = $code . "// \n"; // and store the settings try {