Skip to content

Commit 635f695

Browse files
authored
Merge pull request #244 from OpenFactorioServerManager/disable-while-factorio-running
Disable Mods while factorio is running
2 parents 8e9c8f9 + dd9480d commit 635f695

5 files changed

Lines changed: 228 additions & 89 deletions

File tree

src/api/routes.go

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package api
22

33
import (
4-
"net/http"
5-
64
"github.com/OpenFactorioServerManager/factorio-server-manager/api/websocket"
5+
"github.com/OpenFactorioServerManager/factorio-server-manager/factorio"
6+
"net/http"
77

88
"github.com/gorilla/mux"
99
)
@@ -13,10 +13,24 @@ type Route struct {
1313
Method string
1414
Pattern string
1515
HandlerFunc http.HandlerFunc
16+
ServerOff bool // Set to `true' if factorio server has to be turned off to call this
1617
}
1718

1819
type Routes []Route
1920

21+
func ServerOffMiddleware(next http.Handler) http.Handler {
22+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
23+
// only run if server is turned off
24+
server := factorio.GetFactorioServer()
25+
if server.GetRunning() {
26+
http.Error(w, "factorio server still running", http.StatusLocked)
27+
} else {
28+
next.ServeHTTP(w, r)
29+
}
30+
return
31+
})
32+
}
33+
2034
func NewRouter() *mux.Router {
2135
r := mux.NewRouter().StrictSlash(true)
2236

@@ -28,8 +42,20 @@ func NewRouter() *mux.Router {
2842
// Serves all JSON REST handlers prefixed with /api
2943
s := r.PathPrefix("/api").Subrouter()
3044
s.Use(AuthMiddleware)
45+
46+
// use subrouter for calls, that run only, when server is turned off
47+
so := s.NewRoute().Subrouter()
48+
so.Use(ServerOffMiddleware)
49+
50+
s.NewRoute().Subrouter()
3151
for _, route := range apiRoutes {
32-
s.Methods(route.Method).
52+
var router *mux.Router
53+
if route.ServerOff {
54+
router = so
55+
} else {
56+
router = s
57+
}
58+
router.Methods(route.Method).
3359
Path(route.Pattern).
3460
Name(route.Name).
3561
Handler(route.HandlerFunc)
@@ -39,7 +65,6 @@ func NewRouter() *mux.Router {
3965
r.Path("/api/login").
4066
Methods("POST").
4167
Name("LoginUser").
42-
//HandlerFunc(LoginUser)
4368
HandlerFunc(LoginUser)
4469

4570
// Route for initializing websocket connection
@@ -115,248 +140,296 @@ var apiRoutes = Routes{
115140
"GET",
116141
"/saves/list",
117142
ListSaves,
143+
false,
118144
}, {
119145
"DlSave",
120146
"GET",
121147
"/saves/dl/{save}",
122148
DLSave,
149+
false,
123150
}, {
124151
"UploadSave",
125152
"POST",
126153
"/saves/upload",
127154
UploadSave,
155+
false,
128156
}, {
129157
"RemoveSave",
130158
"GET",
131159
"/saves/rm/{save}",
132160
RemoveSave,
161+
false,
133162
}, {
134163
"CreateSave",
135164
"GET",
136165
"/saves/create/{save}",
137166
CreateSaveHandler,
167+
true,
138168
}, {
139169
"LoadModsFromSave",
140170
"POST",
141171
"/saves/mods",
142172
LoadModsFromSaveHandler,
173+
true,
143174
}, {
144175
"LogTail",
145176
"GET",
146177
"/log/tail",
147178
LogTail,
179+
false,
148180
}, {
149181
"LoadConfig",
150182
"GET",
151183
"/config",
152184
LoadConfig,
185+
false,
153186
}, {
154187
"StartServer",
155188
"POST",
156189
"/server/start",
157190
StartServer,
191+
true,
158192
}, {
159193
"StopServer",
160194
"GET",
161195
"/server/stop",
162196
StopServer,
197+
false,
163198
}, {
164199
"KillServer",
165200
"GET",
166201
"/server/kill",
167202
KillServer,
203+
false,
168204
}, {
169205
"RunningServer",
170206
"GET",
171207
"/server/status",
172208
CheckServer,
209+
false,
173210
}, {
174211
"FactorioVersion",
175212
"GET",
176213
"/server/facVersion",
177214
FactorioVersion,
215+
false,
178216
}, {
179217
"LogoutUser",
180218
"GET",
181219
"/logout",
182220
LogoutUser,
221+
false,
183222
}, {
184223
"StatusUser",
185224
"GET",
186225
"/user/status",
187226
GetCurrentLogin,
227+
false,
188228
}, {
189229
"ListUsers",
190230
"GET",
191231
"/user/list",
192232
ListUsers,
233+
false,
193234
}, {
194235
"AddUser",
195236
"POST",
196237
"/user/add",
197238
AddUser,
239+
false,
198240
}, {
199241
"RemoveUser",
200242
"POST",
201243
"/user/remove",
202244
RemoveUser,
245+
false,
203246
}, {
204247
"ChangePassword",
205248
"POST",
206249
"/user/password",
207250
ChangePassword,
251+
false,
208252
}, {
209253
"GetServerSettings",
210254
"GET",
211255
"/settings",
212256
GetServerSettings,
257+
false,
213258
}, {
214259
"UpdateServerSettings",
215260
"POST",
216261
"/settings/update",
217262
UpdateServerSettings,
263+
false,
218264
},
219265
// Mod Portal Stuff
220266
{
221267
"ModPortalListAllMods",
222268
"GET",
223269
"/mods/portal/list",
224270
ModPortalListModsHandler,
271+
false,
225272
}, {
226273
"ModPortalGetModInfo",
227274
"GET",
228275
"/mods/portal/info/{mod}",
229276
ModPortalModInfoHandler,
277+
false,
230278
}, {
231279
"ModPortalInstallMod",
232280
"POST",
233281
"/mods/portal/install",
234282
ModPortalInstallHandler,
283+
true,
235284
}, {
236285
"ModPortalLogin",
237286
"POST",
238287
"/mods/portal/login",
239288
ModPortalLoginHandler,
289+
false,
240290
}, {
241291
"ModPortalLoginStatus",
242292
"GET",
243293
"/mods/portal/loginstatus",
244294
ModPortalLoginStatusHandler,
295+
false,
245296
}, {
246297
"ModPortalLogout",
247298
"GET",
248299
"/mods/portal/logout",
249300
ModPortalLogoutHandler,
301+
false,
250302
}, {
251303
"ModPortalInstallMultiple",
252304
"POST",
253305
"/mods/portal/install/multiple",
254306
ModPortalInstallMultipleHandler,
307+
true,
255308
},
256309
// Mods Stuff
257310
{
258311
"ListInstalledMods",
259312
"GET",
260313
"/mods/list",
261314
ListInstalledModsHandler,
315+
false,
262316
}, {
263317
"ToggleMod",
264318
"POST",
265319
"/mods/toggle",
266320
ModToggleHandler,
321+
true,
267322
}, {
268323
"DeleteMod",
269324
"POST",
270325
"/mods/delete",
271326
ModDeleteHandler,
327+
true,
272328
}, {
273329
"DeleteAllMods",
274330
"POST",
275331
"/mods/delete/all",
276332
ModDeleteAllHandler,
333+
true,
277334
}, {
278335
"UpdateMod",
279336
"POST",
280337
"/mods/update",
281338
ModUpdateHandler,
339+
true,
282340
}, {
283341
"UploadMod",
284342
"POST",
285343
"/mods/upload",
286344
ModUploadHandler,
345+
true,
287346
}, {
288347
"DownloadMods",
289348
"GET",
290349
"/mods/download",
291350
ModDownloadHandler,
351+
false,
292352
},
293353
// Mod Packs
294354
{
295355
"ModPacksList",
296356
"GET",
297357
"/mods/packs/list",
298358
ModPackListHandler,
359+
false,
299360
}, {
300361
"ModPackCreate",
301362
"POST",
302363
"/mods/packs/create",
303364
ModPackCreateHandler,
365+
false,
304366
}, {
305367
"ModPackDelete",
306368
"POST",
307369
"/mods/packs/{modpack}/delete",
308370
ModPackDeleteHandler,
371+
false,
309372
}, {
310373
"ModPackDownload",
311374
"GET",
312375
"/mods/packs/{modpack}/download",
313376
ModPackDownloadHandler,
377+
false,
314378
}, {
315379
"LoadModPack",
316380
"POST",
317381
"/mods/packs/{modpack}/load",
318382
ModPackLoadHandler,
383+
true,
319384
},
320385
// Mods inside Mod Packs
321386
{
322387
"ModPackListMods",
323388
"GET",
324389
"/mods/packs/{modpack}/list",
325390
ModPackModListHandler,
391+
false,
326392
}, {
327393
"ModPackToggleMod",
328394
"POST",
329395
"/mods/packs/{modpack}/mod/toggle",
330396
ModPackModToggleHandler,
397+
false,
331398
}, {
332399
"ModPackDeleteMod",
333400
"POST",
334401
"/mods/packs/{modpack}/mod/delete",
335402
ModPackModDeleteHandler,
403+
false,
336404
}, {
337405
"ModPackDeleteAllMod",
338406
"POST",
339407
"/mods/packs/{modpack}/mod/delete/all",
340408
ModPackModDeleteAllHandler,
409+
false,
341410
}, {
342411
"ModPackUpdateMod",
343412
"POST",
344413
"/mods/packs/{modpack}/mod/update",
345414
ModPackModUpdateHandler,
415+
false,
346416
}, {
347417
"ModPackUploadMod",
348418
"POST",
349419
"/mods/packs/{modpack}/mod/upload",
350420
ModPackModUploadHandler,
421+
false,
351422
}, {
352423
"ModPackModPortalInstallMod",
353424
"POST",
354425
"/mods/packs/{modpack}/portal/install",
355426
ModPackModPortalInstallHandler,
427+
false,
356428
}, {
357429
"ModPackModPortalInstallMultiple",
358430
"POST",
359431
"/mods/packs/{modpack}/portal/install/multiple",
360432
ModPackModPortalInstallMultipleHandler,
433+
false,
361434
},
362435
}

0 commit comments

Comments
 (0)