diff --git a/src/main/java/io/linuxserver/fleet/core/FleetApp.java b/src/main/java/io/linuxserver/fleet/core/FleetApp.java index 6e5ad9d..979ed7b 100644 --- a/src/main/java/io/linuxserver/fleet/core/FleetApp.java +++ b/src/main/java/io/linuxserver/fleet/core/FleetApp.java @@ -17,6 +17,7 @@ package io.linuxserver.fleet.core; +import io.linuxserver.fleet.web.WebServer; import io.linuxserver.fleet.web.pages.HomePage; import io.linuxserver.fleet.web.pages.LoginPage; import io.linuxserver.fleet.web.pages.ManageRepositoriesPage; @@ -32,11 +33,30 @@ import java.util.concurrent.TimeUnit; * through this class. *

*/ -class FleetApp { +public class FleetApp { + + private static final String FLEET_USER_UNDEFINED = "fleet.user.undefined"; + + private static FleetApp instance; + + public static FleetApp instance() { + + if (null == instance) { + + synchronized (FleetApp.class) { + + if (null == instance) { + instance = new FleetApp(); + } + } + } + + return instance; + } private final FleetBeans beans; - FleetApp() { + private FleetApp() { beans = new FleetBeans(); } @@ -56,25 +76,41 @@ class FleetApp { SynchronisationWebSocket synchronisationWebSocket = new SynchronisationWebSocket(); beans.getSynchronisationDelegate().registerListener(synchronisationWebSocket); - beans.getWebServer().addWebSocket("/admin/ws/sync", synchronisationWebSocket); - beans.getWebServer().addFilter( "*", new InitialUserFilterRoute(beans.getProperties().getAuthenticationType(), beans.getUserDelegate())); - beans.getWebServer().start(); + WebServer webServer = beans.getWebServer(); - beans.getWebServer().addPage( "/", new HomePage(beans.getRepositoryDelegate(), beans.getImageDelegate())); - beans.getWebServer().addGetApi( "/api/v1/images", new AllImagesApi(beans.getRepositoryDelegate(), beans.getImageDelegate())); - beans.getWebServer().addPage( "/setup", new SetupPage()); - beans.getWebServer().addPostRoute( "/setup", new RegisterInitialUserRoute(beans.getUserDelegate())); - beans.getWebServer().addPage( "/admin", new ManageRepositoriesPage(beans.getRepositoryDelegate())); - beans.getWebServer().addPage( "/admin/login", new LoginPage()); - beans.getWebServer().addPostRoute( "/admin/login", new LoginRoute(beans.getAuthenticationDelegate())); - beans.getWebServer().addPostRoute( "/admin/logout", new LogoutRoute()); - beans.getWebServer().addPostApi( "/admin/manageImage", new ManageImageApi(beans.getImageDelegate())); - beans.getWebServer().addGetApi( "/admin/getImage", new GetImageApi(beans.getImageDelegate())); - beans.getWebServer().addPostApi( "/admin/manageRepository", new ManageRepositoryApi(beans.getRepositoryDelegate())); - beans.getWebServer().addPostApi( "/admin/forceSync", new ForceSyncApi(beans.getTaskDelegate())); + webServer.addWebSocket("/admin/ws/sync", synchronisationWebSocket); + webServer.addFilter( "*", new InitialUserFilterRoute(beans.getProperties().getAuthenticationType(), beans.getUserDelegate())); + webServer.start(); + + webServer.addPage( "/", new HomePage(beans.getRepositoryDelegate(), beans.getImageDelegate())); + webServer.addGetApi( "/api/v1/images", new AllImagesApi(beans.getRepositoryDelegate(), beans.getImageDelegate())); + webServer.addPage( "/admin", new ManageRepositoriesPage(beans.getRepositoryDelegate())); + webServer.addPage( "/admin/login", new LoginPage()); + webServer.addPostRoute( "/admin/login", new LoginRoute(beans.getAuthenticationDelegate())); + webServer.addPostRoute( "/admin/logout", new LogoutRoute()); + webServer.addPostApi( "/admin/manageImage", new ManageImageApi(beans.getImageDelegate())); + webServer.addGetApi( "/admin/getImage", new GetImageApi(beans.getImageDelegate())); + webServer.addPostApi( "/admin/manageRepository", new ManageRepositoryApi(beans.getRepositoryDelegate())); + webServer.addPostApi( "/admin/forceSync", new ForceSyncApi(beans.getTaskDelegate())); + + if (initialUserNeedsConfiguring()) { + + webServer.addPage( "/setup", new SetupPage()); + webServer.addPostRoute( "/setup", new RegisterInitialUserRoute(beans.getUserDelegate())); + } } private void scheduleSync() { beans.getTaskDelegate().scheduleSynchronisationTask(beans.getProperties().getRefreshIntervalInMinutes(), TimeUnit.MINUTES); } + + private boolean initialUserNeedsConfiguring() { + + String configured = System.getProperty(FLEET_USER_UNDEFINED); + if (null == configured || "true".equalsIgnoreCase(configured)) { + System.setProperty(FLEET_USER_UNDEFINED, String.valueOf(beans.getUserDelegate().isUserRepositoryEmpty())); + } + + return "true".equalsIgnoreCase(System.getProperty(FLEET_USER_UNDEFINED)); + } } diff --git a/src/main/java/io/linuxserver/fleet/core/Main.java b/src/main/java/io/linuxserver/fleet/core/Main.java index 422f79d..427809e 100644 --- a/src/main/java/io/linuxserver/fleet/core/Main.java +++ b/src/main/java/io/linuxserver/fleet/core/Main.java @@ -20,8 +20,6 @@ package io.linuxserver.fleet.core; public class Main { public static void main(String[] args) { - - FleetApp app = new FleetApp(); - app.run(); + FleetApp.instance().run(); } } diff --git a/src/main/java/io/linuxserver/fleet/web/WebServer.java b/src/main/java/io/linuxserver/fleet/web/WebServer.java index 533afb9..dbdcb57 100644 --- a/src/main/java/io/linuxserver/fleet/web/WebServer.java +++ b/src/main/java/io/linuxserver/fleet/web/WebServer.java @@ -37,10 +37,19 @@ public class WebServer { staticFiles.expireTime(600); } + public void stopServer() { + + stop(); + + started = false; + } + public void start() { started = true; + init(); + path("/admin", configureAuthorisationRoute("")); path("/admin", configureAuthorisationRoute("/images")); path("/admin", configureAuthorisationRoute("/manageImage")); diff --git a/src/main/java/io/linuxserver/fleet/web/routes/InitialUserFilterRoute.java b/src/main/java/io/linuxserver/fleet/web/routes/InitialUserFilterRoute.java index feb4716..e3d78bd 100644 --- a/src/main/java/io/linuxserver/fleet/web/routes/InitialUserFilterRoute.java +++ b/src/main/java/io/linuxserver/fleet/web/routes/InitialUserFilterRoute.java @@ -53,7 +53,7 @@ public class InitialUserFilterRoute implements Filter { if (databaseAuthenticationEnabled) { if (!initialUserNeedsConfiguring() && "/setup".equals(request.pathInfo())) { - halt(401); + halt(401); // FIXME: I'm unhappy halting here. Need to get the filter chain correct. } else if (initialUserNeedsConfiguring() && !pathIsExempted(request.pathInfo())) { diff --git a/src/main/resources/spark/template/freemarker/setup.ftl b/src/main/resources/spark/template/freemarker/setup.ftl index 3e4c045..c7ff1a0 100644 --- a/src/main/resources/spark/template/freemarker/setup.ftl +++ b/src/main/resources/spark/template/freemarker/setup.ftl @@ -15,7 +15,7 @@

Create a user

-
+