diff --git a/app/Actions/Server/StartLogDrain.php b/app/Actions/Server/StartLogDrain.php index 11bf160f57..638f4a0103 100644 --- a/app/Actions/Server/StartLogDrain.php +++ b/app/Actions/Server/StartLogDrain.php @@ -221,11 +221,12 @@ Files: } /** - * Fluent Bit reads its config line by line, so a value with a line break could add sections. + * Fluent Bit reads its config line by line, so a value with a line break could add sections, + * and the modify filter splits `Set` on spaces, so the value must be a single token. */ private function fluentBitValue(string $value): string { - return trim(preg_replace('/\s*[\x00-\x1F\x7F]+\s*/', ' ', $value)); + return preg_replace('/[\s\x00-\x1F\x7F]+/', '-', trim($value)); } private function logDrainNetworkConnectCommands(Server $server): array diff --git a/tests/Feature/LogDrain/LogDrainServerNameTest.php b/tests/Feature/LogDrain/LogDrainServerNameTest.php index 3445e5e712..0993fee879 100644 --- a/tests/Feature/LogDrain/LogDrainServerNameTest.php +++ b/tests/Feature/LogDrain/LogDrainServerNameTest.php @@ -41,10 +41,37 @@ test('a server name with a line break cannot add a section to the fluent-bit con preg_match("/echo '([A-Za-z0-9+\\/=]+)' \\| base64 -d \\| tee \\S+\\/fluent-bit\\.conf/", $commands->implode("\n"), $matches); $config = base64_decode($matches[1]); - expect($config)->toContain("Set coolify.server_name prod [OUTPUT] Name stdout Match *\n") + expect($config)->toContain("Set coolify.server_name prod-[OUTPUT]-Name-stdout-Match-*\n") ->and(preg_match_all('/^\[OUTPUT\]/m', $config))->toBe(1) ->and($config)->not->toMatch('/^\s*Name stdout/m'); })->with([ 'new relic' => [['is_logdrain_newrelic_enabled' => true, 'logdrain_newrelic_license_key' => 'key', 'logdrain_newrelic_base_uri' => 'https://log-api.newrelic.com/log/v1']], 'axiom' => [['is_logdrain_axiom_enabled' => true, 'logdrain_axiom_dataset_name' => 'dataset', 'logdrain_axiom_api_key' => 'key']], ]); + +test('a server name with spaces is written as a single fluent-bit value', function (array $settings) { + $team = Team::factory()->create(); + $server = Server::factory()->create([ + 'team_id' => $team->id, + 'name' => 'Test Server #1', + 'private_key_id' => PrivateKey::factory()->create(['team_id' => $team->id])->id, + ]); + $server->settings()->update($settings); + + $commands = new Collection; + Process::fake(function ($process) use ($commands) { + $commands->push($process->command); + + return Process::result(); + }); + + StartLogDrain::run($server->fresh()); + + preg_match("/echo '([A-Za-z0-9+\\/=]+)' \\| base64 -d \\| tee \\S+\\/fluent-bit\\.conf/", $commands->implode("\n"), $matches); + $config = base64_decode($matches[1]); + + expect($config)->toContain("Set coolify.server_name Test-Server-#1\n"); +})->with([ + 'new relic' => [['is_logdrain_newrelic_enabled' => true, 'logdrain_newrelic_license_key' => 'key', 'logdrain_newrelic_base_uri' => 'https://log-api.newrelic.com/log/v1']], + 'axiom' => [['is_logdrain_axiom_enabled' => true, 'logdrain_axiom_dataset_name' => 'dataset', 'logdrain_axiom_api_key' => 'key']], +]);