diff --git a/automation/roles/bubble/tasks/main.yml b/automation/roles/bubble/tasks/main.yml index 40c2a18b..453fa4c1 100644 --- a/automation/roles/bubble/tasks/main.yml +++ b/automation/roles/bubble/tasks/main.yml @@ -47,7 +47,7 @@ mode: 0444 - name: Unpack site files - shell: su - bubble -c "cd /home/bubble && unzip /home/bubble/bubble_{{ bubble_version }}/bubble.jar 'site/*'" + shell: cd /home/bubble && unzip /home/bubble/bubble_{{ bubble_version }}/bubble.jar 'site/*' && chown -R bubble site - name: Install bubble self_node.json, sage_node.json and sage_key.json copy: diff --git a/bubble-server/src/main/java/bubble/cloud/dns/godaddy/GoDaddyDnsDriver.java b/bubble-server/src/main/java/bubble/cloud/dns/godaddy/GoDaddyDnsDriver.java index 88edb50f..d6af14c4 100644 --- a/bubble-server/src/main/java/bubble/cloud/dns/godaddy/GoDaddyDnsDriver.java +++ b/bubble-server/src/main/java/bubble/cloud/dns/godaddy/GoDaddyDnsDriver.java @@ -124,7 +124,7 @@ public class GoDaddyDnsDriver extends DnsDriverBase { final Collection retained = Arrays.stream(gdRecords) .filter(r -> nonMatcher.matches(r.toDnsRecord(domain.get()))) .collect(Collectors.toList()); - if (empty(retained)) { + if (gdRecords.length == retained.size()) { log.warn("remove("+record+"): no matching record(s) found"); return null; } diff --git a/bubble-server/src/main/java/bubble/main/rekey/RekeyWriterMain.java b/bubble-server/src/main/java/bubble/main/rekey/RekeyWriterMain.java index 429633ac..ab8dcd5b 100644 --- a/bubble-server/src/main/java/bubble/main/rekey/RekeyWriterMain.java +++ b/bubble-server/src/main/java/bubble/main/rekey/RekeyWriterMain.java @@ -53,7 +53,7 @@ public class RekeyWriterMain extends BaseMain { return; } catch (SocketException e) { err("WRITER SocketException: "+e); - return; + throw e; } catch (Exception e) { err("WRITER error (sleeping then retrying): "+e); sleep(RETRY_DELAY); diff --git a/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java b/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java index 1e81df82..ff360de8 100644 --- a/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java +++ b/bubble-server/src/main/java/bubble/model/cloud/BubbleNetwork.java @@ -103,7 +103,7 @@ public class BubbleNetwork extends IdentifiableBase implements HasNetwork, HasBu @Getter @Setter private Integer sslPort; @Transient @JsonIgnore public String getPublicUri() { - return "https://" + getNetworkDomain() + (getSslPort() == 443 ? "" : ":"+getSslPort()) + "/"; + return "https://" + getNetworkDomain() + (getSslPort() == 443 ? "" : ":"+getSslPort()); } public String getPublicUri(BubbleConfiguration configuration) { diff --git a/bubble-server/src/main/java/bubble/service/cloud/StandardNetworkService.java b/bubble-server/src/main/java/bubble/service/cloud/StandardNetworkService.java index 2e45dcbc..a8a917ec 100644 --- a/bubble-server/src/main/java/bubble/service/cloud/StandardNetworkService.java +++ b/bubble-server/src/main/java/bubble/service/cloud/StandardNetworkService.java @@ -366,6 +366,12 @@ public class StandardNetworkService implements NetworkService { nodeDAO.update(node); progressMeter.error(METER_UNKNOWN_ERROR); killNode(node, "error: "+e); + } else { + final BubbleNetwork network = networkDAO.findByUuid(node.getNetwork()); + if (noNodesActive(network)) { + // if no nodes are running, then the network is stopped + networkDAO.update(network.setState(BubbleNetworkState.stopped)); + } } return die("newNode: "+e, e); diff --git a/bubble-server/src/main/java/bubble/service/dbfilter/FilteredEntityIterator.java b/bubble-server/src/main/java/bubble/service/dbfilter/FilteredEntityIterator.java index bf728ac9..0a7f9e6c 100644 --- a/bubble-server/src/main/java/bubble/service/dbfilter/FilteredEntityIterator.java +++ b/bubble-server/src/main/java/bubble/service/dbfilter/FilteredEntityIterator.java @@ -6,6 +6,7 @@ import bubble.dao.cloud.BubbleNodeDAO; import bubble.dao.cloud.BubbleNodeKeyDAO; import bubble.model.account.Account; import bubble.model.account.HasAccount; +import bubble.model.account.message.AccountMessage; import bubble.model.cloud.BubbleNetwork; import bubble.model.cloud.BubbleNode; import bubble.model.cloud.BubbleNodeKey; @@ -30,6 +31,7 @@ public class FilteredEntityIterator extends EntityIterator { POST_COPY_ENTITIES.add(BubbleNode.class); POST_COPY_ENTITIES.add(BubbleNodeKey.class); POST_COPY_ENTITIES.add(Device.class); + POST_COPY_ENTITIES.add(AccountMessage.class); } public static boolean isPostCopyEntity(Class clazz) { return POST_COPY_ENTITIES.stream().anyMatch(c -> c.isAssignableFrom(clazz)); diff --git a/bubble-server/src/main/java/bubble/service/notify/NotificationService.java b/bubble-server/src/main/java/bubble/service/notify/NotificationService.java index 71327b1e..571d6bec 100644 --- a/bubble-server/src/main/java/bubble/service/notify/NotificationService.java +++ b/bubble-server/src/main/java/bubble/service/notify/NotificationService.java @@ -139,7 +139,7 @@ public class NotificationService { return null; } - private final Map syncRequests = new ExpirationMap<>(SECONDS.toMillis(20)); + private final Map syncRequests = new ExpirationMap<>(SYNC_TIMEOUT + SECONDS.toMillis(5)); private final Map syncRequestCache = new ExpirationMap<>(SECONDS.toMillis(15)); public T notifySync(BubbleNode delegate, NotificationType type, SynchronousNotification notification) { 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 d426e131..6ba0f5b5 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 @@ -336,6 +336,7 @@ msg_node_state_awaiting_dns=waiting for DNS to be visible msg_node_state_installing=installing msg_node_state_running=running msg_node_state_stopping=stopping +msg_node_state_stopped=stopped msg_node_state_unreachable=unreachable msg_node_state_error_stopping=error stopping msg_node_state_error_stopped=stopped with error diff --git a/bubble-server/src/test/java/bubble/mock/MockNetworkService.java b/bubble-server/src/test/java/bubble/mock/MockNetworkService.java index 09c9ae8a..313f3b4b 100644 --- a/bubble-server/src/test/java/bubble/mock/MockNetworkService.java +++ b/bubble-server/src/test/java/bubble/mock/MockNetworkService.java @@ -41,6 +41,7 @@ public class MockNetworkService extends StandardNetworkService { .setState(BubbleNodeState.running) .setSageNode(nn.fork() ? null : configuration.getThisNode().getUuid()) .setNetwork(network.getUuid()) + .setSslPort(network.getSslPort()) .setDomain(network.getDomain()) .setAccount(network.getAccount()) .setSizeType(network.getComputeSizeType()) diff --git a/bubble-web b/bubble-web index 85ab827c..e533e7d4 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit 85ab827c5acaa73818496e10b250d87333f24df4 +Subproject commit e533e7d44bb788f8fa077608a5bfd470032797b8