mirror of
https://github.com/corda/corda.git
synced 2025-02-05 18:49:14 +00:00
Only allow the first node to run notary services. And validate port numbers more strongly.
This commit is contained in:
parent
c734fbf8bb
commit
f95b743426
@ -2,17 +2,20 @@ package net.corda.demobench.model
|
|||||||
|
|
||||||
import com.typesafe.config.ConfigRenderOptions
|
import com.typesafe.config.ConfigRenderOptions
|
||||||
import java.lang.management.ManagementFactory
|
import java.lang.management.ManagementFactory
|
||||||
import java.nio.file.Paths
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
import net.corda.demobench.pty.R3Pty
|
import net.corda.demobench.pty.R3Pty
|
||||||
import tornadofx.Controller
|
import tornadofx.Controller
|
||||||
|
import java.io.IOException
|
||||||
|
import java.net.ServerSocket
|
||||||
|
|
||||||
class NodeController : Controller() {
|
class NodeController : Controller() {
|
||||||
private companion object Data {
|
private companion object Data {
|
||||||
const val FIRST_PORT = 10000
|
const val FIRST_PORT = 10000
|
||||||
|
const val MIN_PORT = 1024
|
||||||
|
const val MAX_PORT = 65535
|
||||||
}
|
}
|
||||||
|
|
||||||
private val jvm by inject<JVMConfig>()
|
private val jvm by inject<JVMConfig>()
|
||||||
@ -63,12 +66,27 @@ class NodeController : Controller() {
|
|||||||
|
|
||||||
val nextPort: Int get() = port.andIncrement
|
val nextPort: Int get() = port.andIncrement
|
||||||
|
|
||||||
|
fun isPortAvailable(port: Int): Boolean {
|
||||||
|
if ((port >= MIN_PORT) && (port <= MAX_PORT)) {
|
||||||
|
try {
|
||||||
|
ServerSocket(port).close()
|
||||||
|
return true
|
||||||
|
} catch (e: IOException) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun keyExists(key: String) = nodes.keys.contains(key)
|
fun keyExists(key: String) = nodes.keys.contains(key)
|
||||||
|
|
||||||
fun nameExists(name: String) = keyExists(toKey(name))
|
fun nameExists(name: String) = keyExists(toKey(name))
|
||||||
|
|
||||||
|
fun hasNetworkMap(): Boolean = networkMapConfig != null
|
||||||
|
|
||||||
fun chooseNetworkMap(config: NodeConfig) {
|
fun chooseNetworkMap(config: NodeConfig) {
|
||||||
if (networkMapConfig != null) {
|
if (hasNetworkMap()) {
|
||||||
config.networkMap = networkMapConfig
|
config.networkMap = networkMapConfig
|
||||||
} else {
|
} else {
|
||||||
networkMapConfig = config
|
networkMapConfig = config
|
||||||
|
@ -7,32 +7,28 @@ import java.util.*
|
|||||||
|
|
||||||
class ServiceController : Controller() {
|
class ServiceController : Controller() {
|
||||||
|
|
||||||
private var serviceSet: List<String>
|
val services: List<String> = loadConf(javaClass.classLoader.getResource("services.conf"))
|
||||||
val services: List<String> get() = serviceSet
|
|
||||||
|
|
||||||
init {
|
val notaries: List<String> = services.filter { it.startsWith("corda.notary.") }.toList()
|
||||||
/*
|
|
||||||
* Load our list of known extra Corda services.
|
/*
|
||||||
*/
|
* Load our list of known extra Corda services.
|
||||||
val serviceConf = javaClass.classLoader.getResource("services.conf")
|
*/
|
||||||
serviceSet = if (serviceConf == null) {
|
private fun loadConf(url: URL?): List<String> {
|
||||||
emptyList<String>()
|
if (url == null) {
|
||||||
|
return emptyList()
|
||||||
} else {
|
} else {
|
||||||
loadConf(serviceConf)
|
val set = TreeSet<String>()
|
||||||
}
|
InputStreamReader(url.openStream()).useLines {
|
||||||
}
|
sq -> sq.forEach {
|
||||||
|
val service = it.trim()
|
||||||
|
set.add(service)
|
||||||
|
|
||||||
private fun loadConf(url: URL): List<String> {
|
log.info("Supports: " + service)
|
||||||
val set = TreeSet<String>()
|
}
|
||||||
InputStreamReader(url.openStream()).useLines {
|
|
||||||
sq -> sq.forEach {
|
|
||||||
val service = it.trim()
|
|
||||||
set.add(service)
|
|
||||||
|
|
||||||
log.info("Supports: " + service)
|
|
||||||
}
|
}
|
||||||
|
return set.toList()
|
||||||
}
|
}
|
||||||
return set.toList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -73,6 +73,8 @@ class NodeTabView : Fragment() {
|
|||||||
error("Port number required")
|
error("Port number required")
|
||||||
} else if (it.contains(NOT_NUMBER)) {
|
} else if (it.contains(NOT_NUMBER)) {
|
||||||
error("Invalid port number")
|
error("Invalid port number")
|
||||||
|
} else if (!nodeController.isPortAvailable(it.toInt())) {
|
||||||
|
error("Port $it is unavailable")
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -88,6 +90,8 @@ class NodeTabView : Fragment() {
|
|||||||
error("Port number required")
|
error("Port number required")
|
||||||
} else if (it.contains(NOT_NUMBER)) {
|
} else if (it.contains(NOT_NUMBER)) {
|
||||||
error("Invalid port number")
|
error("Invalid port number")
|
||||||
|
} else if (!nodeController.isPortAvailable(it.toInt())) {
|
||||||
|
error("Port $it is unavailable")
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -103,6 +107,8 @@ class NodeTabView : Fragment() {
|
|||||||
error("Port number required")
|
error("Port number required")
|
||||||
} else if (it.contains(NOT_NUMBER)) {
|
} else if (it.contains(NOT_NUMBER)) {
|
||||||
error("Invalid port number")
|
error("Invalid port number")
|
||||||
|
} else if (!nodeController.isPortAvailable(it.toInt())) {
|
||||||
|
error("Port $it is unavailable")
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@ -112,7 +118,7 @@ class NodeTabView : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fieldset("Services") {
|
fieldset("Services") {
|
||||||
listview(serviceController.services.observable()) {
|
listview(availableServices.observable()) {
|
||||||
selectionModel.selectionMode = MULTIPLE
|
selectionModel.selectionMode = MULTIPLE
|
||||||
model.item.extraServices.set(selectionModel.selectedItems)
|
model.item.extraServices.set(selectionModel.selectedItems)
|
||||||
}
|
}
|
||||||
@ -131,6 +137,9 @@ class NodeTabView : Fragment() {
|
|||||||
|
|
||||||
val nodeTab = CloseableTab("New Node", root)
|
val nodeTab = CloseableTab("New Node", root)
|
||||||
|
|
||||||
|
private val availableServices: List<String>
|
||||||
|
get() = if (nodeController.hasNetworkMap()) serviceController.services else serviceController.notaries
|
||||||
|
|
||||||
fun launch() {
|
fun launch() {
|
||||||
model.commit()
|
model.commit()
|
||||||
val config = nodeController.validate(model.item)
|
val config = nodeController.validate(model.item)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user