#!/usr/bin/env bash

set -euo pipefail

export PATH=$PATH:$(dirname $(dirname "$0"))/bin
DEBUG=yes

BASEDIR=$(dirname $(dirname $(realpath "$0")))
. $BASEDIR/libexec/os-helpers || exit 1

# Numbered list with a default, accepting a direct value too
picklist() {
	# picklist VARNAME "prompt" [item1 item2 ...]
	# Presents a numbered list; sets VARNAME to the chosen item.
	# If no items given as arguments, reads them one per line from stdin.
	# Default is the current value of VARNAME if it matches a list item,
	# otherwise item 1. Accepts a number or a direct value.
	local _pl_var=$1 _pl_prompt="${2:-Choice}"
	shift 2
	local -a _pl_items=()
	if [ $# -gt 0 ]; then
		_pl_items=("$@")
	else
		while IFS= read -r _pl_line; do
			[ -n "$_pl_line" ] && _pl_items+=("$_pl_line")
		done
	fi
	[ "${#_pl_items[@]}" -eq 0 ] && return 1
	local _pl_current="${!_pl_var}" _pl_default=1 _pl_i=0
	for _pl_item in "${_pl_items[@]}"; do
		_pl_i=$((_pl_i + 1))
		printf "  %2d) %s\n" "$_pl_i" "$_pl_item" >&2
		[ "$_pl_current" = "$_pl_item" ] && _pl_default=$_pl_i
	done
	local _pl_choice
	read -u1 -p "  $_pl_prompt [$_pl_default] " _pl_choice
	_pl_choice=${_pl_choice:-$_pl_default}
	if echo "$_pl_choice" | grep -qE '^[0-9]+$' &&
		[ "$_pl_choice" -ge 1 ] && [ "$_pl_choice" -le "${#_pl_items[@]}" ]; then
		printf -v "$_pl_var" '%s' "${_pl_items[$((_pl_choice - 1))]}"
	else
		printf -v "$_pl_var" '%s' "$_pl_choice"
	fi
	printf "  Picked: %s\n" "${!_pl_var}" >&2
}

[ "${VERBOSE:-}" = "yes" -o "${DEBUG:-}" = "yes" ] && verbose="-v" || verbose=

crudget $TMP.conf Install 2>/dev/null
crudget $TMP.conf Defaults 2>/dev/null

debug "Config loaded
	OpenSim version:   ${OpensimVersion:-}
	Layout:            ${DirectoryLayout:-}
	Install base:      ${InstallPath:-}
	Core Directory:    ${CoreDirectory:-}
	Etc Directory:     ${EtcRoot:-}
	Var Directory:     ${VarRoot:-}
	Data Directory:    ${DataRoot:-}
	Cache Directory:   ${CacheRoot:-}
	Logs Directory:    ${LogsRoot:-}
	Sources:           ${SourcesDirectory:-}"

gridname="${@:-}"
owner_name=$(
	getent passwd $USER 2>/dev/null ||
		id -F ||
		whoami ||
		echo ${USER:-}
)
gridname="${gridname:-}" # additional quote to fix IDE formatter
[ -z "$gridname" ] && gridname="$owner_name's grid"
readvar gridname && [ -n "${gridname}" ] || end $? "gridname cannot be empty"

gridnick=$(titlecase "$gridname" | sed "s/[^[:alnum:]]//g")
readvar gridnick && [ "${gridnick}" != "" ] || end $? "gridnick cannot be empty"

gridslug=$(/opt/magic/bin/webnormalize -D "$gridname")
debug gridslug: $gridslug

GridDir=$EtcRoot/grids/${gridnick}
readvar GridDir && [ "${GridDir}" != "" ] || end $? "GridDir cannot be empty"
[ -d "$GridDir" ] || mkdir "$GridDir" || end $?

if yesno -y "Enable Hypergrid?"; then
	EnableHypergrid=yes
	RobustDefaults=$CoreDirectory/bin/Robust.HG.ini.example
	RobustOutput=$GridDir/Robust.HG.ini
else
	EnableHypergrid=
	RobustDefaults=$CoreDirectory/bin/Robust.ini.example
	RobustOutput=$GridDir/Robust.ini
fi

debug EnableHypergrid ${EnableHypergrid:-no}

readvar RobustOutput && [ "${RobustOutput}" != "" ] || end $? "RobustOutput cannot be empty"

crudget $RobustDefaults Launch
crudget $RobustDefaults Const
crudget $RobustDefaults Startup

## Cleanup and read Robust if it exists
if [ -f "$RobustOutput" ]; then
	cp $RobustOutput ${RobustOutput}~
	cleanupIni $RobustOutput >$TMP.clean.ini && mv $TMP.clean.ini $RobustOutput
	debug "Grid config file exists, updating"
	update=yes
	crudget $RobustOutput Launch
	crudget $RobustOutput Const
	crudget $RobustOutput Startup
	# [ "$PublicPort" ] || PublicPort=$(crudini  --get $RobustOutput Const PublicPort)
	# [ "$PrivatePort" ] || PrivatePort=$(crudini  --get $RobustOutput Const PrivatePort)
	# cat $TMP.get
	debug PublicPort $PublicPort
	# crudget $RobustOutput Startup
else
	debug "No pre-existing Robust config, no worry"
fi
savedPublicPort=${PublicPort:-}
savedPrivatePort=${PrivatePort:-}

if [ -z "${BinDir:-}" ]; then
	debug "No BinDir, no big deal"
	if [ -z "${CoreRoot:-}" ]; then
		for folder in /usr/local/share/opensim /opt/opensim/core $BASEDIR/core; do
			[ -d "$folder" ] && CoreRoot=$folder && break
		done
	fi
	echo "Available OpenSim core installations:"
	ls "${CoreRoot:-$BASEDIR/core}"/opensim-[0-9]*/bin/OpenSim.exe 2>/dev/null |
		sort | sed "s:/bin/OpenSim.exe::" >$TMP.cores
	CoreDirectory=${CoreDirectory:-$(tail -1 $TMP.cores)}
	picklist CoreDirectory "Core directory" <$TMP.cores
	[ -d "$CoreDirectory/bin" ] || end 1 "Invalid core directory: $CoreDirectory"
	BinDir=$CoreDirectory/bin
	debug BinDir $BinDir
fi

case ${BaseHostname:-} in
localhost | 127.0.0.1 | "") BaseHostname=$(hostname -f) ;;
esac
readvar BaseHostname && [ "${BaseHostname}" != "" ] || end $? "BaseHostname cannot be empty"

PublicPort=${PublicPort:-$("$BASEDIR/bin/opensim" next port 8002)}
readvar PublicPort && [ "${PublicPort}" != "" ] || end $? "PublicPort cannot be empty"

if [ "${update:-}" != "yes" -o "$PublicPort" != "$savedPublicPort" ]; then
	PublicPort=$("$BASEDIR/bin/opensim" next port $PublicPort)
fi

debug "PublicPort: $PublicPort"

PrivatePort=${PrivatePort:-$("$BASEDIR/bin/opensim" next port $(($PublicPort + 1)))}
readvar PrivatePort && [ "${PrivatePort}" != "" ] || end $? "PrivatePort cannot be empty"
if [ "${update:-}" != "yes" -o "$PublicPort" != "$savedPublicPort" ]; then
	PrivatePort=$("$BASEDIR/bin/opensim" next port $PrivatePort)
fi

WebURL="https://$BaseHostname"
readvar WebURL && [ "${WebURL}" != "" ] || end $? "WebURL cannot be empty"

Executable="Robust.exe"
LogConfig="${DataRoot}/$gridnick/Robust.exe.config"
LogFile="$LogsRoot/$gridnick.log"

debug LogConfig=$LogConfig
debug LogFile=$LogFile
crudget $RobustDefaults DatabaseService || true
crudget $RobustOutput DatabaseService || true

echo "$ConnectionString" | tr ";" "\n" | sed -r "s/ (.*)=/\\1=/g" | grep [a-z].*= >$TMP.db
cat $TMP.db
. $TMP.db || end $?

db_host=${DataSource:-localhost}
db_name=$(echo ${gridnick}_robust | tr [:upper:] [:lower:])
db_user=${UserID:-opensim}
# db_pass=$(echo "${Password:-}" | sed -E "s/^\*+$//")
db_pass="${Password:-changeme}"

readvar db_host && [ "${db_host}" != "" ] || end $? "db_host cannot be empty"
readvar db_name && [ "${db_name}" != "" ] || end $? "db_name cannot be empty"
readvar db_user && [ "${db_user}" != "" ] || end $? "db_user cannot be empty"
readvar db_pass && [ "${db_pass}" != "" ] || end $? "db_pass cannot be empty"

testDatabaseConnection $db_host $db_name $db_user "$db_pass" ||
	log $? "Setup database $db_name with given credentials before trying to launch server"

printf "\n$PGM: Building config\n\n" >&2

cat <<EOF >$TMP.launch.ini
;; Generated by $0 $(date)
[Launch]
	;; Parameters used by opensim-debian scripts.
	;; You can safely delete Launch section if you use another launching process
	BinDir = "$BinDir"
	Executable = "Robust.exe"
	LogConfig = "$LogConfig"
	LogFile = "$LogFile"
	ConsolePrompt = "$gridname ($BaseHostname:$PublicPort)"
	;; End of Launch section

EOF

EtcDirectory="$EtcRoot/grids/$gridnick"
DataDirectory="${DataRoot}/$gridnick"
CacheDirectory="${CacheRoot}/$gridnick"
LogsDirectory="$LogsRoot"
economyURL="\${Const|WebURL}/helpers"

cat <<EOF >$TMP.thisgrid.ini || end $? "could not create $TMP.thisgrid.ini"
[Const]
	BaseHostname = "$BaseHostname"
	BaseURL = "http://$BaseHostname"
	WebURL = "$WebURL"
	PublicPort = $PublicPort
	PrivatePort = $PrivatePort
	BinDirectory = "$BinDir"
	EtcDirectory = "$EtcDirectory"
	DataDirectory = "$DataDirectory"
	CacheDirectory = "$CacheDirectory"
	LogsDirectory = "$LogsDirectory"
[Startup]
	PIDFile = "\${Const|CacheDirectory}/$gridnick.pid"
	RegistryLocation = "\${Const|DataDirectory}/registry"
	ConfigDirectory = "\${Const|EtcDirectory}/robust-include"
	ConsoleHistoryFile = "\${Const|LogsDirectory}/$gridnick.RobustConsoleHistory.txt"
[Hypergrid]
	HomeURI = "\${Const|BaseURL}:\${Const|PublicPort}"
	GatekeeperURI = "\${Const|BaseURL}:\${Const|PublicPort}"
[DatabaseService]
	ConnectionString = "Data Source=$db_host;Database=$db_name;User ID=$db_user;Password=$db_pass;Old Guids=true;"
[AssetService]
	BaseDirectory = "\${Const|DataDirectory}/fsassets/data"
	SpoolDirectory = "\${Const|CacheDirectory}/fsassets/tmp"
	AssetLoaderArgs = "\${Const|EtcDirectory}/assets/AssetSets.xml"
[GridService]
	Region_Welcome = "DefaultRegion, DefaultHGRegion, FallbackRegion, Persistent"
	MapTileDirectory = "\${Const|CacheDirectory}/maptiles"
[LibraryService]
	LibraryName = "${gridname} Library"
	DefaultLibrary = "\${Const|EtcDirectory}/inventory/Libraries.xml"
[LoginService]
	DestinationGuide = "\${Const|WebURL}/guide"
[MapImageService]
	TilesStoragePath = "\${Const|DataDirectory}/maptiles"
[GridInfoService]
	gridname = "${gridname}"
	gridnick = "${gridnick}"
	welcome = "\${Const|WebURL}"
	;welcome = "\${Const|WebURL}/splash"
	;about = "\${Const|WebURL}/about"
	;register = "\${Const|WebURL}/register"
	;help = "\${Const|WebURL}/support"
	;password = "\${Const|WebURL}/password"
	;economy = "$economyURL"
	;search = "\${Const|WebURL}/helpers/query.php"
	;message = "\${Const|WebURL}/helpers/offline.php"
	;GridStatus = "\${Const|WebURL}/GridStatus"
	;GridStatusRSS = "\${Const|WebURL}/GridStatusRSS"
[BakedTextureService]
	BaseDirectory = "\${Const|CacheDirectory}/bakes"
EOF

cp $BinDir/Robust.ini.example $TMP.Robust.ini &&
	sed -i~ "s/^[[:blank:]]*//" $TMP.thisgrid.ini $TMP.Robust.ini &&
	crudmerge $TMP.Robust.ini $TMP.thisgrid.ini &&
	cat $TMP.launch.ini $TMP.Robust.ini >$TMP.ini ||
	end $? "Unexpected: error processing Robust.ini"

cleanupIni $TMP.ini >$TMP.Robust.ini
uncomment UserProfilesServiceConnector $TMP.Robust.ini
crudini --set $TMP.Robust.ini UserProfilesService Enabled true

if [ -f "$RobustOutput" ]; then
	diff "$RobustOutput" $TMP.Robust.ini &&
		echo "No change in $RobustOutput" && exit

	if yesno -y "Apply changes?"; then
		mv $RobustOutput $RobustOutput~ &&
			cp $TMP.Robust.ini $RobustOutput &&
			echo "$RobustOutput modified" ||
			end $? "apply changes failed"
	else
		echo "$RobustOutput left unchanged"
	fi
else
	cp $TMP.Robust.ini $RobustOutput &&
		echo "$RobustOutput file created" ||
		end $? "create file $RobustOutput failed"
fi

debug Create grid directory structure
for directory in \
	$DataRoot \
	$CacheRoot \
	$LogsDirectory \
	$DataDirectory \
	$DataDirectory/fsassets \
	$DataDirectory/fsassets/data \
	$DataDirectory/maptiles \
	$DataDirectory/registry \
	$CacheDirectory \
	$CacheDirectory/bakes \
	$CacheDirectory/fsassets \
	$CacheDirectory/fsassets/tmp \
	$CacheDirectory/maptiles \
	$EtcDirectory \
	$EtcDirectory/assets \
	$EtcDirectory/config-include \
	$EtcDirectory/sims \
	$EtcDirectory/inventory \
	$EtcDirectory/robust-include; do
	install $verbose -d "$directory" || end $? "Could not create $directory"
done

debug Create or update grid config files
for file in \
	OpenSimDefaults.ini \
	OpenSim.ini \
	config-include/GridHypergrid.ini \
	config-include/GridCommon.ini \
	config-include/FlotsamCache.ini \
	config-include/osslDefaultEnable.ini \
	config-include/osslEnable.ini; do # config-include/StandaloneCommon.ini \
	[ -f "$EtcDirectory/$file" ] && continue
	[ -f "$BinDir/${file}.example" ] &&
		original=$BinDir/${file}.example ||
		original=$BinDir/${file}
	if echo "$file" | grep -q "\.ini$"; then
		cleanupIni $original >$EtcDirectory/$file && continue || end $? "error copying up $original"
	else
		cp $original $EtcDirectory/$file && continue || end $?
	fi
done

# Those two merges might not be necessary in the new approach (try to stick to OpenSim.ini first approach)
#crudmerge $EtcDirectory/OpenSim.ini $EtcDirectory/config-include/GridHypergrid.ini || end $? "error merging $_"
#crudmerge $EtcDirectory/OpenSim.ini $EtcDirectory/config-include/GridCommon.ini || end $? "error merging $_"

# Share common grid-level libraries in users inventory
for folder in assets inventory; do
	[ ! -d "$EtcDirectory/$folder" ] || yesno -y "Update $folder folder from distro (keep local changes)?" || continue
	rsync -Waz --delete $BinDir/$folder/ $EtcDirectory/tmp.$$.$folder/ || end $?
	[ -d "$EtcDirectory/$folder/" ] && rsync -Waz $EtcDirectory/$folder/ $EtcDirectory/tmp.$$.$folder/
	rsync -Waz --delete $EtcDirectory/tmp.$$.$folder/ $EtcDirectory/$folder/ || end $?
	rm -rf $EtcDirectory/tmp.$$.$folder/
done

debug "Robust server should be able to start at this stage"
end DEBUG STOP $LINENO

## Following are tweaks that might or might not be necessary with 0.9.3 and/or 0.9.2
# Some of the code below has already been included in the active code above.
# This will require line by line verification

# uncomment ConsolePrompt $EtcDirectory/OpenSim.ini
# uncomment regionload_regionsdir $EtcDirectory/OpenSim.ini
# # uncomment regionload_webserver_url $EtcDirectory/OpenSim.ini
# uncomment RegistryLocation $EtcDirectory/OpenSim.ini
# uncomment ConsoleHistoryFile $EtcDirectory/OpenSim.ini
# uncomment crash_dir $EtcDirectory/OpenSim.ini
# uncomment PIDFile $EtcDirectory/OpenSim.ini
# # uncomment emailmodule $EtcDirectory/OpenSim.ini
# uncomment MapImageModule $EtcDirectory/OpenSim.ini
# uncomment DefaultEstateName $EtcDirectory/OpenSim.ini
# uncomment DisableFacelights $EtcDirectory/OpenSim.ini

cat <<EOF | sed -e "s/^[[:blank:]]*//" >$TMP.OpenSim.tweaks
[Const]
  BinDirectory = "$BinDir"
  gridname = "$gridname"
  BaseHostname = "$BaseHostname"
  PublicPort = $PublicPort
  PrivatePort = $PrivatePort
  CacheDirectory = "$CacheDirectory/\${Launch|simslug}"
  DataDirectory = "$DataDirectory/\${Launch|simslug}"
  EtcDirectory = "$EtcDirectory"
  LogsDirectory = "$LogsDirectory"

[Startup]
  ConsolePromp = "\${Launch|SimName}@\${Const|gridname} (\R) "
  ConfigDirectory = "\${Const|EtcDirectory}/config-include"
  regionload_regionsdir = "\${Const|EtcDirectory}/sims/\${Launch|simslug}/regions"
  registryLocation = "\${Const|DataDirectory}/registry"
  ConsoleHistoryFile = "\${Const|LogsDirectory}/\${Launch|simslug}.OpenSimConsoleHistory.txt"
  crash_dir = "/opt/opensim/var/run/crashes"
  PIDFile = "/opt/opensim/var/run/\${Const|gridname}.\${Launch|simslug}.pid"
  MapImageModule = "Warp3DImageModule"

[Map]
  MapImageModule = "Warp3DImageModule"

[Permissions]
  simple_build_permissions = true

[Estates]
  DefaultEstateName = "$gridname Estate"

[SMTP]
  enabled = true
  host_domain_header_from = "$BaseHostname"
  SMTP_SERVER_HOSTNAME = "mail.$BaseHostname"
  SMTP_SERVER_PORT = 587
  SMTP_SERVER_LOGIN = "facteur@$BaseHostname"
  SMTP_SERVER_PASSWORD = "password"

[Network]
  ; ConsoleUser = "Test"
  ; ConsolePass = "secret"
  ; console_port = 0

[XMLRPC]
  ;XmlRpcRouterModule = "XmlRpcRouterModule"
  ;XmlRpcPort = 20800

[ClientStack.LindenUDP]
  DisableFacelights = true

[Messaging]
  OfflineMessageModule = "Offline Message Module V2"
  ; OfflineMessageURL = "\${Const|BaseURL}/Offline.php"
  OfflineMessageURL = "\${Const|PrivURL}:\${Const|PrivatePort}""
  StorageProvider = OpenSim.Data.MySQL.dll
  MuteListModule = MuteListModule

[RemoteAdmin]
  ; enabled = false
  ; port = 0
  ; access_password = ""
  ; enabled_methods = all

[DataSnapshot]
  index_sims = true
  ; data_exposure = minimum
  gridname = "$gridname"
  ; default_snapshot_period = 1200
  snapshot_cache_directory = "\$Const|DataDirectory/\${Launch|simslug}/DataSnapshot"
  ;; New way of specifying data services, one per service
  ;DATA_SRV_MISearch = "http://metaverseink.com/cgi-bin/register.py"
  ;DATA_SRV_MISearch = "\${Const|WebURL}/helpers/register"

[Economy]
  ; economymodule = BetaGridLikeMoneyModule
  ; economy = "$economyURL"
  ; PriceUpload = 0
  ; PriceGroupCreate = 0

[OSSL]
  Include-osslDefaultEnable = "$EtcDirectory/config-include/osslDefaultEnable.ini"

[Groups]
  Enabled = true
  Module = "Groups Module V2"
  ServicesConnectorModule = "Groups HG Service Connector"
  LocalService = remote
  GroupsServerURI = "\${Const|PrivURL}:\${Const|PrivatePort}"
  MessagingModule = "Groups Messaging Module V2"
  MessageOnlineUsersOnly = true
  NoticesEnabled = true

[NPC]
  AllowSenseAsAvatar = true

[Terrain]
  ; InitialTerrain = "pinhead-island"

[UserProfiles]
  ProfileServiceURL = "\${Const|BaseURL}:\${Const|PublicPort}"
  AllowUserProfileWebURLs = true

EOF

# sed -i~ "s/^[[:blank:]]*Include-Architecture/; Include-Architecture/" $EtcDirectory/OpenSim.ini
# sed -i~ "s/^;[[:blank:]]*\(Include-Architecture.*GridHypergrid\)/\\1/" $EtcDirectory/OpenSim.ini
# sed -i~ "s/\(\[Architecture\]\):; \\1:" $EtcDirectory/OpenSim.ini
# sed -i~ "s/^[^;]*\(\[Include\]\):; \\1:" $EtcDirectory/OpenSim.ini

# for var in $(grep "^[^;]*=" $TMP.OpenSim.tweaks | cut -d = -f 1)
# do
#   [ "$var" = "Enabled" ] && continue
#   [ "$var" = "enabled" ] && continue
#   [ "$var" = "Include-Architecture" ] && continue
#   uncomment $var $EtcDirectory/OpenSim.ini
# done

crudmerge $EtcDirectory/OpenSim.ini $TMP.OpenSim.tweaks

crudini --set $EtcDirectory/config-include/FlotsamCache.ini AssetCache CacheDirectory "\${Const|CacheDirectory}/assetcache"

sed -i~ "s/^[[:blank:]]*\(Include-Storage\)/; \\1/" $EtcDirectory/config-include/GridCommon.ini
sed -i~ "s/^;[[:blank:]]*\(StorageProvider.*MySQL\)/\\1/" $EtcDirectory/config-include/GridCommon.ini
crudini --set $EtcDirectory/config-include/GridCommon.ini DatabaseService StorageProvider "OpenSim.Data.MySQL.dll"
# sed -i~ "s/^;[[:blank:]]*\(ConnectionString.*Data Source=localhost;\)/\\1/" $EtcDirectory/config-include/GridCommon.ini
# crudini --set $EtcDirectory/config-include/GridCommon.ini DatabaseService ConnectionString "\"Data Source=$db_host;Database=${gridslug}_\${Launch|SimName};User ID=$db_user;Password=$db_pass;Old Guids=true;\""
sed -i~ "s/^;[[:blank:]]*\(EstateConnectionString\)/\\1/" $EtcDirectory/config-include/GridCommon.ini
crudini --set $EtcDirectory/config-include/GridCommon.ini DatabaseService EstateConnectionString "\"Data Source=$db_host;Database=$db_name;User ID=$db_user;Password=$db_pass;Old Guids=true;\""
uncomment GatekeeperURI $EtcDirectory/config-include/GridCommon.ini
crudini --set $EtcDirectory/config-include/GridCommon.ini DatabaseService EstateConnectionString "\"Data Source=$db_host;Database=$db_name;User ID=$db_user;Password=$db_pass;Old Guids=true;\""

crudini --set $EtcDirectory/config-include/GridCommon.ini Modules Include-FlotsamCache '"${Const|EtcDirectory}/config-include/FlotsamCache.ini"'
crudini --set $EtcDirectory/config-include/GridCommon.ini AssetService AssetLoaderArgs '"${Const|EtcDirectory}/assets/AssetSets.xml"'
crudini --set $EtcDirectory/config-include/GridHypergrid.ini Includes Include-Common '"${Const|EtcDirectory}/config-include/GridCommon.ini"'

crudini --set $EtcDirectory/config-include/osslDefaultEnable.ini OSSL Include-osslEnable "\"$EtcDirectory/config-include/osslEnable.ini\""

uncomment AllowOSFunctions $EtcDirectory/config-include/osslEnable.ini
crudini --set $EtcDirectory/config-include/osslEnable.ini OSSL AllowOSFunctions true
uncomment PermissionErrorToOwner $EtcDirectory/config-include/osslEnable.ini
crudini --set $EtcDirectory/config-include/osslEnable.ini OSSL PermissionErrorToOwner true
crudini --set $EtcDirectory/config-include/osslEnable.ini OSSL osslParcelO '"PARCEL_OWNER,"'
crudini --set $EtcDirectory/config-include/osslEnable.ini OSSL osslParcelOG '"PARCEL_GROUP_MEMBER,PARCEL_OWNER,"'

crudini --del $EtcDirectory/OpenSim.ini Architecture
crudini --set $EtcDirectory/OpenSim.ini Architecture Include-Architecture "\${Const|EtcDirectory}/config-include/GridHypergrid.ini"

crudmerge $EtcDirectory/OpenSim.ini $EtcDirectory/config-include/GridHypergrid.ini
crudmerge $EtcDirectory/OpenSim.ini $EtcDirectory/config-include/GridCommon.ini

sed -i~ "s/^[[:blank:]]*\(Include-Storage\)/; \\1/" $EtcDirectory/OpenSim.ini

startupIni="$EtcDirectory/robust.d/$gridnick.ini"
[ -e "$startupIni" ] || ln -frs "$RobustOutput" "$startupIni" && ls "$startupIni" || end $?

rm -f $TMP.ini

if yesno -y "(re)start $gridname?"; then
	opensim restart $gridnick
	end $?
fi

end
