package de.stadtbote.votian; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.stadtbote.votian.database.DatabaseDiagnostics; import java.util.Arrays; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class VotianApplication { public static void main(String[] args) { if (Arrays.asList(args).contains("--database-check")) { System.exit(databaseCheck()); } SpringApplication.run(VotianApplication.class, args); } private static int databaseCheck() { SpringApplication application = new SpringApplication(VotianApplication.class); application.setWebApplicationType(WebApplicationType.NONE); application.setBannerMode(Banner.Mode.OFF); application.setLogStartupInfo(false); DatabaseDiagnostics.Result result; // Keep stdout machine-readable and prevent JDBC startup errors exposing connection details. try (ConfigurableApplicationContext context = application.run( "--spring.main.web-application-type=none", "--spring.main.banner-mode=off", "--logging.level.root=OFF", "--logging.level.com.zaxxer.hikari=OFF", "--logging.level.org.mariadb.jdbc=OFF")) { result = context.getBean(DatabaseDiagnostics.class).check(); } catch (RuntimeException error) { result = DatabaseDiagnostics.failure("CONFIGURATION_ERROR", "Backend-Konfiguration oder Datenbankverbindung prüfen.", null); } try { System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(result.details())); } catch (JsonProcessingException error) { System.out.println("{\"connected\":false,\"reason\":\"DIAGNOSTIC_ERROR\",\"message\":\"Diagnose konnte nicht ausgegeben werden.\",\"writes\":0}"); return 1; } return result.exitCode(); } }