From 4d662bbedfea26b2151761dfcb75adb620ee5334 Mon Sep 17 00:00:00 2001 From: Manfred Aabye Date: Fri, 1 May 2026 08:10:07 +0200 Subject: [PATCH] 010520260809 --- modular/osmtool_core.sh | 3 + modular/osmtool_estate.sh | 297 +++++++++++++++++++++++++++++++++++++ modular/osmtool_install.sh | 6 + 3 files changed, 306 insertions(+) create mode 100644 modular/osmtool_estate.sh diff --git a/modular/osmtool_core.sh b/modular/osmtool_core.sh index 9252cf8..0596994 100644 --- a/modular/osmtool_core.sh +++ b/modular/osmtool_core.sh @@ -290,6 +290,9 @@ profile_action_allowed() { smoke:grid-sim|smoke:robust|smoke:standalone) case "$action" in run) return 0 ;; esac ;; + estate:grid-sim) + case "$action" in createmasteruser|createmasterestate|createmasterestateall|firststart) return 0 ;; esac + ;; esac return 1 diff --git a/modular/osmtool_estate.sh b/modular/osmtool_estate.sh new file mode 100644 index 0000000..4f4eab2 --- /dev/null +++ b/modular/osmtool_estate.sh @@ -0,0 +1,297 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=/dev/null +source "$SCRIPT_DIR/osmtool_core.sh" + +msgf() { + local key="$1" + shift + # shellcheck disable=SC2059 + printf "$(msg "$key")" "$@" +} + +usage() { + cat <<'EOF' +Usage: + osmtool_estate.sh [--workdir ] [--profile ] --action + [--estate-wait ] + +Actions: + createmasteruser Start robustserver if needed and create master user in robust console + createmasterestate Start sim1 and create master estate, then process remaining simulators + createmasterestateall Start sim2..sim999 and process estate prompts per region + firststart Run createmasteruser then createmasterestate +EOF + print_usage_common +} + +screen_session_exists() { + local screen_name="$1" + screen -list 2>/dev/null | grep -qE "\\.${screen_name}[[:space:]]" +} + +screen_start_dotnet() { + local screen_name="$1" + local bin_dir="$2" + local dll_name="$3" + + if screen_session_exists "$screen_name"; then + log INFO "Screen session already running: $screen_name" + return 0 + fi + + (cd "$bin_dir" && screen -fa -S "$screen_name" -d -U -m dotnet "$dll_name") + sleep 1 + + if ! screen_session_exists "$screen_name"; then + die "Failed to start screen session: $screen_name" + fi +} + +stuff_enter() { + local screen_name="$1" + local value="$2" + screen -S "$screen_name" -p 0 -X eval "stuff '${value}'^M" +} + +ini_get() { + local ini_file="$1" + local section="$2" + local key="$3" + + awk -F ' = ' ' + /^\[/ { current_section = substr($0, 2, length($0)-2) } + current_section == "'"$section"'" && $1 == "'"$key"'" { + sub(/^[ \t]+/, "", $2) + sub(/[ \t\r]+$/, "", $2) + print $2 + exit + } + ' "$ini_file" +} + +save_master_userdata() { + local ini_file="$1" + local firstname="$2" + local lastname="$3" + local password="$4" + local email="$5" + local userid="$6" + + touch "$ini_file" + + { + printf '\n[UserData]\n' + printf 'Vorname = %s\n' "$firstname" + printf 'Nachname = %s\n' "$lastname" + printf 'Passwort = %s\n' "$password" + printf 'E-Mail = %s\n' "$email" + printf 'UserID = %s\n' "$userid" + } >> "$ini_file" +} + +createmasteruser() { + local robust_bin="$WORKDIR/robust/bin" + local ini_file="$WORKDIR/UserInfo.ini" + local first_default="${OSM_MASTER_FIRSTNAME:-Master}" + local last_default="${OSM_MASTER_LASTNAME:-Avatar}" + local pass_default email_default userid_default + local firstname lastname password email userid input + + if [[ ! -f "$robust_bin/Robust.dll" ]]; then + die "Missing robust binary: $robust_bin/Robust.dll" + fi + + screen_start_dotnet "robustserver" "$robust_bin" "Robust.dll" + sleep "$ROBUSTSERVER_START_WAIT" + + pass_default="$(tr -dc 'A-Za-z0-9' Nachname -> Estate Name + stuff_enter "sim$i" "$VORNAME" + sleep 2 + stuff_enter "sim$i" "$NACHNAME" + sleep 2 + stuff_enter "sim$i" "$ESTATE_NAME" + sleep 2 + log INFO "sim$i region $r: owner and estate entered" + else + # Additional regions: user already known, accept defaults by Enter + stuff_enter "sim$i" "" + sleep 1 + stuff_enter "sim$i" "" + sleep 1 + stuff_enter "sim$i" "" + sleep 1 + log INFO "sim$i region $r: confirmed by Enter" + fi + done + fi + done + + [[ "$started_sims" -gt 0 ]] || die "No sim2..sim999 instances found to process" + log INFO "Processed estate prompts for $started_sims simulator(s)" +} + +createmasterestate() { + local sim1_bin="$WORKDIR/sim1/bin" + + read_estate_basics + + if [[ ! -f "$sim1_bin/OpenSim.dll" ]]; then + die "Missing sim1 binary: $sim1_bin/OpenSim.dll" + fi + + screen_start_dotnet "sim1" "$sim1_bin" "OpenSim.dll" + sleep "$ESTATE_WAIT" + + # sim1 expects: estate name, owner first name, owner last name + stuff_enter "sim1" "$ESTATE_NAME" + sleep 1 + stuff_enter "sim1" "$VORNAME" + sleep 1 + stuff_enter "sim1" "$NACHNAME" + sleep 1 + + log INFO "Master estate created on sim1" + createmasterestateall +} + +firststart() { + createmasteruser + createmasterestate +} + +WORKDIR="$DEFAULT_WORKDIR" +ACTION="" +PROFILE="grid-sim" +ESTATE_WAIT="${ESTATE_WAIT:-30}" + +SIMULATOR_STOP_WAIT="${SIMULATOR_STOP_WAIT:-15}" +MONEYSERVER_STOP_WAIT="${MONEYSERVER_STOP_WAIT:-30}" +ROBUSTSERVER_STOP_WAIT="${ROBUSTSERVER_STOP_WAIT:-30}" +SIMULATOR_START_WAIT="${SIMULATOR_START_WAIT:-15}" +MONEYSERVER_START_WAIT="${MONEYSERVER_START_WAIT:-30}" +ROBUSTSERVER_START_WAIT="${ROBUSTSERVER_START_WAIT:-30}" + +while [[ $# -gt 0 ]]; do + case "$1" in + --workdir) WORKDIR="$2"; shift 2 ;; + --profile) PROFILE="$2"; shift 2 ;; + --action) ACTION="$2"; shift 2 ;; + --estate-wait) ESTATE_WAIT="$2"; shift 2 ;; + --help|-h) usage; exit 0 ;; + *) die "$(msgf ERR_UNKNOWN_OPTION "$1")" ;; + esac +done + +[[ -n "$ACTION" ]] || die "$(msg ERR_MISSING_ACTION)" +validate_profile "$PROFILE" +ensure_profile_action_allowed estate "$PROFILE" "$ACTION" + +if [[ ! "$ESTATE_WAIT" =~ ^[0-9]+$ ]]; then + die "Invalid --estate-wait value: $ESTATE_WAIT" +fi + +log INFO "Using profile: $PROFILE" +log INFO "Using workdir: $WORKDIR" + +case "$ACTION" in + createmasteruser) createmasteruser ;; + createmasterestate) createmasterestate ;; + createmasterestateall) createmasterestateall ;; + firststart) firststart ;; + *) die "Unsupported action: $ACTION" ;; +esac diff --git a/modular/osmtool_install.sh b/modular/osmtool_install.sh index fa0e411..4afb837 100644 --- a/modular/osmtool_install.sh +++ b/modular/osmtool_install.sh @@ -269,6 +269,12 @@ install_dotnet8() { pkg_url="https://packages.microsoft.com/config/ubuntu/${version_id}/packages-microsoft-prod.deb" pkg_file="/tmp/packages-microsoft-prod.deb" + # Ubuntu 26.04: Microsoft bietet noch kein eigenes Repo an; 24.04 (noble) ist kompatibel + if [[ "$version_id" == "26.04" ]]; then + log INFO "Ubuntu 26.04 erkannt – verwende Microsoft-Repo fuer Ubuntu 24.04 (noble)" + pkg_url="https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb" + fi + log INFO "Adding Microsoft package repository for Ubuntu ${version_id}" wget -q -O "$pkg_file" "$pkg_url" sudo dpkg -i "$pkg_file"