mirror of https://github.com/micromata/borgbackup-butler.git

WIP
Kai Reinhard
17.09.2021 dbc0a8433134a341f6a359234e62b744f1a9555c
WIP
1 files deleted
1 files added
8 files modified
234 ■■■■■ changed files
borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt 22 ●●●● patch | view | raw | blame | history
borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java 5 ●●●●● patch | view | raw | blame | history
borgbutler-server/src/main/java/de/micromata/borgbutler/server/RunningMode.java 87 ●●●●● patch | view | raw | blame | history
borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java 2 ●●● patch | view | raw | blame | history
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt 22 ●●●● patch | view | raw | blame | history
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt 72 ●●●●● patch | view | raw | blame | history
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt 17 ●●●● patch | view | raw | blame | history
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt 3 ●●●● patch | view | raw | blame | history
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt 2 ●●● patch | view | raw | blame | history
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt 2 ●●● patch | view | raw | blame | history
borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt
@@ -1,7 +1,5 @@
package de.micromata.borgbutler.config
import de.micromata.borgbutler.config.Definitions
import de.micromata.borgbutler.json.JsonUtils
import mu.KotlinLogging
import org.apache.commons.io.FileUtils
import java.io.File
@@ -23,14 +21,8 @@
    private var configuration: Configuration? = null
    private fun read() {
        if (configFile.canRead()) {
            log.info("Reading config file '" + configFile.absolutePath + "'")
            val jsonConfigFile = File(workingDir, CONFIG_FILENAME)
            if (jsonConfigFile.canRead()) {
                val yaml = FileUtils.readFileToString(jsonConfigFile, Definitions.STD_CHARSET)
                configuration = YamlUtils.fromYaml(configClazz, yaml)
            }
        } else {
        configuration = readJsonConfigfile(workingDir)
        if (configuration == null) {
            Legacy.readOldJsonConfigFile(workingDir, OLD_JSON_CONFIG_FILENAME)?.let {
                configuration = it
                save()
@@ -120,6 +112,16 @@
        fun getConfigClazz(): Class<out Configuration> {
            return configClazz
        }
        fun readJsonConfigfile(workingDir: File): Configuration? {
            val configFile = File(workingDir, CONFIG_FILENAME)
            if (!configFile.canRead()) {
                return null
            }
            log.info("Reading config file '" + configFile.absolutePath + "'")
            val yaml = FileUtils.readFileToString(configFile, Definitions.STD_CHARSET)
            return YamlUtils.fromYaml(configClazz, yaml)
        }
    }
    init {
borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
@@ -37,10 +37,9 @@
        }
        borgVersion.setBinariesDownloadVersion(configuration.getBorgVersion());
        initialize(getBinary(RunningMode.getOSType()));
        if (version(configuration)) {
            return;
        if (!borgVersion.isVersionOK()) {
            log.warn("No working borg version found. Please configure a borg version with minimal version '" + borgVersion.getMinimumRequiredBorgVersion() + "'.");
        }
        log.warn("No working borg version found. Please configure a borg version with minimal version '" + borgVersion.getMinimumRequiredBorgVersion() + "'.");
    }
    /**
borgbutler-server/src/main/java/de/micromata/borgbutler/server/RunningMode.java
File was deleted
borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java
@@ -31,7 +31,7 @@
            }
            try (InputStream inputStream = ClassLoader.getSystemResourceAsStream("version.properties")) {
                if (inputStream == null) {
                    log.warn("version.properties not found (OK, if started e. g. in IDE");
                    log.warn("version.properties not found (OK, if started e. g. in IDE).");
                    version = "99.0";
                    appName = "BorgButler";
                    buildDate = new Date();
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
@@ -1,6 +1,7 @@
package de.micromata.borgbutler.server
import de.micromata.borgbutler.cache.ButlerCache
import de.micromata.borgbutler.config.ConfigurationHandler
import de.micromata.borgbutler.config.ConfigurationHandler.Companion.init
import de.micromata.borgbutler.config.ConfigurationHandler.Companion.setConfigClazz
import de.micromata.borgbutler.server.user.SingleUserManager
@@ -42,13 +43,19 @@
            borgButlerHome = File(System.getProperty("user.home"), ".borgbutler").absolutePath
            System.setProperty("BorgButlerHome", borgButlerHome)
        }
        // Preread configuration to get setting development mode for WebConfig (logging not yet initialized, so
        // reread configuration later after logging is available for getting log information on errors etc.)
        val configuration = ConfigurationHandler.readJsonConfigfile(File(borgButlerHome))
        RunningMode.webDevelopment = RunningMode.runningInIDE || (configuration as? ServerConfiguration)?.webDevelopmentMode == true
        if (System.getProperty("LOG_PATH").isNullOrBlank()) {
            // Needed by logback-spring.xml
            System.setProperty("LOG_PATH", borgButlerHome)
        }
        SpringApplication.run(BorgButlerApplication::class.java, *args)
        if (borgButlerHome != null) {
            init(borgButlerHome)
        }
        SpringApplication.run(BorgButlerApplication::class.java, *args)
        // create Options object
        val options = Options()
        options.addOption(
@@ -89,11 +96,6 @@
                    return
                }
            }
            if (Desktop.isDesktopSupported()) {
                RunningMode.setServerType(RunningMode.ServerType.DESKTOP)
            } else {
                RunningMode.setServerType(RunningMode.ServerType.SERVER)
            }
            RunningMode.logMode()
            UserManager.setUserManager(SingleUserManager())
@@ -104,9 +106,7 @@
            val url = "http://$serverAddress:$serverPort/".replace("0.0.0.0", "127.0.0.1")
            val uri = URI.create(url)
            val quietMode = line.hasOption('q')
            val desktopSupportsBrowse = Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)
            val headlessMode = System.getProperty("java.awt.headless") == "true"
            if (!quietMode && desktopSupportsBrowse && headlessMode) {
            if (!quietMode && RunningMode.desktopSupportsBrowse && RunningMode.headlessMode) {
                try {
                    log.info { "Trying to open your local web browser: $uri" }
                    Desktop.getDesktop().browse(uri)
@@ -117,9 +117,9 @@
            } else {
                if (quietMode) {
                    log.info("Server started in quiet mode (option -q). Please open your browser manually: $uri")
                } else if (!desktopSupportsBrowse) {
                } else if (!RunningMode.desktopSupportsBrowse) {
                    log.info("Desktop not available. Please open your browser manually: $uri")
                } else if (headlessMode) {
                } else if (RunningMode.headlessMode) {
                    log.info("Desktop not available in headless mode. Please open your browser manually: $uri")
                }
            }
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt
New file
@@ -0,0 +1,72 @@
package de.micromata.borgbutler.server
import org.slf4j.LoggerFactory
import java.awt.Desktop
import java.io.File
import java.util.*
object RunningMode {
    private val log = LoggerFactory.getLogger(RunningMode::class.java)
    private var osType: OSType? = null
    var webDevelopment: Boolean = false
        internal set
    val headlessMode: Boolean = System.getProperty("java.awt.headless") == "true"
    val desktopSupported = Desktop.isDesktopSupported()
    val desktopSupportsBrowse = desktopSupported && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)
    @JvmStatic
    val userManagement = UserManagement.SINGLE
    @JvmStatic
    val oSType: OSType?
        get() {
            if (osType == null) {
                val osTypeString = System.getProperty("os.name")
                osType = if (osTypeString == null) {
                    OSType.OTHER
                } else if (osTypeString.toLowerCase().contains("mac")) {
                    OSType.MAC_OS
                } else if (osTypeString.toLowerCase().contains("win")) {
                    OSType.WINDOWS
                } else if (osTypeString.toLowerCase().contains("linux")) {
                    OSType.LINUX
                } else if (osTypeString.toLowerCase().contains("freebsd")) {
                    OSType.FREEBSD
                } else {
                    OSType.OTHER
                }
            }
            return osType
        }
    val runningInIDE: Boolean
        get() {
            val currentDir = System.getProperty("user.dir")
            val coreDir = File(currentDir, "borgbutler-core")
            val development = coreDir.exists() && File(coreDir, "build.gradle").exists()
            if (development) {
                log.warn("*** Starting BorgButler server in IDE mode. This mode shouldn't be used in production environments. ***")
            }
            return development
        }
    /**
     * After setting all values you should call this method for a logging output with all current settings.
     */
    fun logMode() {
        log.info(
            "Starting ${Version.getInstance().appName} ${Version.getInstance().version} ("
                    + Version.getInstance().formatBuildDateISO(TimeZone.getDefault())
                    + ") with: webDevelopment=$webDevelopment, desktopSupported=$desktopSupported, javaVersion='"
                    + System.getProperty("java.version") + "'."
        )
    }
    enum class UserManagement {
        SINGLE
    }
    enum class OSType {
        MAC_OS, WINDOWS, LINUX, FREEBSD, OTHER
    }
}
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
@@ -16,31 +16,18 @@
    /**
     * If true, CrossOriginFilter will be set.
     */
    var isWebDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT
    var webDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT
    fun copyFrom(other: ServerConfiguration) {
        super.copyFrom(other)
        port = other.port
        isWebDevelopmentMode = other.isWebDevelopmentMode
        webDevelopmentMode = other.webDevelopmentMode
    }
    companion object {
        val supportedLanguages = arrayOf("en", "de")
        const val WEBSERVER_PORT_DEFAULT = 9042
        private const val WEB_DEVELOPMENT_MODE_PREF_DEFAULT = false
        @JvmStatic
        var applicationHome: String? = null
            get() {
                if (field == null) {
                    field = System.getProperty("applicationHome")
                    if (StringUtils.isBlank(field)) {
                        field = System.getProperty("user.dir")
                        log.info("applicationHome is not given as JVM   parameter. Using current working dir (OK for start in IDE): $field")
                    }
                }
                return field
            }
            private set
        @JvmStatic
        fun get(): ServerConfiguration {
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt
@@ -1,7 +1,6 @@
package de.micromata.borgbutler.server
import mu.KotlinLogging
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.CorsRegistry
import org.springframework.web.servlet.config.annotation.EnableWebMvc
@@ -14,7 +13,7 @@
@EnableWebMvc
open class WebConfig : WebMvcConfigurer {
    override fun addCorsMappings(registry: CorsRegistry) {
        if (RunningMode.isDevelopmentMode() || ServerConfiguration.get().isWebDevelopmentMode) {
        if (RunningMode.webDevelopment) {
            log.warn("*********************************")
            log.warn("***********            **********")
            log.warn("*********** ATTENTION! **********")
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt
@@ -58,7 +58,7 @@
                val label = JLabel("Click for choosing directory...", SwingConstants.CENTER)
                fr.add(label)
            }
            if (RunningMode.getOSType() == RunningMode.OSType.MAC_OS) {
            if (RunningMode.oSType == RunningMode.OSType.MAC_OS) {
                // The JFileChooser will hang after several calls, use AWT file dialog instead for Mac OS:
                System.setProperty("apple.awt.fileDialogForDirectories", "true")
                frame?.let {
borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt
@@ -23,7 +23,7 @@
     * service isn't available.
     */
    fun checkLocalDesktopAvailable(requestContext: HttpServletRequest): String? {
        if (RunningMode.getServerType() != RunningMode.ServerType.DESKTOP) {
        if (!RunningMode.desktopSupported) {
            return "Service unavailable. No desktop app on localhost available."
        }
        val remoteAddr = requestContext.remoteAddr