source: scripts/usr/local/lib/7dtd/serverconfig.sh@ 304

Last change on this file since 304 was 303, checked in by alloc, 7 years ago

v107 fixes

File size: 24.1 KB
Line 
1#!/bin/bash
2
3# Copyright 2016 Christian 'Alloc' Illy
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17
18# Provides functions to query and validate values for serverconfig.xml
19
20#################################
21## Definition of options
22
23serverconfig_ServerPort_QueryName() {
24 echo "Base Port"
25}
26serverconfig_ServerPort_Type() {
27 echo "number"
28}
29serverconfig_ServerPort_Default() {
30 echo "26900"
31}
32serverconfig_ServerPort_Range() {
33 echo "1024-65533"
34}
35serverconfig_ServerPort_Validate() {
36 local I=${INSTANCE:-!}
37 if [ $(checkGamePortUsed "$1" "$I") -eq 0 ]; then
38 echo "1"
39 else
40 echo "0"
41 fi
42}
43serverconfig_ServerPort_ErrorMessage() {
44 echo "Illegal port number or port already in use by another instance."
45}
46
47
48serverconfig_ServerDisabledNetworkProtocols_QueryName() {
49 echo "Disabled network protocols"
50}
51serverconfig_ServerDisabledNetworkProtocols_Type() {
52 echo "enum"
53}
54serverconfig_ServerDisabledNetworkProtocols_Default() {
55 echo "1"
56}
57serverconfig_ServerDisabledNetworkProtocols_Values() {
58 config_allowed_values=("None" "UNET" "UNET,SteamNetworking" "UNET,RakNet" "UNET,SteamNetworking,RakNet" "SteamNetworking" "SteamNetworking,RakNet" "RakNet")
59}
60
61
62serverconfig_ServerIsPublic_QueryName() {
63 echo "Public server"
64}
65serverconfig_ServerIsPublic_Type() {
66 echo "boolean"
67}
68serverconfig_ServerIsPublic_Default() {
69 echo "true"
70}
71serverconfig_ServerIsPublic_ErrorMessage() {
72 echo "Not a valid boolean given (true/false or yes/no or y/n)."
73}
74
75
76
77serverconfig_ServerName_QueryName() {
78 echo "Server name"
79}
80serverconfig_ServerName_Type() {
81 echo "string"
82}
83serverconfig_ServerName_Validate() {
84 if [ ! -z "$1" ]; then
85 echo "1"
86 else
87 echo "0"
88 fi
89}
90serverconfig_ServerName_ErrorMessage() {
91 echo "Server name cannot be empty."
92}
93
94
95
96serverconfig_ServerDescription_QueryName() {
97 echo "Server description"
98}
99serverconfig_ServerDescription_Type() {
100 echo "string"
101}
102
103
104
105serverconfig_ServerWebsiteURL_QueryName() {
106 echo "Server website URL"
107}
108serverconfig_ServerWebsiteURL_Type() {
109 echo "string"
110}
111
112
113
114serverconfig_ServerPassword_QueryName() {
115 echo "Server password"
116}
117serverconfig_ServerPassword_Type() {
118 echo "string"
119}
120
121
122
123serverconfig_MaxUncoveredMapChunksPerPlayer_QueryName() {
124 echo "Max uncovered chunks per player"
125}
126serverconfig_MaxUncoveredMapChunksPerPlayer_Type() {
127 echo "number"
128}
129serverconfig_MaxUncoveredMapChunksPerPlayer_Default() {
130 echo "131072"
131}
132
133
134serverconfig_HideCommandExecutionLog_QueryName() {
135 echo "Hide command execution in log"
136}
137serverconfig_HideCommandExecutionLog_Type() {
138 echo "number"
139}
140serverconfig_HideCommandExecutionLog_Default() {
141 echo "0"
142}
143serverconfig_HideCommandExecutionLog_Range() {
144 echo "0-3"
145}
146serverconfig_HideCommandExecutionLog_Values() {
147 config_allowed_values=("Log all" "Log all but commands from Telnet/ControlPanel" "Also hide commands executed by clients" "Do not log any commands at all")
148}
149
150
151
152
153serverconfig_ServerMaxPlayerCount_QueryName() {
154 echo "Max players"
155}
156serverconfig_ServerMaxPlayerCount_Type() {
157 echo "number"
158}
159serverconfig_ServerMaxPlayerCount_Default() {
160 echo "4"
161}
162serverconfig_ServerMaxPlayerCount_Range() {
163 echo "1-64"
164}
165
166
167serverconfig_ServerReservedSlots_QueryName() {
168 echo "Reserved VIP slots"
169}
170serverconfig_ServerReservedSlots_Type() {
171 echo "number"
172}
173serverconfig_ServerReservedSlots_Default() {
174 echo "0"
175}
176serverconfig_ServerReservedSlots_Range() {
177 echo "0-64"
178}
179
180
181serverconfig_ServerReservedSlotsPermission_QueryName() {
182 echo "Permission level required for VIP slots"
183}
184serverconfig_ServerReservedSlotsPermission_Type() {
185 echo "number"
186}
187serverconfig_ServerReservedSlotsPermission_Default() {
188 echo "100"
189}
190serverconfig_ServerReservedSlotsPermission_Range() {
191 echo "0-2000"
192}
193
194
195serverconfig_ServerAdminSlots_QueryName() {
196 echo "Admin slots"
197}
198serverconfig_ServerAdminSlots_Type() {
199 echo "number"
200}
201serverconfig_ServerAdminSlots_Default() {
202 echo "0"
203}
204serverconfig_ServerAdminSlots_Range() {
205 echo "0-64"
206}
207
208
209serverconfig_ServerAdminSlotsPermission_QueryName() {
210 echo "Permission level required for admin slots"
211}
212serverconfig_ServerAdminSlotsPermission_Type() {
213 echo "number"
214}
215serverconfig_ServerAdminSlotsPermission_Default() {
216 echo "0"
217}
218serverconfig_ServerAdminSlotsPermission_Range() {
219 echo "0-2000"
220}
221
222
223
224
225serverconfig_GameWorld_QueryName() {
226 echo "World name"
227}
228serverconfig_GameWorld_Type() {
229 echo "enum"
230}
231serverconfig_GameWorld_Default() {
232 echo "1"
233}
234serverconfig_GameWorld_Values() {
235 config_allowed_values=("Random Gen" "Navezgane") # "MP Wasteland Horde" "MP Wasteland Skirmish" "MP Wasteland War"
236}
237
238
239
240serverconfig_GameName_QueryName() {
241 echo "Random gen seed"
242}
243serverconfig_GameName_Type() {
244 echo "string"
245}
246serverconfig_GameName_Validate() {
247 if [ ! -z "$1" ]; then
248 echo "1"
249 else
250 echo "0"
251 fi
252}
253serverconfig_GameName_ErrorMessage() {
254 echo "Seed cannot be empty."
255}
256
257
258
259serverconfig_GameDifficulty_QueryName() {
260 echo "Difficulty (+ damage given / received)"
261}
262serverconfig_GameDifficulty_Type() {
263 echo "number"
264}
265serverconfig_GameDifficulty_Default() {
266 echo "2"
267}
268serverconfig_GameDifficulty_Range() {
269 echo "0-5"
270}
271serverconfig_GameDifficulty_Values() {
272 config_allowed_values=("Scavenger (200% / 50%)" "Adventurer (150% / 75%)" "Nomad (100% / 100%)" "Warrior (75% / 150%)" "Survivalist (50% / 200%)" "Insane (25% / 250%)")
273}
274
275
276
277serverconfig_GameMode_QueryName() {
278 echo "Game mode"
279}
280serverconfig_GameMode_Type() {
281 echo "enum"
282}
283serverconfig_GameMode_Default() {
284 echo "1"
285}
286serverconfig_GameMode_Values() {
287 config_allowed_values=("GameModeSurvivalMP" "GameModeSurvivalSP")
288}
289
290
291
292serverconfig_ZombiesRun_QueryName() {
293 echo "Zombies run"
294}
295serverconfig_ZombiesRun_Type() {
296 echo "number"
297}
298serverconfig_ZombiesRun_Default() {
299 echo "0"
300}
301serverconfig_ZombiesRun_Range() {
302 echo "0-2"
303}
304serverconfig_ZombiesRun_Values() {
305 config_allowed_values=("Default day/night walk/run" "Never run" "Always run")
306}
307
308
309
310serverconfig_BuildCreate_QueryName() {
311 echo "Item spawn menu"
312}
313serverconfig_BuildCreate_Type() {
314 echo "boolean"
315}
316serverconfig_BuildCreate_Default() {
317 echo "false"
318}
319serverconfig_BuildCreate_ErrorMessage() {
320 echo "Not a valid boolean given (true/false or yes/no or y/n)."
321}
322
323
324
325serverconfig_DayNightLength_QueryName() {
326 echo "Length of one day"
327}
328serverconfig_DayNightLength_Type() {
329 echo "number"
330}
331serverconfig_DayNightLength_Default() {
332 echo "50"
333}
334
335
336
337serverconfig_DayLightLength_QueryName() {
338 echo "Duration of daylight (in ingame hours)"
339}
340serverconfig_DayLightLength_Type() {
341 echo "number"
342}
343serverconfig_DayLightLength_Default() {
344 echo "18"
345}
346serverconfig_DayLightLength_Range() {
347 echo "0-24"
348}
349
350
351
352serverconfig_PlayerKillingMode_QueryName() {
353 echo "Player killing"
354}
355serverconfig_PlayerKillingMode_Type() {
356 echo "number"
357}
358serverconfig_PlayerKillingMode_Default() {
359 echo "3"
360}
361serverconfig_PlayerKillingMode_Range() {
362 echo "0-3"
363}
364serverconfig_PlayerKillingMode_Values() {
365 config_allowed_values=("No player killing" "Kill allies only" "Kill strangers only" "Kill everyone")
366}
367
368
369
370serverconfig_PersistentPlayerProfiles_QueryName() {
371 echo "Persistent player profiles"
372}
373serverconfig_PersistentPlayerProfiles_Type() {
374 echo "boolean"
375}
376serverconfig_PersistentPlayerProfiles_Default() {
377 echo "false"
378}
379serverconfig_PersistentPlayerProfiles_ErrorMessage() {
380 echo "Not a valid boolean given (true/false or yes/no or y/n)."
381}
382
383
384
385serverconfig_PlayerSafeZoneLevel_QueryName() {
386 echo "Safe zone up to player level"
387}
388serverconfig_PlayerSafeZoneLevel_Type() {
389 echo "number"
390}
391serverconfig_PlayerSafeZoneLevel_Default() {
392 echo "5"
393}
394
395
396serverconfig_PlayerSafeZoneHours_QueryName() {
397 echo "Safe zone up to played hours"
398}
399serverconfig_PlayerSafeZoneHours_Type() {
400 echo "number"
401}
402serverconfig_PlayerSafeZoneHours_Default() {
403 echo "5"
404}
405
406
407serverconfig_ControlPanelEnabled_QueryName() {
408 echo "Enable control panel"
409}
410serverconfig_ControlPanelEnabled_Type() {
411 echo "boolean"
412}
413serverconfig_ControlPanelEnabled_Default() {
414 echo "false"
415}
416serverconfig_ControlPanelEnabled_ErrorMessage() {
417 echo "Not a valid boolean given (true/false or yes/no or y/n)."
418}
419
420
421
422serverconfig_ControlPanelPort_QueryName() {
423 echo "Control panel port"
424}
425serverconfig_ControlPanelPort_Type() {
426 echo "number"
427}
428serverconfig_ControlPanelPort_Default() {
429 echo "8080"
430}
431serverconfig_ControlPanelPort_Range() {
432 echo "1024-65535"
433}
434serverconfig_ControlPanelPort_Validate() {
435 local I=${INSTANCE:-!}
436 if [ $(checkTCPPortUsed "$1" "$I") -eq 0 ]; then
437 echo "1"
438 else
439 echo "0"
440 fi
441}
442serverconfig_ControlPanelPort_ErrorMessage() {
443 echo "Illegal port number or port already in use by another instance."
444}
445
446
447
448serverconfig_ControlPanelPassword_QueryName() {
449 echo "Control panel password"
450}
451serverconfig_ControlPanelPassword_Type() {
452 echo "string"
453}
454
455
456
457serverconfig_TelnetPort_QueryName() {
458 echo "Telnet port"
459}
460serverconfig_TelnetPort_Type() {
461 echo "number"
462}
463serverconfig_TelnetPort_Default() {
464 echo "8081"
465}
466serverconfig_TelnetPort_Range() {
467 echo "1024-65535"
468}
469serverconfig_TelnetPort_Validate() {
470 local I=${INSTANCE:-!}
471 if [ $(checkTCPPortUsed "$1" "$I") -eq 0 ]; then
472 echo "1"
473 else
474 echo "0"
475 fi
476}
477serverconfig_TelnetPort_ErrorMessage() {
478 echo "Illegal port number or port already in use by another instance."
479}
480
481
482
483serverconfig_TelnetPassword_QueryName() {
484 echo "Telnet password"
485}
486serverconfig_TelnetPassword_Type() {
487 echo "string"
488}
489
490
491
492serverconfig_DropOnDeath_QueryName() {
493 echo "Drop on Death"
494}
495serverconfig_DropOnDeath_Type() {
496 echo "number"
497}
498serverconfig_DropOnDeath_Default() {
499 echo "0"
500}
501serverconfig_DropOnDeath_Range() {
502 echo "0-3"
503}
504serverconfig_DropOnDeath_Values() {
505 config_allowed_values=("Everything" "Toolbelt only" "Backpack only" "Delete all")
506}
507
508
509serverconfig_DropOnQuit_QueryName() {
510 echo "Drop on Quit"
511}
512serverconfig_DropOnQuit_Type() {
513 echo "number"
514}
515serverconfig_DropOnQuit_Default() {
516 echo "1"
517}
518serverconfig_DropOnQuit_Range() {
519 echo "0-3"
520}
521serverconfig_DropOnQuit_Values() {
522 config_allowed_values=("Nothing" "Everything" "Toolbelt only" "Backpack only")
523}
524
525
526
527
528serverconfig_EnemySpawnMode_QueryName() {
529 echo "Spawn mode"
530}
531serverconfig_EnemySpawnMode_Type() {
532 echo "boolean"
533}
534serverconfig_EnemySpawnMode_Default() {
535 echo "true"
536}
537serverconfig_EnemySpawnMode_ErrorMessage() {
538 echo "Not a valid boolean given (true/false or yes/no or y/n)."
539}
540
541
542serverconfig_EnemyDifficulty_QueryName() {
543 echo "Enemy difficulty"
544}
545serverconfig_EnemyDifficulty_Type() {
546 echo "number"
547}
548serverconfig_EnemyDifficulty_Default() {
549 echo "0"
550}
551serverconfig_EnemyDifficulty_Range() {
552 echo "0-1"
553}
554serverconfig_EnemyDifficulty_Values() {
555 config_allowed_values=("Normal" "Feral")
556}
557
558
559serverconfig_BloodMoonEnemyCount_QueryName() {
560 echo "Enemies per Player on Blood moons"
561}
562serverconfig_BloodMoonEnemyCount_Type() {
563 echo "number"
564}
565serverconfig_BloodMoonEnemyCount_Default() {
566 echo "8"
567}
568serverconfig_BloodMoonEnemyCount_Range() {
569 echo "0-64"
570}
571
572
573
574
575serverconfig_BlockDurabilityModifier_QueryName() {
576 echo "Block durability (%)"
577}
578serverconfig_BlockDurabilityModifier_Type() {
579 echo "number"
580}
581serverconfig_BlockDurabilityModifier_Default() {
582 echo "100"
583}
584
585
586
587
588serverconfig_LootAbundance_QueryName() {
589 echo "Loot abundance (%)"
590}
591serverconfig_LootAbundance_Type() {
592 echo "number"
593}
594serverconfig_LootAbundance_Default() {
595 echo "100"
596}
597
598
599serverconfig_LootRespawnDays_QueryName() {
600 echo "Loot respawn delay (days)"
601}
602serverconfig_LootRespawnDays_Type() {
603 echo "number"
604}
605serverconfig_LootRespawnDays_Default() {
606 echo "7"
607}
608
609serverconfig_BedrollDeadZoneSize_QueryName() {
610 echo "Bedroll deadzone size"
611}
612serverconfig_BedrollDeadZoneSize_Type() {
613 echo "number"
614}
615serverconfig_BedrollDeadZoneSize_Default() {
616 echo "15"
617}
618
619
620
621
622serverconfig_LandClaimSize_QueryName() {
623 echo "Land claim size"
624}
625serverconfig_LandClaimSize_Type() {
626 echo "number"
627}
628serverconfig_LandClaimSize_Default() {
629 echo "7"
630}
631
632
633serverconfig_LandClaimDeadZone_QueryName() {
634 echo "Minimum keystone distance"
635}
636serverconfig_LandClaimDeadZone_Type() {
637 echo "number"
638}
639serverconfig_LandClaimDeadZone_Default() {
640 echo "30"
641}
642
643
644serverconfig_LandClaimExpiryTime_QueryName() {
645 echo "Claim expiry time (days)"
646}
647serverconfig_LandClaimExpiryTime_Type() {
648 echo "number"
649}
650serverconfig_LandClaimExpiryTime_Default() {
651 echo "3"
652}
653
654
655serverconfig_LandClaimDecayMode_QueryName() {
656 echo "Claim decay mode"
657}
658serverconfig_LandClaimDecayMode_Type() {
659 echo "number"
660}
661serverconfig_LandClaimDecayMode_Default() {
662 echo "0"
663}
664serverconfig_LandClaimDecayMode_Range() {
665 echo "0-2"
666}
667serverconfig_LandClaimDecayMode_Values() {
668 config_allowed_values=("Linear" "Exponential" "Full protection")
669}
670
671
672serverconfig_LandClaimOnlineDurabilityModifier_QueryName() {
673 echo "Claim durability modifier - online"
674}
675serverconfig_LandClaimOnlineDurabilityModifier_Type() {
676 echo "number"
677}
678serverconfig_LandClaimOnlineDurabilityModifier_Default() {
679 echo "4"
680}
681
682
683serverconfig_LandClaimOfflineDurabilityModifier_QueryName() {
684 echo "Claim durability modifier - offline"
685}
686serverconfig_LandClaimOfflineDurabilityModifier_Type() {
687 echo "number"
688}
689serverconfig_LandClaimOfflineDurabilityModifier_Default() {
690 echo "4"
691}
692
693
694
695
696serverconfig_AirDropFrequency_QueryName() {
697 echo "Airdrop delay (hours)"
698}
699serverconfig_AirDropFrequency_Type() {
700 echo "number"
701}
702serverconfig_AirDropFrequency_Default() {
703 echo "72"
704}
705
706
707serverconfig_AirDropMarker_QueryName() {
708 echo "Enable AirDrop markers"
709}
710serverconfig_AirDropMarker_Type() {
711 echo "boolean"
712}
713serverconfig_AirDropMarker_Default() {
714 echo "false"
715}
716serverconfig_AirDropMarker_ErrorMessage() {
717 echo "Not a valid boolean given (true/false or yes/no or y/n)."
718}
719
720
721
722serverconfig_MaxSpawnedZombies_QueryName() {
723 echo "Maximum number of concurrent zombies"
724}
725serverconfig_MaxSpawnedZombies_Type() {
726 echo "number"
727}
728serverconfig_MaxSpawnedZombies_Default() {
729 echo "60"
730}
731
732
733serverconfig_MaxSpawnedAnimals_QueryName() {
734 echo "Maximum number of concurrent animals"
735}
736serverconfig_MaxSpawnedAnimals_Type() {
737 echo "number"
738}
739serverconfig_MaxSpawnedAnimals_Default() {
740 echo "50"
741}
742
743
744serverconfig_EACEnabled_QueryName() {
745 echo "Enable EasyAntiCheat"
746}
747serverconfig_EACEnabled_Type() {
748 echo "boolean"
749}
750serverconfig_EACEnabled_Default() {
751 echo "true"
752}
753serverconfig_EACEnabled_ErrorMessage() {
754 echo "Not a valid boolean given (true/false or yes/no or y/n)."
755}
756
757
758
759
760#################################
761## Edit option functions
762
763configEditServer() {
764 local CV
765
766 echo "Server"
767 echo "--------------------------------"
768 for CV in \
769 ServerName ServerPassword ServerIsPublic ServerPort ServerDisabledNetworkProtocols ServerDescription ServerWebsiteURL \
770 HideCommandExecutionLog MaxUncoveredMapChunksPerPlayer EACEnabled MaxSpawnedZombies MaxSpawnedAnimals \
771 ; do
772 $1 $CV
773 done
774 echo
775}
776
777configEditSlots() {
778 local CV
779
780 echo "Slots"
781 echo "--------------------------------"
782 for CV in \
783 ServerMaxPlayerCount ServerReservedSlots ServerReservedSlotsPermission ServerAdminSlots ServerAdminSlotsPermission \
784 ; do
785 $1 $CV
786 done
787 echo
788}
789
790configEditRemoteControl() {
791 local CV
792
793 echo "Remote control"
794 echo "--------------------------------"
795 for CV in \
796 ControlPanelEnabled ControlPanelPort ControlPanelPassword \
797 TelnetPort TelnetPassword \
798 ; do
799 if [ "$CV" = "TelnetPort" ]; then
800 echo
801 echo "NOTE: Telnet will always be enabled for management purposes!"
802 echo "Make sure you block external access to this port or set no password"
803 echo "so the server will only listen on the loopback interface!"
804 echo
805 fi
806 $1 $CV
807 done
808 echo
809}
810
811configEditGameType() {
812 local CV
813
814 echo "Game type"
815 echo "--------------------------------"
816 for CV in \
817 GameName GameWorld GameMode \
818 ; do
819 $1 $CV
820 done
821 echo
822}
823
824configEditGeneric() {
825 local CV
826
827 echo "Generic options"
828 echo "--------------------------------"
829 for CV in \
830 PlayerKillingMode PersistentPlayerProfiles \
831 PlayerSafeZoneLevel PlayerSafeZoneHours \
832 BuildCreate \
833 BlockDurabilityModifier \
834 ; do
835 $1 $CV
836 done
837 echo
838}
839
840configEditDropLoot() {
841 local CV
842
843 echo "Drop and Loot"
844 echo "--------------------------------"
845 for CV in \
846 DropOnDeath DropOnQuit \
847 LootAbundance LootRespawnDays \
848 AirDropFrequency AirDropMarker \
849 ; do
850 $1 $CV
851 done
852 echo
853}
854
855configEditTimes() {
856 local CV
857
858 echo "Times / Durations"
859 echo "--------------------------------"
860 for CV in \
861 DayNightLength DayLightLength \
862 ; do
863 $1 $CV
864 done
865 echo
866}
867
868configEditDifficulty() {
869 local CV
870
871 echo "Difficulty"
872 echo "--------------------------------"
873 for CV in \
874 GameDifficulty ZombiesRun \
875 EnemySpawnMode EnemyDifficulty \
876 BloodMoonEnemyCount BedrollDeadZoneSize \
877 ; do
878 $1 $CV
879 done
880 echo
881}
882
883configEditLandClaim() {
884 local CV
885
886 echo "Land claim options"
887 echo "--------------------------------"
888 for CV in \
889 LandClaimSize LandClaimDeadZone LandClaimExpiryTime LandClaimDecayMode \
890 LandClaimOnlineDurabilityModifier LandClaimOfflineDurabilityModifier \
891 ; do
892 $1 $CV
893 done
894 echo
895}
896
897configEditAll() {
898 configEditServer "$1"
899 configEditSlots "$1"
900 configEditRemoteControl "$1"
901 configEditGameType "$1"
902 configEditGeneric "$1"
903 configEditDropLoot "$1"
904 configEditTimes "$1"
905 configEditDifficulty "$1"
906 configEditLandClaim "$1"
907}
908
909
910
911
912
913#################################
914## Generic worker functions
915
916
917# List all defined config editing parts
918# Returns:
919# List of config funcs
920listConfigEditFuncs() {
921 local CV
922 for CV in $(declare -F | cut -d\ -f3 | grep "^configEdit.*$"); do
923 CV=${CV#configEdit}
924 printf "%s " "$CV"
925 done
926}
927
928
929# List all defined config options
930# Returns:
931# List of defined config options
932listConfigValues() {
933 local CV
934 for CV in $(declare -F | cut -d\ -f3 | grep "^serverconfig_.*_Type$"); do
935 CV=${CV#serverconfig_}
936 CV=${CV%_Type}
937 printf "%s " "$CV"
938 done
939}
940
941
942# Validate the given value for the given option
943# Params:
944# 1: Option name
945# 2: Value
946# Returns:
947# 0/1: invalid/valid
948isValidOptionValue() {
949 local TYPE=$(serverconfig_$1_Type)
950 local RANGE=""
951
952 if [ "$TYPE" = "enum" ]; then
953 TYPE="number"
954 serverconfig_$1_Values
955 RANGE=1-${#config_allowed_values[@]}
956 else
957 if [ "$(type -t serverconfig_$1_Range)" = "function" ]; then
958 RANGE=$(serverconfig_$1_Range)
959 fi
960 fi
961
962 case "$TYPE" in
963 number)
964 if [ $(isANumber "$2") -eq 0 ]; then
965 echo "0"
966 return
967 fi
968 if [ ! -z "$RANGE" ]; then
969 local MIN=$(cut -d- -f1 <<< "$RANGE")
970 local MAX=$(cut -d- -f2 <<< "$RANGE")
971 if [ $2 -lt $MIN -o $2 -gt $MAX ]; then
972 echo "0"
973 return
974 fi
975 fi
976 ;;
977 boolean)
978 if [ $(isABool "$2") -eq 0 ]; then
979 echo "0"
980 return
981 fi
982 ;;
983 string)
984 ;;
985 esac
986
987
988 if [ "$(type -t serverconfig_$1_Validate)" = "function" ]; then
989 if [ $(serverconfig_$1_Validate "$2") -eq 0 ]; then
990 echo "0"
991 return
992 fi
993 fi
994
995 echo "1"
996}
997
998# Query for the value of a single config option
999# Will be stored in $configCurrent_$1
1000# Params:
1001# 1: Option name
1002configQueryValue() {
1003 local TYPE=$(serverconfig_$1_Type)
1004 local NAME=""
1005 local RANGE=""
1006 local DEFAULT=""
1007 local currentValName=configCurrent_$1
1008
1009 if [ "$(type -t serverconfig_$1_Values)" = "function" ]; then
1010 echo "$(serverconfig_$1_QueryName), options:"
1011 serverconfig_$1_Values
1012 NAME="Select option"
1013 if [ "$TYPE" = "enum" ]; then
1014 local OPTOFFSET=1
1015 else
1016 local OPTOFFSET=0
1017 fi
1018 for (( i=$OPTOFFSET; i < ${#config_allowed_values[@]}+$OPTOFFSET; i++ )); do
1019 printf " %2d: %s\n" $i "${config_allowed_values[$i-$OPTOFFSET]}"
1020 done
1021 else
1022 NAME=$(serverconfig_$1_QueryName)
1023 fi
1024
1025 if [ "$TYPE" = "enum" ]; then
1026 RANGE=1-${#config_allowed_values[@]}
1027 if [ ! -z "${!currentValName}" ]; then
1028 for (( i=1; i < ${#config_allowed_values[@]}+1; i++ )); do
1029 if [ "${!currentValName}" = "${config_allowed_values[$i-1]}" ]; then
1030 DEFAULT=$i
1031 fi
1032 done
1033 export $currentValName=
1034 fi
1035 else
1036 if [ "$(type -t serverconfig_$1_Range)" = "function" ]; then
1037 RANGE=$(serverconfig_$1_Range)
1038 fi
1039 fi
1040
1041 if [ -z "$DEFAULT" ]; then
1042 if [ ! -z "${!currentValName}" ]; then
1043 DEFAULT=${!currentValName}
1044 else
1045 if [ "$(type -t serverconfig_$1_Default)" = "function" ]; then
1046 DEFAULT=$(serverconfig_$1_Default)
1047 fi
1048 fi
1049 fi
1050
1051 local prompt=$(printf "%s" "$NAME")
1052 if [ ! -z "$RANGE" ]; then
1053 prompt=$(printf "%s (%s)" "$prompt" "$RANGE")
1054 fi
1055 if [ ! -z "$DEFAULT" ]; then
1056 prompt=$(printf "%s [%s]" "$prompt" "$DEFAULT")
1057 fi
1058 prompt=$(printf "%s:" "$prompt")
1059 prompt=$(printf "%-*s " 40 "$prompt")
1060
1061 while : ; do
1062 read -p "$prompt" $currentValName
1063 export $currentValName="${!currentValName:-$DEFAULT}"
1064 if [ $(isValidOptionValue "$1" "${!currentValName}") -eq 0 ]; then
1065 if [ "$(type -t serverconfig_$1_ErrorMessage)" = "function" ]; then
1066 serverconfig_$1_ErrorMessage "${!currentValName}"
1067 fi
1068 fi
1069 [ $(isValidOptionValue "$1" "${!currentValName}") -eq 1 ] && break
1070 done
1071
1072 if [ "$TYPE" = "boolean" ]; then
1073 if [ $(getBool ${!currentValName}) -eq 1 ]; then
1074 export $currentValName="true"
1075 else
1076 export $currentValName="false"
1077 fi
1078 fi
1079 if [ "$TYPE" = "enum" ]; then
1080 export $currentValName="${config_allowed_values[$currentValName-1]}"
1081 fi
1082 echo
1083}
1084
1085# Set parameters for current instance that have forced values:
1086# - TelnetEnabled must be set so that management scripts can work
1087# - AdminFileName is made to point to the local instance admins.xml
1088# - SaveGameFolder is made to point to the instance folder
1089# Params:
1090# 1: Instance name
1091configSetAutoParameters() {
1092 configCurrent_TelnetEnabled=true
1093 configCurrent_AdminFileName=admins.xml
1094 configCurrent_SaveGameFolder="$(getInstancePath "$1")"
1095}
1096
1097
1098# Print defined config value
1099# Params:
1100# 1: Config option
1101printConfigValue() {
1102 local currentValName=configCurrent_$1
1103 printf "%-25s = %s\n" "$(serverconfig_$1_QueryName)" "${!currentValName}"
1104}
1105
1106# Query for an instance name (will be saved in $INSTANCE)
1107readInstanceName() {
1108 until [ $(isValidInstanceName "$INSTANCE") -eq 1 ]; do
1109 read -p "Instance name: " INSTANCE
1110 if [ $(isValidInstanceName "$INSTANCE") -eq 0 ]; then
1111 echo "Invalid instance name, may only contain:"
1112 echo " - letters (A-Z / a-z)"
1113 echo " - digits (0-9)"
1114 echo " - underscores (_)"
1115 echo " - hyphens (-)"
1116 fi
1117 done
1118}
1119
1120# Undefine the current config values
1121unsetAllConfigValues() {
1122 local CV
1123 for CV in $(listConfigValues); do
1124 local currentValName=configCurrent_$CV
1125 export $currentValName=
1126 done
1127}
1128
1129# Load all config values from the config.xml of the given instance
1130# Params:
1131# 1: Instance name
1132loadCurrentConfigValues() {
1133 local CV
1134 for CV in $(listConfigValues); do
1135 local currentValName=configCurrent_$CV
1136 local cfile=$(getInstancePath "$1")/config.xml
1137 local XPATH="/ServerSettings/property[@name='$CV']/@value"
1138 local VAL=$($XMLSTARLET sel -t -v "$XPATH" $cfile)
1139 if [ ! -z "$VAL" ]; then
1140 export $currentValName="$VAL"
1141 fi
1142 done
1143}
1144
1145# Save all config values to the config.xml of the given instance
1146# Params:
1147# 1: Instance name
1148saveCurrentConfigValues() {
1149 local CV
1150 for CV in $(listConfigValues) TelnetEnabled AdminFileName SaveGameFolder; do
1151 local currentValName=configCurrent_$CV
1152 local val="${!currentValName}"
1153 local cfile=$(getInstancePath "$1")/config.xml
1154
1155 XPATHBASE="/ServerSettings/property[@name='$CV']"
1156
1157 if [ -z $($XMLSTARLET sel -t -v "$XPATHBASE/@name" $cfile) ]; then
1158 $XMLSTARLET ed -L \
1159 -s "/ServerSettings" -t elem -n "property" -v "" \
1160 -i "/ServerSettings/property[not(@name)]" -t attr -n "name" -v "$CV" \
1161 -i "$XPATHBASE" -t attr -n "value" -v "$val" \
1162 $cfile
1163 else
1164 $XMLSTARLET ed -L \
1165 -u "$XPATHBASE/@value" -v "$val" \
1166 $cfile
1167 fi
1168 done
1169}
1170
1171# Check if the config template exists
1172# Returns:
1173# 0/1: no/yes
1174configTemplateExists() {
1175 if [ -f $SDTD_BASE/templates/config.xml ]; then
1176 echo 1
1177 else
1178 echo 0
1179 fi
1180}
1181
1182# Get a single value from a serverconfig
1183# Params:
1184# 1: Instance name
1185# 2: Property name
1186# Returns:
1187# Property value
1188getConfigValue() {
1189 local CONF=$(getInstancePath $1)/config.xml
1190 $XMLSTARLET sel -t -v "/ServerSettings/property[@name='$2']/@value" $CONF
1191}
1192
1193# Update a single value in a serverconfig
1194# Params:
1195# 1: Instance name
1196# 2: Property name
1197# 3: New value
1198setConfigValue() {
1199 local CONF=$(getInstancePath $1)/config.xml
1200 $XMLSTARLET ed -L -u "/ServerSettings/property[@name='$2']/@value" -v "$3" $CONF
1201}
1202
Note: See TracBrowser for help on using the repository browser.