1616
1717package net.edwardday.serverscript.scripthost
1818
19+ import com.github.ajalt.clikt.command.SuspendingCliktCommand
20+ import com.github.ajalt.clikt.command.main
21+ import com.github.ajalt.clikt.parameters.options.flag
22+ import com.github.ajalt.clikt.parameters.options.option
1923import io.github.oshai.kotlinlogging.KotlinLogging
2024import java.io.File
2125import java.io.IOException
@@ -24,81 +28,96 @@ import java.util.*
2428
2529private const val CONFIG_FILE_NAME = " kss.properties"
2630
27- private fun loadProperties (): Properties {
28- // load default config
29- val defaultConfig = try {
30- Thread .currentThread()
31+ suspend fun main (args : Array <String >) = Main ().main(args)
32+
33+ private class Main : SuspendingCliktCommand () {
34+ private fun readPropertiesFromClasspath (fileName : String ): Properties ? {
35+ return Thread .currentThread()
3136 .getContextClassLoader()
32- .getResourceAsStream(CONFIG_FILE_NAME )
37+ .getResourceAsStream(fileName )
3338 ?.use<InputStream ?, Properties > { stream ->
3439 Properties ().apply {
3540 load(stream)
3641 }
3742 }
38- ? : error(" Could not load default configuration" )
39- } catch (e: IOException ) {
40- error(" Could not read default configuration because of ${e.localizedMessage} " )
4143 }
44+ private fun loadProperties (): Properties {
45+ // load default config
46+ val defaultConfig = try {
47+ readPropertiesFromClasspath(CONFIG_FILE_NAME ) ? : error(" Could not load default configuration" )
48+ } catch (e: IOException ) {
49+ error(" Could not read default configuration because of ${e.localizedMessage} " )
50+ }
4251
43- // load config file from working directory
44- val workingDirectoryConfig = Properties (defaultConfig)
45- try {
46- File (CONFIG_FILE_NAME ).takeIf (File ::exists)?.bufferedReader()?.use(workingDirectoryConfig::load)
47- } catch (e: IOException ) {
48- // Ignore for now, maybe log?
49- }
52+ // load config file from working directory
53+ val workingDirectoryConfig = Properties (defaultConfig)
54+ try {
55+ File (CONFIG_FILE_NAME ).takeIf (File ::exists)?.bufferedReader()?.use(workingDirectoryConfig::load)
56+ } catch (e: IOException ) {
57+ // Ignore for now, maybe log?
58+ }
5059
51- // load config from system properties
52- val commandLineConfig = Properties (workingDirectoryConfig)
53- workingDirectoryConfig.keys.forEach { key ->
54- val keyAsString = key.toString()
55- System .getProperty(keyAsString)?.also { value -> commandLineConfig[keyAsString] = value }
60+ // load config from system properties
61+ val commandLineConfig = Properties (workingDirectoryConfig)
62+ workingDirectoryConfig.keys.forEach { key ->
63+ val keyAsString = key.toString()
64+ System .getProperty(keyAsString)?.also { value -> commandLineConfig[keyAsString] = value }
65+ }
66+ return commandLineConfig
5667 }
57- return commandLineConfig
58- }
68+ val version by option(" -v" , " --version" , help = " Print current version" ).flag()
69+
70+ override suspend fun run () {
71+ if (version) {
72+ val appVersion = kotlin.runCatching {
73+ readPropertiesFromClasspath(" version.properties" )
74+ }.getOrNull()?.getProperty(" version" ) ? : " <unknown>"
75+ echo(" Version: $appVersion " )
76+ return
77+ }
78+ val properties = loadProperties()
5979
60- suspend fun main () {
61- val properties = loadProperties()
80+ val loggingFile = properties.getProperty(" logging.logback.configurationFile" ).orEmpty()
81+ if (loggingFile.isNotEmpty() && File (loggingFile).exists()) {
82+ System .setProperty(" logback.configurationFile" , loggingFile)
83+ }
6284
63- val loggingFile = properties.getProperty(" logging.logback.configurationFile" ).orEmpty()
64- if (loggingFile.isNotEmpty() && File (loggingFile).exists()) {
65- System .setProperty(" logback.configurationFile" , loggingFile)
66- }
85+ val logger = KotlinLogging .logger {}
6786
68- val logger = KotlinLogging .logger {}
6987
70- val mavenDependenciesSettings = properties.getProperty(" dependencies.maven.settingsFile" ).orEmpty()
71- val mavenDependenciesHome = properties.getProperty(" dependencies.maven.homeDirectory" ).orEmpty()
72- if (mavenDependenciesSettings.isNotEmpty() && File (mavenDependenciesSettings).exists()) {
73- if (mavenDependenciesHome.isNotEmpty()) {
74- logger.warn { " 'dependencies.maven.settingsFile' overwrites 'dependencies.maven.homeDirectory' setting." }
75- }
76- System .setProperty(" org.apache.maven.user-settings" , mavenDependenciesSettings)
77- } else {
78- val mavenDependenciesHomeDirectory = File (mavenDependenciesHome)
79- if (mavenDependenciesHome.isNotEmpty() && mavenDependenciesHomeDirectory.isDirectory()) {
80- if (mavenDependenciesHomeDirectory.canWrite()) {
81- val settingsFile = File (mavenDependenciesHomeDirectory, " settings.xml" )
82- val repositoryDirectory = File (mavenDependenciesHomeDirectory, " repository" )
83- repositoryDirectory.mkdir()
84- settingsFile.printWriter().use { writer ->
85- writer.println (""" <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"""" )
86- writer.println (""" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"""" )
87- writer.println (""" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">""" )
88- writer.println (""" <localRepository>${repositoryDirectory.absolutePath} </localRepository>""" )
89- writer.println (""" </settings>""" )
88+ val mavenDependenciesSettings = properties.getProperty(" dependencies.maven.settingsFile" ).orEmpty()
89+ val mavenDependenciesHome = properties.getProperty(" dependencies.maven.homeDirectory" ).orEmpty()
90+ if (mavenDependenciesSettings.isNotEmpty() && File (mavenDependenciesSettings).exists()) {
91+ if (mavenDependenciesHome.isNotEmpty()) {
92+ logger.warn { " 'dependencies.maven.settingsFile' overwrites 'dependencies.maven.homeDirectory' setting." }
93+ }
94+ System .setProperty(" org.apache.maven.user-settings" , mavenDependenciesSettings)
95+ } else {
96+ val mavenDependenciesHomeDirectory = File (mavenDependenciesHome)
97+ if (mavenDependenciesHome.isNotEmpty() && mavenDependenciesHomeDirectory.isDirectory()) {
98+ if (mavenDependenciesHomeDirectory.canWrite()) {
99+ val settingsFile = File (mavenDependenciesHomeDirectory, " settings.xml" )
100+ val repositoryDirectory = File (mavenDependenciesHomeDirectory, " repository" )
101+ repositoryDirectory.mkdir()
102+ settingsFile.printWriter().use { writer ->
103+ writer.println (""" <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"""" )
104+ writer.println (""" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"""" )
105+ writer.println (""" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">""" )
106+ writer.println (""" <localRepository>${repositoryDirectory.absolutePath} </localRepository>""" )
107+ writer.println (""" </settings>""" )
108+ }
109+ System .setProperty(" org.apache.maven.user-settings" , settingsFile.absolutePath)
110+ } else {
111+ logger.warn { " User can't write in ${mavenDependenciesHomeDirectory.absolutePath} " }
90112 }
91- System .setProperty(" org.apache.maven.user-settings" , settingsFile.absolutePath)
92- } else {
93- logger.warn { " User can't write in ${mavenDependenciesHomeDirectory.absolutePath} " }
94113 }
95114 }
96- }
97- val socket = properties.getProperty(" socket.address" ) ? : " unix:/var/run/kss/kss.sock"
98- val maxConnections = properties.getProperty(" connections.max" )?.toIntOrNull() ? : 4
115+ val socket = properties.getProperty(" socket.address" ) ? : " unix:/var/run/kss/kss.sock"
116+ val maxConnections = properties.getProperty(" connections.max" )?.toIntOrNull() ? : 4
99117
100- readFromSocket(
101- socket = socket,
102- maxConnections = maxConnections,
103- )
118+ readFromSocket(
119+ socket = socket,
120+ maxConnections = maxConnections,
121+ )
122+ }
104123}
0 commit comments