diff --git a/bubble-server/src/main/java/bubble/model/cloud/BubbleVersionInfo.java b/bubble-server/src/main/java/bubble/model/cloud/BubbleVersionInfo.java index 807cb061..826de316 100644 --- a/bubble-server/src/main/java/bubble/model/cloud/BubbleVersionInfo.java +++ b/bubble-server/src/main/java/bubble/model/cloud/BubbleVersionInfo.java @@ -10,6 +10,8 @@ import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; +import java.util.Properties; + import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.wizard.model.SemanticVersion.isNewerVersion; @@ -19,6 +21,7 @@ public class BubbleVersionInfo { @Getter @Setter private String version; @Getter @Setter private String shortVersion; @Getter @Setter private String sha256; + @Getter @Setter private Properties software; public boolean valid() { return !empty(version) && !empty(sha256); } diff --git a/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java b/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java index 016cbfc1..f5a1127a 100644 --- a/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java +++ b/bubble-server/src/main/java/bubble/server/BubbleConfiguration.java @@ -53,6 +53,8 @@ import org.springframework.context.annotation.Configuration; import java.beans.Transient; import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -98,6 +100,7 @@ public class BubbleConfiguration extends PgRestServerConfiguration public static final String TAG_SECURITY_LEVELS = "securityLevels"; public static final String TAG_RESTORE_MODE = "awaitingRestore"; public static final String TAG_RESTORING_IN_PROGRESS = "restoreInProgress"; + public static final String TAG_FULL_VERSION = "fullVersion"; public static final String TAG_JAR_VERSION = "jarVersion"; public static final String TAG_JAR_UPGRADE_AVAILABLE = "jarUpgradeAvailable"; public static final String TAG_MAX_USERS = "maxUsers"; @@ -165,8 +168,23 @@ public class BubbleConfiguration extends PgRestServerConfiguration public boolean hasSageNode () { return getSageNode() != null; } @Getter @Setter private String letsencryptEmail; + @Getter @Setter private String releaseUrlBase; + public static final File SOFTWARE_VERSIONS_FILE = new File(HOME_DIR+"/bubble_versions.properties"); + @Getter(lazy=true) private final Properties defaultSoftwareVersions = initDefaultSoftwareVersions(); + private Properties initDefaultSoftwareVersions() { + if (!SOFTWARE_VERSIONS_FILE.exists()) return null; + final Properties props = new Properties(); + try (InputStream in = new FileInputStream(SOFTWARE_VERSIONS_FILE)) { + props.load(in); + return props; + } catch (Exception e) { + log.error("initDefaultSoftwareVersions: "+shortError(e)); + return null; + } + } + @Setter private String localStorageDir = DEFAULT_LOCAL_STORAGE_DIR; public String getLocalStorageDir () { return empty(localStorageDir) ? DEFAULT_LOCAL_STORAGE_DIR : localStorageDir; } @@ -265,7 +283,8 @@ public class BubbleConfiguration extends PgRestServerConfiguration return new BubbleVersionInfo() .setVersion(version) .setShortVersion(shortVersion) - .setSha256(getJarSha()); + .setSha256(getJarSha()) + .setSoftware(getDefaultSoftwareVersions()); } public String getShortVersion () { return getVersionInfo().getShortVersion(); } @@ -367,6 +386,7 @@ public class BubbleConfiguration extends PgRestServerConfiguration {TAG_SSL_PORT, getDefaultSslPort()}, {TAG_SUPPORT, getSupport()}, {TAG_SECURITY_LEVELS, DeviceSecurityLevel.values()}, + {TAG_FULL_VERSION, getVersionInfo()}, {TAG_JAR_VERSION, getVersion()}, {TAG_JAR_UPGRADE_AVAILABLE, getJarUpgradeAvailable() ? getSageVersion() : null}, {TAG_MAX_USERS, plan == null ? null : plan.getMaxAccounts()}, diff --git a/bubble-server/src/main/java/bubble/service/packer/PackerService.java b/bubble-server/src/main/java/bubble/service/packer/PackerService.java index 1b927c73..a82c0023 100644 --- a/bubble-server/src/main/java/bubble/service/packer/PackerService.java +++ b/bubble-server/src/main/java/bubble/service/packer/PackerService.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicReference; @@ -28,7 +29,7 @@ import static org.cobbzilla.util.http.HttpUtil.url2string; import static org.cobbzilla.util.io.FileUtil.abs; import static org.cobbzilla.util.io.FileUtil.mkdirOrDie; import static org.cobbzilla.util.io.StreamUtil.stream2string; -import static org.cobbzilla.util.security.ShaUtil.*; +import static org.cobbzilla.util.security.ShaUtil.sha256_file; import static org.cobbzilla.util.string.StringUtil.splitAndTrim; import static org.cobbzilla.util.system.CommandShell.chmod; import static org.cobbzilla.util.system.CommandShell.execScript; @@ -118,7 +119,13 @@ public class PackerService { } private final Map softwareVersions = new HashMap<>(); + public String getSoftwareVersion(String roleName) { + final Properties defaults = configuration.getDefaultSoftwareVersions(); + if (defaults != null) { + final String version = defaults.getProperty(roleName.replace("-", "_")); + if (version != null) return version; + } final String releaseUrlBase = configuration.getReleaseUrlBase(); return softwareVersions.computeIfAbsent(roleName, r -> { try { diff --git a/bubble-server/src/main/resources/packer/roles/bubble/tasks/main.yml b/bubble-server/src/main/resources/packer/roles/bubble/tasks/main.yml index 9b22654a..2a8235bb 100644 --- a/bubble-server/src/main/resources/packer/roles/bubble/tasks/main.yml +++ b/bubble-server/src/main/resources/packer/roles/bubble/tasks/main.yml @@ -140,4 +140,3 @@ owner: bubble group: bubble mode: 0400 - when: install_type == 'node'