From 6eab3ac31131f53199c3ae7b649c91403e99d90f Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Mon, 1 Apr 2024 15:10:35 +0200 Subject: [PATCH] Add initial setup global settings --- cmd/rebuild.go | 10 ++++- .../server/admin/socket/actions/rebuild.go | 11 ++++- .../wisski/ingredient/barrel/manager/apply.go | 1 + .../ingredient/barrel/manager/provision.go | 15 +++---- .../ingredient/barrel/system/settings.go | 27 +++++++++++++ .../wisski/ingredient/php/extras/settings.go | 20 +++++++++- .../wisski/ingredient/php/extras/settings.php | 40 ++++++++++++++++++- 7 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 internal/wisski/ingredient/barrel/system/settings.go diff --git a/cmd/rebuild.go b/cmd/rebuild.go index 27676a9..cf2336f 100644 --- a/cmd/rebuild.go +++ b/cmd/rebuild.go @@ -83,7 +83,15 @@ func (rb rebuild) Run(context wisski_distillery.Context) (err error) { } } - return instance.SystemManager().Apply(context.Context, writer, sys, true) + 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 }, 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 21f63f4..9a22c6c 100644 --- a/internal/dis/component/server/admin/socket/actions/rebuild.go +++ b/internal/dis/component/server/admin/socket/actions/rebuild.go @@ -35,5 +35,14 @@ func (r *Rebuild) Act(ctx context.Context, instance *wisski.WissKI, in io.Reader if err := json.Unmarshal([]byte(params[0]), &system); err != nil { return err } - return instance.SystemManager().Apply(ctx, out, system, true) + + 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 } diff --git a/internal/wisski/ingredient/barrel/manager/apply.go b/internal/wisski/ingredient/barrel/manager/apply.go index 03bc8bc..2f9c174 100644 --- a/internal/wisski/ingredient/barrel/manager/apply.go +++ b/internal/wisski/ingredient/barrel/manager/apply.go @@ -11,6 +11,7 @@ import ( ) // Apply applies the given profile to this existing instance. +// The instance must be running func (manager *Manager) Apply(ctx context.Context, progress io.Writer, flags Profile) error { // Update drupal if flags.Drupal != "" { diff --git a/internal/wisski/ingredient/barrel/manager/provision.go b/internal/wisski/ingredient/barrel/manager/provision.go index 3acf4ac..bb803f7 100644 --- a/internal/wisski/ingredient/barrel/manager/provision.go +++ b/internal/wisski/ingredient/barrel/manager/provision.go @@ -127,6 +127,14 @@ func (provision *Manager) bootstrap(ctx context.Context, progress io.Writer, fla } } + // Rebuild the settings file + logging.LogMessage(progress, "Rebuilding Settings") + { + if err := provision.dependencies.SystemManager.RebuildSettings(ctx, progress); err != nil { + return err + } + } + // Create directory for ontologies logging.LogMessage(progress, fmt.Sprintf("Creating %q", barrel.OntologyDirectory)) { @@ -168,13 +176,6 @@ func (provision *Manager) bootstrap(ctx context.Context, progress io.Writer, fla } } - logging.LogMessage(progress, "Updating TRUSTED_HOST_PATTERNS in settings.php") - { - if err := provision.dependencies.Settings.SetTrustedDomain(ctx, nil, provision.Domain()); err != nil { - return err - } - } - logging.LogMessage(progress, "Running initial cron") { if err := provision.dependencies.Drush.Exec(ctx, progress, "core-cron"); err != nil { diff --git a/internal/wisski/ingredient/barrel/system/settings.go b/internal/wisski/ingredient/barrel/system/settings.go new file mode 100644 index 0000000..123b820 --- /dev/null +++ b/internal/wisski/ingredient/barrel/system/settings.go @@ -0,0 +1,27 @@ +package system + +import ( + "context" + "io" + + "github.com/FAU-CDI/wisski-distillery/pkg/logging" +) + +// RebuildSettings (re-)configures settings.php for the provided running instance +func (smanager *SystemManager) RebuildSettings(ctx context.Context, progress io.Writer) (err error) { + logging.LogMessage(progress, "Updating TRUSTED_HOST_PATTERNS in settings.php") + { + if err := smanager.dependencies.Settings.SetTrustedDomain(ctx, nil, smanager.Domain()); err != nil { + return err + } + } + + logging.LogMessage(progress, "Adding distillery settings to settings.php") + { + if err := smanager.dependencies.Settings.InstallDistillerySettings(ctx, nil); err != nil { + return err + } + } + + return nil +} diff --git a/internal/wisski/ingredient/php/extras/settings.go b/internal/wisski/ingredient/php/extras/settings.go index cdb247d..41ef4ad 100644 --- a/internal/wisski/ingredient/php/extras/settings.go +++ b/internal/wisski/ingredient/php/extras/settings.go @@ -36,7 +36,10 @@ func (settings *Settings) Set(ctx context.Context, server *phpx.Server, key stri return err } -var errFailedToSetTrustedDomain = errors.New("failed to set trusted domain") +var ( + errFailedToSetTrustedDomain = errors.New("failed to set trusted domain") + errFailedInstallDistillerySettings = errors.New("failed to install distillery settings") +) func (settings *Settings) SetTrustedDomain(ctx context.Context, server *phpx.Server, domain string) error { var ok bool @@ -47,3 +50,18 @@ func (settings *Settings) SetTrustedDomain(ctx context.Context, server *phpx.Ser } return err } + +// GlobalSettingsPath is the global path to distillery settings +const GlobalSettingsPath = "/distillery_settings.php" + +func (settings *Settings) InstallDistillerySettings(ctx context.Context, server *phpx.Server) error { + var ok bool + + err := settings.dependencies.PHP.ExecScript(ctx, server, &ok, settingsPHP, "install_settings_include", []string{ + GlobalSettingsPath, + }) + if err == nil && !ok { + err = errFailedInstallDistillerySettings + } + return err +} diff --git a/internal/wisski/ingredient/php/extras/settings.php b/internal/wisski/ingredient/php/extras/settings.php index 1dafaee..3a66455 100644 --- a/internal/wisski/ingredient/php/extras/settings.php +++ b/internal/wisski/ingredient/php/extras/settings.php @@ -40,7 +40,6 @@ function set_setting(string $name, mixed $value): bool { try { drupal_rewrite_settings($settings, $filename); } catch(Throwable $t) { - throw $t; // DEBUG return FALSE; } @@ -52,4 +51,43 @@ function set_setting(string $name, mixed $value): bool { /** Sets the trusted host to the specified domain */ function set_trusted_domain(string $domain): bool { return set_setting("trusted_host_patterns", [preg_quote($domain)]); +} + +/** Sets up including a settings.php file from the given path */ +function install_settings_include(array $paths): bool { + // find the original filename + $filename = DRUPAL_ROOT . "/" . \Drupal::getContainer()->getParameter("site.path") . "/settings.php"; + + // read the original file + $original_content = file_get_contents($filename); + if ($original_content === FALSE) { + return FALSE; + } + + // remove any old + $pattern = '/\/\/(\s*)(.*?)\/\/(\s*)<\/distillery-settings-include>/s'; + $new_content = preg_replace($pattern, '', $originalContent); + + $code = "// >\n//\n// DO NOT MODIFY THIS BLOCK AND KEEP IT AT THE END OF THE FILE.\n// DO NOT REMOVE CONFIG TAGS\n"; + foreach ($paths as $path) { + // escape the path to be included + $the_path = "'" . addslashes($path) . "'"; + // resolve it (if it isn't absolute) + if (!str_starts_with($path, '/')) { + $the_path = '$app_root . \'/\' . $site_path . \'/\' . ' . $the_path; + } + + // add code to include the file if it exists + $code = $code . 'if (file_exists(' . $the_path . ')) { include_once ' . $the_path . '; }' . "\n"; + } + $code = $code . "// "; + + // and store the settings + try { + file_put_contents($filename, $original_content . $code); + } catch(Throwable $t) { + return FALSE; + } + + return TRUE; } \ No newline at end of file