diff --git a/conf.json.example b/conf.json.example
index 27346aec..0b336dd2 100644
--- a/conf.json.example
+++ b/conf.json.example
@@ -3,5 +3,7 @@
"sq_lite_database_file": "sqlite.db",
"cookie_encryption_key": "",
"settings_file": "server-settings.json",
- "log_file": "factorio-server-manager.log"
+ "log_file": "factorio-server-manager.log",
+ "factorio_port": 34197,
+ "factorio_port_lock": false,
}
diff --git a/src/api/handlers.go b/src/api/handlers.go
index 65d3d82c..f5410216 100644
--- a/src/api/handlers.go
+++ b/src/api/handlers.go
@@ -403,10 +403,15 @@ func KillServer(w http.ResponseWriter, r *http.Request) {
}
func CheckServer(w http.ResponseWriter, r *http.Request) {
+ var serverInfo = factorio.GetFactorioServer()
defer func() {
- WriteResponse(w, factorio.GetFactorioServer())
+ WriteResponse(w, serverInfo)
}()
+ config := bootstrap.GetConfig()
+ serverInfo.DefaultPort = config.FactorioPort
+ serverInfo.PortLock = config.FactorioPortLock
+
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
}
diff --git a/src/bootstrap/config.go b/src/bootstrap/config.go
index 685cabc5..6eeeba82 100644
--- a/src/bootstrap/config.go
+++ b/src/bootstrap/config.go
@@ -19,8 +19,9 @@ type Flags struct {
ConfFile string `long:"conf" default:"./conf.json" description:"Specify location of Factorio Server Manager config file." env:"FSM_CONF"`
FactorioDir string `long:"dir" default:"./" description:"Specify location of Factorio directory." env:"FSM_DIR"`
ServerIP string `long:"host" default:"0.0.0.0" description:"Specify IP for webserver to listen on." env:"FSM_SERVER_IP"`
+ ServerPort string `long:"port" default:"80" description:"Specify a port for the server." env:"FSM_PORT"`
FactorioIP string `long:"game-bind-address" default:"0.0.0.0" description:"Specify IP for Factorio game server to listen on." env:"FSM_FACTORIO_IP"`
- FactorioPort string `long:"port" default:"80" description:"Specify a port for the server." env:"FSM_PORT"`
+ FactorioPort string `long:"game-port" default:"34197" description:"Default port for the Factorio game server." env:"FSM_FACTORIO_PORT"`
FactorioConfigFile string `long:"config" default:"config/config.ini" description:"Specify location of Factorio config.ini file." env:"FSM_FACTORIO_CONFIG_FILE"`
FactorioMaxUpload int64 `long:"max-upload" default:"20" description:"Maximum filesize for uploaded files in MB." env:"FSM_MAX_UPLOAD"`
FactorioBinary string `long:"bin" default:"bin/x64/factorio" description:"Location of Factorio Server binary file." env:"FSM_BINARY"`
@@ -46,6 +47,8 @@ type Config struct {
FactorioRconPass string `json:"rcon_pass,omitempty"`
FactorioCredentialsFile string `json:"factorio_credentials_file,omitempty"`
FactorioIP string `json:"factorio_ip,omitempty"`
+ FactorioPort string `json:"factorio_port,omitempty"`
+ FactorioPortLock bool `json:"factorio_port_lock,omitempty"`
FactorioAdminFile string `json:"factorio_admin_file,omitempty"`
ServerIP string `json:"server_ip,omitempty"`
ServerPort string `json:"server_port,omitempty"`
@@ -212,8 +215,9 @@ func (config *Config) mapFlags(flags Flags) {
config.ConfFile = flags.ConfFile
config.FactorioDir = flags.FactorioDir
config.ServerIP = flags.ServerIP
- config.ServerPort = flags.FactorioPort
+ config.ServerPort = flags.ServerPort
config.FactorioIP = flags.FactorioIP
+ config.FactorioPort = flags.FactorioPort
config.FactorioSavesDir = filepath.Join(flags.FactorioDir, "saves")
config.FactorioModsDir = filepath.Join(flags.FactorioDir, "mods")
config.FactorioModPackDir = flags.ModPackDir
diff --git a/src/factorio/server.go b/src/factorio/server.go
index a6423b82..2b8fb1cc 100644
--- a/src/factorio/server.go
+++ b/src/factorio/server.go
@@ -26,6 +26,8 @@ type Server struct {
Latency int `json:"latency"`
BindIP string `json:"bindip"`
Port int `json:"port"`
+ DefaultPort string `json:"default_port"`
+ PortLock bool `json:"port_lock"`
Running bool `json:"running"`
Version Version `json:"fac_version"`
BaseModVersion string `json:"base_mod_version"`
@@ -249,9 +251,15 @@ func (server *Server) Run() error {
args = append(args, "--library-path", config.GlibcLibLoc, config.FactorioBinary, "--executable-path", config.FactorioBinary)
}
+ game_port := strconv.Itoa(server.Port)
+ if (config.FactorioPortLock) {
+ // Force the game to run with --game-port when "factorio_port_lock" is set to true in conf.json.
+ game_port = config.FactorioPort
+ }
+
args = append(args,
"--bind", server.BindIP,
- "--port", strconv.Itoa(server.Port),
+ "--port", game_port,
"--server-settings", config.SettingsFile,
"--rcon-port", strconv.Itoa(config.FactorioRconPort),
"--rcon-password", config.FactorioRconPass)
@@ -265,7 +273,7 @@ func (server *Server) Run() error {
} else {
args = append(args, "--start-server", filepath.Join(config.FactorioSavesDir, server.Savefile))
}
-
+
// Write chat log to a different file if requested (if not it will be mixed-in with the default logfile)
if config.ChatLogFile != "" {
args = append(args, "--console-log", config.ChatLogFile)
@@ -278,7 +286,7 @@ func (server *Server) Run() error {
log.Println("Starting server with command: ", config.FactorioBinary, args)
server.Cmd = exec.Command(config.FactorioBinary, args...)
}
-
+
server.StdOut, err = server.Cmd.StdoutPipe()
if err != nil {
log.Printf("Error opening stdout pipe: %s", err)
diff --git a/ui/App/components/Input.jsx b/ui/App/components/Input.jsx
index 433291d4..a2a62e24 100644
--- a/ui/App/components/Input.jsx
+++ b/ui/App/components/Input.jsx
@@ -9,6 +9,7 @@ const Input = ({
onKeyDown = () => null,
min = null,
value = undefined,
+ readOnly = false,
disabled = false
}) => {
return (
@@ -22,6 +23,7 @@ const Input = ({
defaultValue={defaultValue}
min={min}
value={value}
+ readonly={readOnly}
disabled={disabled}
/>
)
diff --git a/ui/App/views/Controls.jsx b/ui/App/views/Controls.jsx
index 2eeaa1ff..1d3d308b 100644
--- a/ui/App/views/Controls.jsx
+++ b/ui/App/views/Controls.jsx
@@ -89,7 +89,8 @@ const Controls = ({serverStatus}) => {