From dda4ad09958d19fae1df5b184bae25c34a16a98f Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Thu, 30 Jul 2020 15:10:24 +0200 Subject: [PATCH 1/5] Update lib --- utils/cobbzilla-wizard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/cobbzilla-wizard b/utils/cobbzilla-wizard index 360ea806..17208b8f 160000 --- a/utils/cobbzilla-wizard +++ b/utils/cobbzilla-wizard @@ -1 +1 @@ -Subproject commit 360ea8067406a3babdf8cd6488a4f5c391ac36bf +Subproject commit 17208b8f45779d021da7fa00f26e117c3567e155 -- 2.17.1 From 92cb1f435cf8474c9a435b89e8396d43f23fff57 Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Thu, 30 Jul 2020 15:17:04 +0200 Subject: [PATCH 2/5] Set log flag's TTL witin API call --- .../bubble/resources/cloud/LogsResource.java | 17 +++++++++++++---- .../bubble/service/boot/SelfNodeService.java | 5 ++++- .../service/boot/StandardSelfNodeService.java | 9 +++++---- .../DbFilterSelfNodeService.java | 7 ++++++- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java b/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java index 2ea1623f..f4c3500c 100644 --- a/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java +++ b/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java @@ -10,9 +10,12 @@ import lombok.NonNull; import org.glassfish.jersey.server.ContainerRequest; import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.Nullable; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import java.util.Optional; +import java.util.concurrent.TimeUnit; import static bubble.ApiConstants.*; import static org.cobbzilla.util.http.HttpContentTypes.APPLICATION_JSON; @@ -37,13 +40,19 @@ public class LogsResource { } @POST @Path(EP_START) - @NonNull public Response startLogging(@NonNull @Context final ContainerRequest ctx) { return setLogFlag(true); } + @NonNull public Response startLogging(@NonNull @Context final ContainerRequest ctx, + @Nullable @QueryParam("ttlDays") final Byte ttlDays) { + return setLogFlag(true, Optional.ofNullable(ttlDays)); + } + @POST @Path(EP_STOP) - @NonNull public Response stopLogging(@NonNull @Context final ContainerRequest ctx) { return setLogFlag(false); } + @NonNull public Response stopLogging(@NonNull @Context final ContainerRequest ctx) { + return setLogFlag(false, Optional.empty()); + } - @NonNull private Response setLogFlag(final boolean b) { + @NonNull private Response setLogFlag(final boolean b, @NonNull final Optional ttlInDays) { if (!account.admin()) throw forbiddenEx(); // caller must be admin - selfNodeService.setLogFlag(b); + selfNodeService.setLogFlag(b, ttlInDays.map(days -> (int) TimeUnit.DAYS.toSeconds(days))); return ok(); } } diff --git a/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java b/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java index afa89650..1ec7adcb 100644 --- a/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java @@ -7,6 +7,9 @@ package bubble.service.boot; import bubble.model.bill.BubblePlan; import bubble.model.cloud.BubbleNetwork; import bubble.model.cloud.BubbleNode; +import lombok.NonNull; + +import java.util.Optional; public interface SelfNodeService { @@ -25,5 +28,5 @@ public interface SelfNodeService { BubblePlan getThisPlan(); Boolean getLogFlag(); - void setLogFlag(final boolean logFlag); + void setLogFlag(final boolean logFlag, @NonNull final Optional ttlInSeconds); } diff --git a/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java b/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java index 68c1a692..5389f04b 100644 --- a/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java @@ -41,6 +41,7 @@ import org.springframework.stereotype.Service; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -72,8 +73,8 @@ public class StandardSelfNodeService implements SelfNodeService { public static final long MIN_SAGE_KEY_TTL = MINUTES.toMillis(5); private static final String REDIS_LOG_FLAG_KEY = "bubble_server_logs_enabled"; - private static final long TTL_LOG_FLAG_NODE = DAYS.toSeconds(7); - private static final long TTL_LOG_FLAG_SAGE = DAYS.toSeconds(30); + private static final int TTL_LOG_FLAG_NODE = (int) DAYS.toSeconds(7); + private static final int TTL_LOG_FLAG_SAGE = (int) DAYS.toSeconds(30); @Autowired private BubbleNodeDAO nodeDAO; @Autowired private BubbleNodeKeyDAO nodeKeyDAO; @@ -448,10 +449,10 @@ public class StandardSelfNodeService implements SelfNodeService { } @Override - public void setLogFlag(final boolean logFlag) { + public void setLogFlag(final boolean logFlag, @NonNull final Optional ttlInSeconds) { if (logFlag) { getNodeConfig().set_plaintext(REDIS_LOG_FLAG_KEY, "true", EX, - isSelfSage() ? TTL_LOG_FLAG_SAGE : TTL_LOG_FLAG_NODE); + ttlInSeconds.orElse(isSelfSage() ? TTL_LOG_FLAG_SAGE : TTL_LOG_FLAG_NODE)); } else { // just (try to) remove the flag getNodeConfig().del(REDIS_LOG_FLAG_KEY); diff --git a/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java b/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java index 22b5b25f..8fe6de10 100644 --- a/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java @@ -8,8 +8,11 @@ import bubble.model.bill.BubblePlan; import bubble.model.cloud.BubbleNetwork; import bubble.model.cloud.BubbleNode; import bubble.service.boot.SelfNodeService; +import lombok.NonNull; import org.springframework.stereotype.Service; +import java.util.Optional; + import static org.cobbzilla.util.daemon.ZillaRuntime.notSupported; @Service @@ -30,6 +33,8 @@ public class DbFilterSelfNodeService implements SelfNodeService { @Override public BubblePlan getThisPlan() { return notSupported("getThisPlan"); } @Override public Boolean getLogFlag() { return notSupported("getLogFlag"); } - @Override public void setLogFlag(boolean logFlag) { notSupported("setLogFlag"); } + @Override public void setLogFlag(boolean logFlag, @NonNull final Optional ttlInSeconds) { + notSupported("setLogFlag"); + } } -- 2.17.1 From b603d997da6461c0a06c8e6d71ba8ecb9b4e221a Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Fri, 31 Jul 2020 08:22:28 +0200 Subject: [PATCH 3/5] Speed up reading of log flag --- .../main/java/bubble/service/boot/SelfNodeService.java | 2 +- .../bubble/service/boot/StandardSelfNodeService.java | 9 ++++----- .../bubble/service_dbfilter/DbFilterSelfNodeService.java | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java b/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java index 1ec7adcb..7ca7beb7 100644 --- a/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java @@ -27,6 +27,6 @@ public interface SelfNodeService { BubblePlan getThisPlan(); - Boolean getLogFlag(); + boolean getLogFlag(); void setLogFlag(final boolean logFlag, @NonNull final Optional ttlInSeconds); } diff --git a/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java b/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java index 5389f04b..4e066d14 100644 --- a/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java @@ -53,8 +53,7 @@ import static bubble.server.BubbleServer.isRestoreMode; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.function.Predicate.not; -import static org.cobbzilla.util.daemon.ZillaRuntime.background; -import static org.cobbzilla.util.daemon.ZillaRuntime.die; +import static org.cobbzilla.util.daemon.ZillaRuntime.*; import static org.cobbzilla.util.io.FileUtil.abs; import static org.cobbzilla.util.io.FileUtil.toFileOrDie; import static org.cobbzilla.util.json.JsonUtil.*; @@ -443,9 +442,9 @@ public class StandardSelfNodeService implements SelfNodeService { } @Override - public Boolean getLogFlag() { - if (!getNodeConfig().exists(REDIS_LOG_FLAG_KEY)) return false; - return Boolean.valueOf(getNodeConfig().get_plaintext(REDIS_LOG_FLAG_KEY)); + public boolean getLogFlag() { + var flagStr = getNodeConfig().get_plaintext(REDIS_LOG_FLAG_KEY); + return empty(flagStr) ? false : Boolean.valueOf(flagStr); } @Override diff --git a/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java b/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java index 8fe6de10..40c03c55 100644 --- a/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java @@ -32,7 +32,7 @@ public class DbFilterSelfNodeService implements SelfNodeService { @Override public BubblePlan getThisPlan() { return notSupported("getThisPlan"); } - @Override public Boolean getLogFlag() { return notSupported("getLogFlag"); } + @Override public boolean getLogFlag() { return notSupported("getLogFlag"); } @Override public void setLogFlag(boolean logFlag, @NonNull final Optional ttlInSeconds) { notSupported("setLogFlag"); } -- 2.17.1 From 15c0ba770ed5ea57292ebea57298535686ef1297 Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Fri, 31 Jul 2020 11:09:34 +0200 Subject: [PATCH 4/5] Add expire time in log flag status response --- .../src/main/java/bubble/resources/cloud/LogsResource.java | 6 +++++- .../src/main/java/bubble/service/boot/SelfNodeService.java | 7 +++++++ .../java/bubble/service/boot/StandardSelfNodeService.java | 6 ++++++ .../bubble/service_dbfilter/DbFilterSelfNodeService.java | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java b/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java index f4c3500c..68cd80ce 100644 --- a/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java +++ b/bubble-server/src/main/java/bubble/resources/cloud/LogsResource.java @@ -14,6 +14,7 @@ import javax.annotation.Nullable; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import java.util.HashMap; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -36,7 +37,10 @@ public class LogsResource { @GET @Path(EP_STATUS) @NonNull public Response getLoggingStatus(@NonNull @Context final ContainerRequest ctx) { - return ok(selfNodeService.getLogFlag()); + final var flag = new HashMap(2); + flag.put("flag", selfNodeService.getLogFlag()); + flag.put("expireAt", selfNodeService.getLogFlagExpirationTime().orElse(null)); + return ok(flag); } @POST @Path(EP_START) diff --git a/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java b/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java index 7ca7beb7..2d490a06 100644 --- a/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service/boot/SelfNodeService.java @@ -28,5 +28,12 @@ public interface SelfNodeService { BubblePlan getThisPlan(); boolean getLogFlag(); + + /** + * @return Empty if TTL for log flag is a special one (less than 0), else timestamp (milliseconds) when log flag + * will be expired (to be precise, a very close time after the real expiration time as some time is spent + * for processing here). + */ + @NonNull Optional getLogFlagExpirationTime(); void setLogFlag(final boolean logFlag, @NonNull final Optional ttlInSeconds); } diff --git a/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java b/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java index 4e066d14..3e48b889 100644 --- a/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service/boot/StandardSelfNodeService.java @@ -447,6 +447,12 @@ public class StandardSelfNodeService implements SelfNodeService { return empty(flagStr) ? false : Boolean.valueOf(flagStr); } + @Override + @NonNull public Optional getLogFlagExpirationTime() { + var ttl = getNodeConfig().get_ttl(REDIS_LOG_FLAG_KEY); + return ttl < 0 ? Optional.empty() : Optional.of(now() + ttl * 1000); + } + @Override public void setLogFlag(final boolean logFlag, @NonNull final Optional ttlInSeconds) { if (logFlag) { diff --git a/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java b/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java index 40c03c55..7bc406cb 100644 --- a/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java +++ b/bubble-server/src/main/java/bubble/service_dbfilter/DbFilterSelfNodeService.java @@ -33,6 +33,9 @@ public class DbFilterSelfNodeService implements SelfNodeService { @Override public BubblePlan getThisPlan() { return notSupported("getThisPlan"); } @Override public boolean getLogFlag() { return notSupported("getLogFlag"); } + @Override @NonNull public Optional getLogFlagExpirationTime() { + return notSupported("getLogFlagExpirationTime"); + } @Override public void setLogFlag(boolean logFlag, @NonNull final Optional ttlInSeconds) { notSupported("setLogFlag"); } -- 2.17.1 From 3c18d5d4fc08b1d4075644421fa0ce35efe4ed24 Mon Sep 17 00:00:00 2001 From: Kristijan Mitrovic Date: Fri, 31 Jul 2020 14:18:36 +0200 Subject: [PATCH 5/5] Add labels needed for log flag UI --- .../en_US/server/post_auth/ResourceMessages.properties | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties index 8b8c0e4a..cc3f9c4b 100644 --- a/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties +++ b/bubble-server/src/main/resources/message_templates/en_US/server/post_auth/ResourceMessages.properties @@ -250,6 +250,16 @@ button_label_restore=Restore button_description_restore=You will need full network restore key build from this bubble while if was running. restore_not_possible_nodes_exist_html=Cannot restore bubbles with existing nodes. Please contact support@getbubblenow.com +# Network Page - Log flag +node_logs_enabled=logs enabled +node_logs_until=until +button_node_logs_disable=Disable Logs +node_logs_disable_after=Disable Logging After +node_logs_days=Days +button_node_logs_set_disable_after=Set +node_logs_disabled=logs are disabled +button_node_logs_enable=Enable Logs + # Network Page - Danger Zone title_network_danger_zone=Danger Zone link_network_action_stop=Stop -- 2.17.1