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

Last change on this file since 33 was 24, checked in by alloc, 10 years ago

Version 7: Added 'instances print_config <instance>'

File size: 21.2 KB
Line 
1#!/bin/bash
2
3# Provides functions to query and validate values for serverconfig.xml
4
5#################################
6## Definition of options
7
8serverconfig_ServerPort_QueryName() {
9 echo "Base Port"
10}
11serverconfig_ServerPort_Type() {
12 echo "number"
13}
14serverconfig_ServerPort_Default() {
15 echo "25000"
16}
17serverconfig_ServerPort_Range() {
18 echo "1024-65533"
19}
20serverconfig_ServerPort_Validate() {
21 local I=${INSTANCE:-!}
22 if [ $(checkGamePortUsed "$1" "$I") -eq 0 ]; then
23 echo "1"
24 else
25 echo "0"
26 fi
27}
28serverconfig_ServerPort_ErrorMessage() {
29 echo "Illegal port number or port already in use by another instance."
30}
31
32
33
34serverconfig_ServerIsPublic_QueryName() {
35 echo "Public server"
36}
37serverconfig_ServerIsPublic_Type() {
38 echo "boolean"
39}
40serverconfig_ServerIsPublic_Default() {
41 echo "true"
42}
43serverconfig_ServerIsPublic_ErrorMessage() {
44 echo "Not a valid boolean given (true/false or yes/no or y/n)."
45}
46
47
48
49serverconfig_ServerName_QueryName() {
50 echo "Server name"
51}
52serverconfig_ServerName_Type() {
53 echo "string"
54}
55serverconfig_ServerName_Validate() {
56 if [ ! -z "$1" ]; then
57 echo "1"
58 else
59 echo "0"
60 fi
61}
62serverconfig_ServerName_ErrorMessage() {
63 echo "Server name cannot be empty."
64}
65
66
67
68serverconfig_ServerPassword_QueryName() {
69 echo "Server password"
70}
71serverconfig_ServerPassword_Type() {
72 echo "string"
73}
74
75
76
77serverconfig_ServerMaxPlayerCount_QueryName() {
78 echo "Max players"
79}
80serverconfig_ServerMaxPlayerCount_Type() {
81 echo "number"
82}
83serverconfig_ServerMaxPlayerCount_Default() {
84 echo "4"
85}
86serverconfig_ServerMaxPlayerCount_Range() {
87 echo "1-64"
88}
89
90
91
92serverconfig_GameWorld_QueryName() {
93 echo "World name"
94}
95serverconfig_GameWorld_Type() {
96 echo "enum"
97}
98serverconfig_GameWorld_Default() {
99 echo "1"
100}
101serverconfig_GameWorld_Values() {
102 config_allowed_values=("Navezgane" "MP Wasteland Horde" "MP Wasteland Skirmish" "MP Wasteland War")
103}
104
105
106
107serverconfig_GameName_QueryName() {
108 echo "Game name"
109}
110serverconfig_GameName_Type() {
111 echo "string"
112}
113serverconfig_GameName_Validate() {
114 if [ ! -z "$1" ]; then
115 echo "1"
116 else
117 echo "0"
118 fi
119}
120serverconfig_GameName_ErrorMessage() {
121 echo "Game name cannot be empty."
122}
123
124
125
126serverconfig_GameDifficulty_QueryName() {
127 echo "Difficulty"
128}
129serverconfig_GameDifficulty_Type() {
130 echo "number"
131}
132serverconfig_GameDifficulty_Default() {
133 echo "2"
134}
135serverconfig_GameDifficulty_Range() {
136 echo "0-4"
137}
138serverconfig_GameDifficulty_Values() {
139 config_allowed_values=("Very easy" "Easy" "Medium" "Hard" "Very hard")
140}
141
142
143
144serverconfig_GameMode_QueryName() {
145 echo "Game mode"
146}
147serverconfig_GameMode_Type() {
148 echo "enum"
149}
150serverconfig_GameMode_Default() {
151 echo "1"
152}
153serverconfig_GameMode_Values() {
154 config_allowed_values=("GameModeSurvivalMP" "GameModeSurvivalSP")
155}
156
157
158
159serverconfig_ZombiesRun_QueryName() {
160 echo "Zombies run"
161}
162serverconfig_ZombiesRun_Type() {
163 echo "number"
164}
165serverconfig_ZombiesRun_Default() {
166 echo "0"
167}
168serverconfig_ZombiesRun_Range() {
169 echo "0-2"
170}
171serverconfig_ZombiesRun_Values() {
172 config_allowed_values=("Default day/night walk/run" "Never run" "Always run")
173}
174
175
176
177serverconfig_ShowAllPlayersOnMap_QueryName() {
178 echo "Show all players on map"
179}
180serverconfig_ShowAllPlayersOnMap_Type() {
181 echo "boolean"
182}
183serverconfig_ShowAllPlayersOnMap_Default() {
184 echo "true"
185}
186serverconfig_ShowAllPlayersOnMap_ErrorMessage() {
187 echo "Not a valid boolean given (true/false or yes/no or y/n)."
188}
189
190
191
192serverconfig_BuildCreate_QueryName() {
193 echo "Item spawn menu"
194}
195serverconfig_BuildCreate_Type() {
196 echo "boolean"
197}
198serverconfig_BuildCreate_Default() {
199 echo "true"
200}
201serverconfig_BuildCreate_ErrorMessage() {
202 echo "Not a valid boolean given (true/false or yes/no or y/n)."
203}
204
205
206
207serverconfig_DayNightLength_QueryName() {
208 echo "Length of one day"
209}
210serverconfig_DayNightLength_Type() {
211 echo "number"
212}
213serverconfig_DayNightLength_Default() {
214 echo "45"
215}
216
217
218
219serverconfig_FriendlyFire_QueryName() {
220 echo "Friendly fire"
221}
222serverconfig_FriendlyFire_Type() {
223 echo "boolean"
224}
225serverconfig_FriendlyFire_Default() {
226 echo "false"
227}
228serverconfig_FriendlyFire_ErrorMessage() {
229 echo "Not a valid boolean given (true/false or yes/no or y/n)."
230}
231
232
233
234serverconfig_DayCount_QueryName() {
235 echo "Day Count (Horde)"
236}
237serverconfig_DayCount_Type() {
238 echo "number"
239}
240serverconfig_DayCount_Default() {
241 echo "3"
242}
243
244
245
246serverconfig_FragLimit_QueryName() {
247 echo "Frag limit (DM)"
248}
249serverconfig_FragLimit_Type() {
250 echo "number"
251}
252serverconfig_FragLimit_Default() {
253 echo "5"
254}
255
256
257
258serverconfig_MatchLength_QueryName() {
259 echo "Match length (DM)"
260}
261serverconfig_MatchLength_Type() {
262 echo "number"
263}
264serverconfig_MatchLength_Default() {
265 echo "15"
266}
267
268
269
270serverconfig_RebuildMap_QueryName() {
271 echo "Rebuild map on round restart"
272}
273serverconfig_RebuildMap_Type() {
274 echo "boolean"
275}
276serverconfig_RebuildMap_Default() {
277 echo "false"
278}
279serverconfig_RebuildMap_ErrorMessage() {
280 echo "Not a valid boolean given (true/false or yes/no or y/n)."
281}
282
283
284
285serverconfig_ControlPanelEnabled_QueryName() {
286 echo "Enable control panel"
287}
288serverconfig_ControlPanelEnabled_Type() {
289 echo "boolean"
290}
291serverconfig_ControlPanelEnabled_Default() {
292 echo "false"
293}
294serverconfig_ControlPanelEnabled_ErrorMessage() {
295 echo "Not a valid boolean given (true/false or yes/no or y/n)."
296}
297
298
299
300serverconfig_ControlPanelPort_QueryName() {
301 echo "Control panel port"
302}
303serverconfig_ControlPanelPort_Type() {
304 echo "number"
305}
306serverconfig_ControlPanelPort_Default() {
307 echo "8080"
308}
309serverconfig_ControlPanelPort_Range() {
310 echo "1024-65535"
311}
312serverconfig_ControlPanelPort_Validate() {
313 local I=${INSTANCE:-!}
314 if [ $(checkTCPPortUsed "$1" "$I") -eq 0 ]; then
315 echo "1"
316 else
317 echo "0"
318 fi
319}
320serverconfig_ControlPanelPort_ErrorMessage() {
321 echo "Illegal port number or port already in use by another instance."
322}
323
324
325
326serverconfig_ControlPanelPassword_QueryName() {
327 echo "Control panel password"
328}
329serverconfig_ControlPanelPassword_Type() {
330 echo "string"
331}
332
333
334
335serverconfig_TelnetPort_QueryName() {
336 echo "Telnet port"
337}
338serverconfig_TelnetPort_Type() {
339 echo "number"
340}
341serverconfig_TelnetPort_Default() {
342 echo "8081"
343}
344serverconfig_TelnetPort_Range() {
345 echo "1024-65535"
346}
347serverconfig_TelnetPort_Validate() {
348 local I=${INSTANCE:-!}
349 if [ $(checkTCPPortUsed "$1" "$I") -eq 0 ]; then
350 echo "1"
351 else
352 echo "0"
353 fi
354}
355serverconfig_TelnetPort_ErrorMessage() {
356 echo "Illegal port number or port already in use by another instance."
357}
358
359
360
361serverconfig_TelnetPassword_QueryName() {
362 echo "Telnet password"
363}
364serverconfig_TelnetPassword_Type() {
365 echo "string"
366}
367serverconfig_TelnetPassword_Validate() {
368 if [ -z $1 ]; then
369 echo "0"
370 else
371 echo "1"
372 fi
373}
374serverconfig_TelnetPassword_ErrorMessage() {
375 echo "Telnet must have a password set to function."
376}
377
378
379
380serverconfig_DisableNAT_QueryName() {
381 echo "Disable NAT"
382}
383serverconfig_DisableNAT_Type() {
384 echo "boolean"
385}
386serverconfig_DisableNAT_Default() {
387 echo "true"
388}
389serverconfig_DisableNAT_ErrorMessage() {
390 echo "Not a valid boolean given (true/false or yes/no or y/n)."
391}
392
393
394
395
396serverconfig_DropOnDeath_QueryName() {
397 echo "Drop on Death"
398}
399serverconfig_DropOnDeath_Type() {
400 echo "number"
401}
402serverconfig_DropOnDeath_Default() {
403 echo "0"
404}
405serverconfig_DropOnDeath_Range() {
406 echo "0-3"
407}
408serverconfig_DropOnDeath_Values() {
409 config_allowed_values=("Everything" "Toolbelt only" "Backpack only" "Delete all")
410}
411
412
413serverconfig_DropOnQuit_QueryName() {
414 echo "Drop on Quit"
415}
416serverconfig_DropOnQuit_Type() {
417 echo "number"
418}
419serverconfig_DropOnQuit_Default() {
420 echo "0"
421}
422serverconfig_DropOnQuit_Range() {
423 echo "0-3"
424}
425serverconfig_DropOnQuit_Values() {
426 config_allowed_values=("Nothing" "Everything" "Toolbelt only" "Backpack only")
427}
428
429
430
431
432serverconfig_CraftTimer_QueryName() {
433 echo "Craft speed"
434}
435serverconfig_CraftTimer_Type() {
436 echo "number"
437}
438serverconfig_CraftTimer_Default() {
439 echo "1"
440}
441serverconfig_CraftTimer_Range() {
442 echo "0-2"
443}
444serverconfig_CraftTimer_Values() {
445 config_allowed_values=("Instant" "Normal" "Double")
446}
447
448
449serverconfig_LootTimer_QueryName() {
450 echo "Loot open speed"
451}
452serverconfig_LootTimer_Type() {
453 echo "number"
454}
455serverconfig_LootTimer_Default() {
456 echo "1"
457}
458serverconfig_LootTimer_Range() {
459 echo "0-2"
460}
461serverconfig_LootTimer_Values() {
462 config_allowed_values=("Instant" "Normal" "Double")
463}
464
465
466
467
468serverconfig_PlayerDamageGiven_QueryName() {
469 echo "Damage Player->Zombies"
470}
471serverconfig_PlayerDamageGiven_Type() {
472 echo "number"
473}
474serverconfig_PlayerDamageGiven_Default() {
475 echo "2"
476}
477serverconfig_PlayerDamageGiven_Range() {
478 echo "0-4"
479}
480serverconfig_PlayerDamageGiven_Values() {
481 config_allowed_values=("50%" "75%" "100%" "150%" "200%")
482}
483
484
485serverconfig_PlayerDamageRecieved_QueryName() {
486 echo "Damage Zombies->Player"
487}
488serverconfig_PlayerDamageRecieved_Type() {
489 echo "number"
490}
491serverconfig_PlayerDamageRecieved_Default() {
492 echo "2"
493}
494serverconfig_PlayerDamageRecieved_Range() {
495 echo "0-4"
496}
497serverconfig_PlayerDamageRecieved_Values() {
498 config_allowed_values=("50%" "75%" "100%" "150%" "200%")
499}
500
501
502serverconfig_EnemySenseMemory_QueryName() {
503 echo "Sense memory (seconds)"
504}
505serverconfig_EnemySenseMemory_Type() {
506 echo "number"
507}
508serverconfig_EnemySenseMemory_Default() {
509 echo "60"
510}
511
512
513serverconfig_EnemySpawnMode_QueryName() {
514 echo "Spawn mode"
515}
516serverconfig_EnemySpawnMode_Type() {
517 echo "number"
518}
519serverconfig_EnemySpawnMode_Default() {
520 echo "3"
521}
522serverconfig_EnemySpawnMode_Range() {
523 echo "0-5"
524}
525serverconfig_EnemySpawnMode_Values() {
526 config_allowed_values=("Disabled" "50%" "75%" "100%" "125%" "150%")
527}
528
529
530serverconfig_EnemyDifficulty_QueryName() {
531 echo "Enemy difficulty"
532}
533serverconfig_EnemyDifficulty_Type() {
534 echo "number"
535}
536serverconfig_EnemyDifficulty_Default() {
537 echo "0"
538}
539serverconfig_EnemyDifficulty_Range() {
540 echo "0-1"
541}
542serverconfig_EnemyDifficulty_Values() {
543 config_allowed_values=("Normal" "Feral")
544}
545
546
547
548
549serverconfig_NightPercentage_QueryName() {
550 echo "Night percentage"
551}
552serverconfig_NightPercentage_Type() {
553 echo "number"
554}
555serverconfig_NightPercentage_Default() {
556 echo "35"
557}
558serverconfig_NightPercentage_Range() {
559 echo "10-90"
560}
561
562
563
564serverconfig_BlockDurabilityModifier_QueryName() {
565 echo "Block durability (%)"
566}
567serverconfig_BlockDurabilityModifier_Type() {
568 echo "number"
569}
570serverconfig_BlockDurabilityModifier_Default() {
571 echo "100"
572}
573
574
575
576
577serverconfig_LootAbundance_QueryName() {
578 echo "Loot abundance (%)"
579}
580serverconfig_LootAbundance_Type() {
581 echo "number"
582}
583serverconfig_LootAbundance_Default() {
584 echo "100"
585}
586
587
588serverconfig_LootRespawnDays_QueryName() {
589 echo "Loot respawn delay (days)"
590}
591serverconfig_LootRespawnDays_Type() {
592 echo "number"
593}
594serverconfig_LootRespawnDays_Default() {
595 echo "7"
596}
597
598
599
600
601serverconfig_LandClaimSize_QueryName() {
602 echo "Land claim size"
603}
604serverconfig_LandClaimSize_Type() {
605 echo "number"
606}
607serverconfig_LandClaimSize_Default() {
608 echo "7"
609}
610
611
612serverconfig_LandClaimDeadZone_QueryName() {
613 echo "Minimum keystone distance"
614}
615serverconfig_LandClaimDeadZone_Type() {
616 echo "number"
617}
618serverconfig_LandClaimDeadZone_Default() {
619 echo "30"
620}
621
622
623serverconfig_LandClaimExpiryTime_QueryName() {
624 echo "Claim expiry time (days)"
625}
626serverconfig_LandClaimExpiryTime_Type() {
627 echo "number"
628}
629serverconfig_LandClaimExpiryTime_Default() {
630 echo "3"
631}
632
633
634serverconfig_LandClaimDecayMode_QueryName() {
635 echo "Claim decay mode"
636}
637serverconfig_LandClaimDecayMode_Type() {
638 echo "number"
639}
640serverconfig_LandClaimDecayMode_Default() {
641 echo "0"
642}
643serverconfig_LandClaimDecayMode_Range() {
644 echo "0-2"
645}
646serverconfig_LandClaimDecayMode_Values() {
647 config_allowed_values=("Linear" "Exponential" "Full protection")
648}
649
650
651serverconfig_LandClaimOnlineDurabilityModifier_QueryName() {
652 echo "Claim durability modifier - online"
653}
654serverconfig_LandClaimOnlineDurabilityModifier_Type() {
655 echo "number"
656}
657serverconfig_LandClaimOnlineDurabilityModifier_Default() {
658 echo "4"
659}
660
661
662serverconfig_LandClaimOfflineDurabilityModifier_QueryName() {
663 echo "Claim durability modifier - offline"
664}
665serverconfig_LandClaimOfflineDurabilityModifier_Type() {
666 echo "number"
667}
668serverconfig_LandClaimOfflineDurabilityModifier_Default() {
669 echo "4"
670}
671
672
673
674
675serverconfig_AirDropFrequency_QueryName() {
676 echo "Airdrop delay (hours)"
677}
678serverconfig_AirDropFrequency_Type() {
679 echo "number"
680}
681serverconfig_AirDropFrequency_Default() {
682 echo "24"
683}
684
685
686
687
688#################################
689## Edit option functions
690
691configEditServer() {
692 local CV
693
694 echo "Server"
695 echo "--------------------------------"
696 for CV in \
697 ServerName ServerPassword ServerIsPublic ServerPort ServerMaxPlayerCount \
698 DisableNAT \
699 ; do
700 $1 $CV
701 done
702 echo
703}
704
705configEditRemoteControl() {
706 local CV
707
708 echo "Remote control"
709 echo "--------------------------------"
710 for CV in \
711 ControlPanelEnabled ControlPanelPort ControlPanelPassword \
712 TelnetPort TelnetPassword \
713 ; do
714 if [ "$CV" = "TelnetPort" ]; then
715 echo
716 echo "NOTE: Telnet will always be enabled for management purposes!"
717 echo "Make sure you block external access to this port!"
718 echo
719 fi
720 $1 $CV
721 done
722 echo
723}
724
725configEditGameType() {
726 local CV
727
728 echo "Game type"
729 echo "--------------------------------"
730 for CV in \
731 GameName GameWorld GameMode \
732 ; do
733 $1 $CV
734 done
735 echo
736}
737
738configEditGameTypeSpecific() {
739 local CV
740
741 echo "Options for specific game types"
742 echo "--------------------------------"
743 for CV in \
744 DayCount FragLimit MatchLength RebuildMap \
745 ; do
746 $1 $CV
747 done
748 echo
749}
750
751configEditGeneric() {
752 local CV
753
754 echo "Generic options"
755 echo "--------------------------------"
756 for CV in \
757 ShowAllPlayersOnMap FriendlyFire BuildCreate \
758 BlockDurabilityModifier \
759 ; do
760 $1 $CV
761 done
762 echo
763}
764
765configEditDropLoot() {
766 local CV
767
768 echo "Drop and Loot"
769 echo "--------------------------------"
770 for CV in \
771 DropOnDeath DropOnQuit \
772 LootAbundance LootRespawnDays AirDropFrequency \
773 ; do
774 $1 $CV
775 done
776 echo
777}
778
779configEditTimes() {
780 local CV
781
782 echo "Times / Durations"
783 echo "--------------------------------"
784 for CV in \
785 CraftTimer LootTimer \
786 DayNightLength NightPercentage \
787 ; do
788 $1 $CV
789 done
790 echo
791}
792
793configEditDifficulty() {
794 local CV
795
796 echo "Difficulty"
797 echo "--------------------------------"
798 for CV in \
799 GameDifficulty ZombiesRun \
800 PlayerDamageGiven PlayerDamageRecieved EnemySenseMemory EnemySpawnMode EnemyDifficulty \
801 ; do
802 $1 $CV
803 done
804 echo
805}
806
807configEditLandClaim() {
808 local CV
809
810 echo "Land claim options"
811 echo "--------------------------------"
812 for CV in \
813 LandClaimSize LandClaimDeadZone LandClaimExpiryTime LandClaimDecayMode \
814 LandClaimOnlineDurabilityModifier LandClaimOfflineDurabilityModifier \
815 ; do
816 $1 $CV
817 done
818 echo
819}
820
821configEditAll() {
822 configEditServer "$1"
823 configEditRemoteControl "$1"
824 configEditGameType "$1"
825 configEditGameTypeSpecific "$1"
826 configEditGeneric "$1"
827 configEditDropLoot "$1"
828 configEditTimes "$1"
829 configEditDifficulty "$1"
830 configEditLandClaim "$1"
831}
832
833
834
835
836
837#################################
838## Generic worker functions
839
840
841# List all defined config editing parts
842# Returns:
843# List of config funcs
844listConfigEditFuncs() {
845 local CV
846 for CV in $(declare -F | cut -d\ -f3 | grep "^configEdit.*$"); do
847 CV=${CV#configEdit}
848 printf "%s " "$CV"
849 done
850}
851
852
853# List all defined config options
854# Returns:
855# List of defined config options
856listConfigValues() {
857 local CV
858 for CV in $(declare -F | cut -d\ -f3 | grep "^serverconfig_.*_Type$"); do
859 CV=${CV#serverconfig_}
860 CV=${CV%_Type}
861 printf "%s " "$CV"
862 done
863}
864
865
866# Validate the given value for the given option
867# Params:
868# 1: Option name
869# 2: Value
870# Returns:
871# 0/1: invalid/valid
872isValidOptionValue() {
873 local TYPE=$(serverconfig_$1_Type)
874 local RANGE=""
875
876 if [ "$TYPE" = "enum" ]; then
877 TYPE="number"
878 serverconfig_$1_Values
879 RANGE=1-${#config_allowed_values[@]}
880 else
881 if [ "$(type -t serverconfig_$1_Range)" = "function" ]; then
882 RANGE=$(serverconfig_$1_Range)
883 fi
884 fi
885
886 case "$TYPE" in
887 number)
888 if [ $(isANumber "$2") -eq 0 ]; then
889 echo "0"
890 return
891 fi
892 if [ ! -z "$RANGE" ]; then
893 local MIN=$(cut -d- -f1 <<< "$RANGE")
894 local MAX=$(cut -d- -f2 <<< "$RANGE")
895 if [ $2 -lt $MIN -o $2 -gt $MAX ]; then
896 echo "0"
897 return
898 fi
899 fi
900 ;;
901 boolean)
902 if [ $(isABool "$2") -eq 0 ]; then
903 echo "0"
904 return
905 fi
906 ;;
907 string)
908 ;;
909 esac
910
911
912 if [ "$(type -t serverconfig_$1_Validate)" = "function" ]; then
913 if [ $(serverconfig_$1_Validate "$2") -eq 0 ]; then
914 echo "0"
915 return
916 fi
917 fi
918
919 echo "1"
920}
921
922# Query for the value of a single config option
923# Will be stored in $configCurrent_$1
924# Params:
925# 1: Option name
926configQueryValue() {
927 local TYPE=$(serverconfig_$1_Type)
928 local NAME=""
929 local RANGE=""
930 local DEFAULT=""
931 local currentValName=configCurrent_$1
932
933 if [ "$(type -t serverconfig_$1_Values)" = "function" ]; then
934 echo "$(serverconfig_$1_QueryName), options:"
935 serverconfig_$1_Values
936 NAME="Select option"
937 if [ "$TYPE" = "enum" ]; then
938 local OPTOFFSET=1
939 else
940 local OPTOFFSET=0
941 fi
942 for (( i=$OPTOFFSET; i < ${#config_allowed_values[@]}+$OPTOFFSET; i++ )); do
943 printf " %2d: %s\n" $i "${config_allowed_values[$i-$OPTOFFSET]}"
944 done
945 else
946 NAME=$(serverconfig_$1_QueryName)
947 fi
948
949 if [ "$TYPE" = "enum" ]; then
950 RANGE=1-${#config_allowed_values[@]}
951 if [ ! -z "${!currentValName}" ]; then
952 for (( i=1; i < ${#config_allowed_values[@]}+1; i++ )); do
953 if [ "${!currentValName}" = "${config_allowed_values[$i-1]}" ]; then
954 DEFAULT=$i
955 fi
956 done
957 export $currentValName=
958 fi
959 else
960 if [ "$(type -t serverconfig_$1_Range)" = "function" ]; then
961 RANGE=$(serverconfig_$1_Range)
962 fi
963 fi
964
965 if [ -z "$DEFAULT" ]; then
966 if [ ! -z "${!currentValName}" ]; then
967 DEFAULT=${!currentValName}
968 else
969 if [ "$(type -t serverconfig_$1_Default)" = "function" ]; then
970 DEFAULT=$(serverconfig_$1_Default)
971 fi
972 fi
973 fi
974
975 local prompt=$(printf "%s" "$NAME")
976 if [ ! -z "$RANGE" ]; then
977 prompt=$(printf "%s (%s)" "$prompt" "$RANGE")
978 fi
979 if [ ! -z "$DEFAULT" ]; then
980 prompt=$(printf "%s [%s]" "$prompt" "$DEFAULT")
981 fi
982 prompt=$(printf "%s:" "$prompt")
983 prompt=$(printf "%-*s " 40 "$prompt")
984
985 while : ; do
986 read -p "$prompt" $currentValName
987 export $currentValName="${!currentValName:-$DEFAULT}"
988 if [ $(isValidOptionValue "$1" "${!currentValName}") -eq 0 ]; then
989 if [ "$(type -t serverconfig_$1_ErrorMessage)" = "function" ]; then
990 serverconfig_$1_ErrorMessage "${!currentValName}"
991 fi
992 fi
993 [ $(isValidOptionValue "$1" "${!currentValName}") -eq 1 ] && break
994 done
995
996 if [ "$TYPE" = "enum" ]; then
997 export $currentValName="${config_allowed_values[$currentValName-1]}"
998 fi
999 echo
1000}
1001
1002# Set parameters for current instance that have forced values:
1003# - TelnetEnabled must be set so that management scripts can work
1004# - AdminFileName is made to point to the local instance admins.xml
1005# - SaveGameFolder is made to point to the instance folder
1006# Params:
1007# 1: Instance name
1008configSetAutoParameters() {
1009 configCurrent_TelnetEnabled=true
1010 configCurrent_AdminFileName=admins.xml
1011 configCurrent_SaveGameFolder="$(winepath -w $(getInstancePath "$1") 2>/dev/null | grep instances)"
1012}
1013
1014
1015# Print defined config value
1016# Params:
1017# 1: Config option
1018printConfigValue() {
1019 local currentValName=configCurrent_$1
1020 printf "%-25s = %s\n" "$(serverconfig_$1_QueryName)" "${!currentValName}"
1021}
1022
1023# Query for an instance name (will be saved in $INSTANCE)
1024readInstanceName() {
1025 until [ $(isValidInstanceName "$INSTANCE") -eq 1 ]; do
1026 read -p "Instance name: " INSTANCE
1027 if [ $(isValidInstanceName "$INSTANCE") -eq 0 ]; then
1028 echo "Invalid instance name, may only contain:"
1029 echo " - letters (A-Z / a-z)"
1030 echo " - digits (0-9)"
1031 echo " - underscores (_)"
1032 echo " - hyphens (-)"
1033 fi
1034 done
1035}
1036
1037# Undefine the current config values
1038unsetAllConfigValues() {
1039 local CV
1040 for CV in $(listConfigValues); do
1041 local currentValName=configCurrent_$CV
1042 export $currentValName=
1043 done
1044}
1045
1046# Load all config values from the config.xml of the given instance
1047# Params:
1048# 1: Instance name
1049loadCurrentConfigValues() {
1050 local CV
1051 for CV in $(listConfigValues); do
1052 local currentValName=configCurrent_$CV
1053 local cfile=$(getInstancePath "$1")/config.xml
1054 local XPATH="/ServerSettings/property[@name='$CV']/@value"
1055 local VAL=$($XMLSTARLET sel -t -v "$XPATH" $cfile)
1056 if [ ! -z "$VAL" ]; then
1057 export $currentValName="$VAL"
1058 fi
1059 done
1060}
1061
1062# Save all config values to the config.xml of the given instance
1063# Params:
1064# 1: Instance name
1065saveCurrentConfigValues() {
1066 local CV
1067 for CV in $(listConfigValues) TelnetEnabled AdminFileName SaveGameFolder; do
1068 local currentValName=configCurrent_$CV
1069 local val="${!currentValName}"
1070 local cfile=$(getInstancePath "$1")/config.xml
1071
1072 XPATHBASE="/ServerSettings/property[@name='$CV']"
1073
1074 if [ -z $($XMLSTARLET sel -t -v "$XPATHBASE/@name" $cfile) ]; then
1075 $XMLSTARLET ed -L \
1076 -s "/ServerSettings" -t elem -n "property" -v "" \
1077 -i "/ServerSettings/property[not(@name)]" -t attr -n "name" -v "$CV" \
1078 -i "$XPATHBASE" -t attr -n "value" -v "$val" \
1079 $cfile
1080 else
1081 $XMLSTARLET ed -L \
1082 -u "$XPATHBASE/@value" -v "$val" \
1083 $cfile
1084 fi
1085 done
1086}
1087
1088# Check if the config template exists
1089# Returns:
1090# 0/1: no/yes
1091configTemplateExists() {
1092 if [ -f $SDTD_BASE/templates/config.xml ]; then
1093 echo 1
1094 else
1095 echo 0
1096 fi
1097}
1098
1099# Get a single value from a serverconfig
1100# Params:
1101# 1: Instance name
1102# 2: Property name
1103# Returns:
1104# Property value
1105getConfigValue() {
1106 local CONF=$(getInstancePath $1)/config.xml
1107 $XMLSTARLET sel -t -v "/ServerSettings/property[@name='$2']/@value" $CONF
1108}
1109
1110# Update a single value in a serverconfig
1111# Params:
1112# 1: Instance name
1113# 2: Property name
1114# 3: New value
1115setConfigValue() {
1116 local CONF=$(getInstancePath $1)/config.xml
1117 $XMLSTARLET ed -L -u "/ServerSettings/property[@name='$2']/@value" -v "$3" $CONF
1118}
1119
Note: See TracBrowser for help on using the repository browser.