mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-12-02 15:39:57 +00:00
Add global CAPTCHA config and EspoCRM seeder
- Introduce shared CAPTCHA settings and RECAPTCHA_ENABLED/HCAPTCHA_ENABLED flags in group_vars - Wire reCAPTCHA/hCaptcha credentials into EspoCRM, Keycloak, Listmonk and Nextcloud - Replace EspoCRM set_flags.php with generic seed_config.php and hook it into entrypoint/env - Fix run_once handling in sys-ctl-cln-disc-space and minor CSS Jinja spacing issue https://chatgpt.com/share/692a1d4f-1154-800f-a4ae-bb068aa24a53
This commit is contained in:
147
roles/web-app-espocrm/files/seed_config.php
Normal file
147
roles/web-app-espocrm/files/seed_config.php
Normal file
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
/**
|
||||
* Generic EspoCRM config seeder.
|
||||
*
|
||||
* Automatically scans all environment variables starting with ESPOCRM_SEED_,
|
||||
* converts them into EspoCRM camelCase config keys, and writes them via ConfigWriter.
|
||||
*
|
||||
* Example:
|
||||
* ESPOCRM_SEED_RECAPTCHA_SECRET_KEY=xyz
|
||||
* becomes:
|
||||
* recaptchaSecretKey => "xyz"
|
||||
*/
|
||||
|
||||
require "/var/www/html/bootstrap.php";
|
||||
|
||||
$app = new \Espo\Core\Application();
|
||||
$c = $app->getContainer();
|
||||
$config = $c->get("config");
|
||||
$writer = $c->get("injectableFactory")->create("\Espo\Core\Utils\Config\ConfigWriter");
|
||||
|
||||
/**
|
||||
* Convert an ENV suffix like "RECAPTCHA_SECRET_KEY" to camelCase "recaptchaSecretKey".
|
||||
*/
|
||||
function to_camel_case(string $input): string
|
||||
{
|
||||
$input = strtolower($input);
|
||||
$parts = explode('_', $input);
|
||||
$result = array_shift($parts);
|
||||
|
||||
foreach ($parts as $part) {
|
||||
$result .= ucfirst($part);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize booleans if the value looks boolean-like.
|
||||
* Returns true/false for typical boolean strings, otherwise the original string.
|
||||
*/
|
||||
function cast_value(string $value)
|
||||
{
|
||||
$normalized = strtolower(trim($value));
|
||||
|
||||
if (in_array($normalized, ['1', 'true', 'yes', 'on'], true)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (in_array($normalized, ['0', 'false', 'no', 'off'], true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $value; // keep as string
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple debug logger to STDERR.
|
||||
* This keeps STDOUT clean so automation can rely on "CHANGED"/"UNCHANGED".
|
||||
*/
|
||||
function seed_debug(string $message): void
|
||||
{
|
||||
fwrite(STDERR, "[seed] " . $message . PHP_EOL);
|
||||
}
|
||||
|
||||
// Determine debug mode from ESPOCRM_SEED_DEBUG
|
||||
$debugEnv = getenv('ESPOCRM_SEED_DEBUG');
|
||||
$debug = false;
|
||||
if ($debugEnv !== false) {
|
||||
$normalized = strtolower(trim($debugEnv));
|
||||
$debug = in_array($normalized, ['1', 'true', 'yes', 'on'], true);
|
||||
}
|
||||
|
||||
if ($debug) {
|
||||
seed_debug("Seeder started, scanning ESPOCRM_SEED_* variables …");
|
||||
}
|
||||
|
||||
$changed = false;
|
||||
|
||||
foreach ($_ENV as $envKey => $envValue) {
|
||||
// Only process variables beginning with ESPOCRM_SEED_
|
||||
if (strpos($envKey, 'ESPOCRM_SEED_') !== 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Extract the config part (after prefix)
|
||||
$rawKey = substr($envKey, strlen('ESPOCRM_SEED_')); // e.g. "RECAPTCHA_SECRET_KEY"
|
||||
|
||||
if ($rawKey === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Convert to camelCase
|
||||
$configKey = to_camel_case($rawKey);
|
||||
|
||||
// Normalize boolean or keep string
|
||||
$value = cast_value((string) $envValue);
|
||||
|
||||
if ($debug) {
|
||||
seed_debug(sprintf(
|
||||
"ENV %s -> config key '%s' = %s",
|
||||
$envKey,
|
||||
$configKey,
|
||||
var_export($value, true)
|
||||
));
|
||||
}
|
||||
|
||||
$current = $config->get($configKey);
|
||||
|
||||
if ($current !== $value) {
|
||||
if ($debug) {
|
||||
seed_debug(sprintf(
|
||||
"Updating '%s': %s -> %s",
|
||||
$configKey,
|
||||
var_export($current, true),
|
||||
var_export($value, true)
|
||||
));
|
||||
}
|
||||
|
||||
$writer->set($configKey, $value);
|
||||
$changed = true;
|
||||
} else {
|
||||
if ($debug) {
|
||||
seed_debug(sprintf(
|
||||
"No change for '%s' (already %s)",
|
||||
$configKey,
|
||||
var_export($current, true)
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($changed) {
|
||||
if ($debug) {
|
||||
seed_debug("Changes detected, saving configuration …");
|
||||
}
|
||||
$writer->save();
|
||||
echo "CHANGED\n";
|
||||
} else {
|
||||
if ($debug) {
|
||||
seed_debug("No changes detected.");
|
||||
}
|
||||
echo "UNCHANGED\n";
|
||||
}
|
||||
|
||||
if ($debug) {
|
||||
seed_debug("Seeder finished.");
|
||||
}
|
||||
Reference in New Issue
Block a user