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

Last change on this file since 295 was 295, checked in by alloc, 6 years ago

Fixes 104

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