2025-10-18 11:05:20 +03:00
|
|
|
#!/bin/bash
|
|
|
|
|
# /usr/local/bin/dos-shell
|
2025-10-18 20:34:07 +03:00
|
|
|
# Prepare the SvarDOS environment and launch dosemu.
|
2025-10-18 11:05:20 +03:00
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
ALLOWED_LIST="/etc/dos_allowed"
|
2025-10-18 20:34:07 +03:00
|
|
|
ALLOWED_REPO="/opt/allowed_repo"
|
2025-10-18 11:05:20 +03:00
|
|
|
ENV_DIR="/etc/dos_env"
|
|
|
|
|
AUTOEXEC_TEMPLATE="${ENV_DIR}/AUTOEXEC.BAT"
|
|
|
|
|
CONFIG_TEMPLATE="${ENV_DIR}/CONFIG.SYS"
|
2025-10-18 20:34:07 +03:00
|
|
|
SVARDOS_ROOT="${SVARDOS_ROOT:-/opt/svardos}"
|
|
|
|
|
SVARDOS_BASE="${SVARDOS_BASE:-${SVARDOS_ROOT}/base}"
|
|
|
|
|
ALLOW_MODE="${DOS_ALLOW_MODE:-all}"
|
|
|
|
|
DEFAULT_DOS_USER="dosuser"
|
2025-10-19 00:45:04 +03:00
|
|
|
INSTALL_SENTINEL_NAME=".svardos_installed"
|
2025-10-18 11:05:20 +03:00
|
|
|
|
2025-10-18 20:34:07 +03:00
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
|
|
|
DOS_USER="${DEFAULT_DOS_USER}"
|
|
|
|
|
DOS_HOME="$(getent passwd "${DOS_USER}" | cut -d: -f6)"
|
|
|
|
|
else
|
|
|
|
|
DOS_USER="$(id -un)"
|
|
|
|
|
DOS_HOME="${HOME}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -z "${DOS_HOME}" ]; then
|
|
|
|
|
echo "Unable to determine home directory for ${DOS_USER}" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
DOSEMU_DIR="${DOS_HOME}/.dosemu"
|
|
|
|
|
C_DRIVE="${DOSEMU_DIR}/drive_c"
|
2025-10-19 00:45:04 +03:00
|
|
|
INSTALL_SENTINEL_PATH="${DOSEMU_DIR}/${INSTALL_SENTINEL_NAME}"
|
|
|
|
|
DOSEMU_ARGS=()
|
|
|
|
|
|
2025-10-18 23:29:41 +03:00
|
|
|
detect_dosemu_args() {
|
|
|
|
|
local mode="${DOS_TERMINAL_MODE:-auto}"
|
|
|
|
|
if [ "${mode}" = "auto" ]; then
|
|
|
|
|
if [ -n "${DISPLAY:-}" ]; then
|
|
|
|
|
mode="x"
|
|
|
|
|
else
|
|
|
|
|
mode="terminal"
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
case "${mode,,}" in
|
|
|
|
|
x|sdl|window|gui)
|
|
|
|
|
DOSEMU_ARGS=(-X -K "${C_DRIVE}")
|
|
|
|
|
;;
|
|
|
|
|
terminal|tty|text)
|
|
|
|
|
DOSEMU_ARGS=(-td -K "${C_DRIVE}")
|
|
|
|
|
;;
|
|
|
|
|
dumb)
|
|
|
|
|
DOSEMU_ARGS=(-dumb -K "${C_DRIVE}")
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo "Unknown DOS_TERMINAL_MODE '${mode}', defaulting to terminal mode." >&2
|
|
|
|
|
DOSEMU_ARGS=(-td -K "${C_DRIVE}")
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
2025-10-18 20:34:07 +03:00
|
|
|
allowed_entries=()
|
|
|
|
|
|
|
|
|
|
mkdir -p "${DOSEMU_DIR}" "${C_DRIVE}"
|
2025-10-18 11:05:20 +03:00
|
|
|
if [ "$(id -u)" -eq 0 ] && [ ! -d "${ENV_DIR}" ]; then
|
|
|
|
|
mkdir -p "${ENV_DIR}"
|
|
|
|
|
fi
|
|
|
|
|
|
2025-10-19 00:45:04 +03:00
|
|
|
reset_drive_c() {
|
2025-10-18 20:34:07 +03:00
|
|
|
if [ ! -d "${SVARDOS_BASE}" ] || [ -z "$(ls -A "${SVARDOS_BASE}")" ]; then
|
|
|
|
|
echo "SvarDOS base directory ${SVARDOS_BASE} is empty. Aborting." >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
rm -rf "${C_DRIVE:?}/"*
|
2025-10-18 11:05:20 +03:00
|
|
|
|
2025-10-18 11:47:07 +03:00
|
|
|
cp -a "${SVARDOS_BASE}/." "${C_DRIVE}/"
|
2025-10-18 22:51:41 +03:00
|
|
|
|
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
|
|
|
chown -R "${DOS_USER}:${DOS_USER}" "${DOSEMU_DIR}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -f "${DOS_HOME}/.dosemurc" ]; then
|
|
|
|
|
rm -f "${DOS_HOME}/.dosemurc"
|
|
|
|
|
fi
|
|
|
|
|
|
2025-10-18 20:34:07 +03:00
|
|
|
echo "SvarDOS base staged to ${C_DRIVE}"
|
|
|
|
|
}
|
2025-10-18 11:05:20 +03:00
|
|
|
|
2025-10-18 20:34:07 +03:00
|
|
|
sync_allowed_content() {
|
|
|
|
|
allowed_entries=()
|
|
|
|
|
local mode="${ALLOW_MODE}"
|
|
|
|
|
if [ "${mode}" = "all" ]; then
|
|
|
|
|
if [ -d "${ALLOWED_REPO}" ] && [ "$(ls -A "${ALLOWED_REPO}" 2>/dev/null)" ]; then
|
2025-10-18 11:47:07 +03:00
|
|
|
cp -a "${ALLOWED_REPO}/." "${C_DRIVE}/"
|
2025-10-18 20:34:07 +03:00
|
|
|
allowed_entries+=("ALL")
|
2025-10-18 11:47:07 +03:00
|
|
|
fi
|
2025-10-18 20:34:07 +03:00
|
|
|
return
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ "${mode}" != "list" ] && [ "${mode}" != "allowlist" ]; then
|
|
|
|
|
echo "Unknown DOS_ALLOW_MODE '${mode}', defaulting to allowlist mode." >&2
|
|
|
|
|
mode="list"
|
|
|
|
|
ALLOW_MODE="${mode}"
|
|
|
|
|
fi
|
|
|
|
|
|
2025-10-18 11:47:07 +03:00
|
|
|
if [ -f "${ALLOWED_LIST}" ]; then
|
|
|
|
|
while IFS= read -r line || [ -n "$line" ]; do
|
|
|
|
|
line="$(printf '%s' "$line" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
|
|
|
|
|
case "$line" in
|
|
|
|
|
''|\#*) continue ;;
|
|
|
|
|
esac
|
|
|
|
|
allowed_entries+=("$line")
|
|
|
|
|
done < "${ALLOWED_LIST}"
|
2025-10-18 11:05:20 +03:00
|
|
|
fi
|
2025-10-18 11:47:07 +03:00
|
|
|
|
|
|
|
|
for entry in "${allowed_entries[@]}"; do
|
|
|
|
|
src="${ALLOWED_REPO}/${entry}"
|
|
|
|
|
if [ -e "$src" ]; then
|
|
|
|
|
dst_dir="$(dirname "${entry}")"
|
|
|
|
|
mkdir -p "${C_DRIVE}/${dst_dir}"
|
|
|
|
|
cp -a "$src" "${C_DRIVE}/${dst_dir}/"
|
|
|
|
|
else
|
|
|
|
|
echo "Warning: allowed file not found: $src" >&2
|
|
|
|
|
fi
|
|
|
|
|
done
|
2025-10-18 20:34:07 +03:00
|
|
|
}
|
2025-10-18 11:05:20 +03:00
|
|
|
|
2025-10-18 20:34:07 +03:00
|
|
|
apply_templates() {
|
|
|
|
|
if [ -f "${AUTOEXEC_TEMPLATE}" ]; then
|
|
|
|
|
cp "${AUTOEXEC_TEMPLATE}" "${C_DRIVE}/AUTOEXEC.BAT"
|
|
|
|
|
fi
|
|
|
|
|
if [ -f "${CONFIG_TEMPLATE}" ]; then
|
|
|
|
|
cp "${CONFIG_TEMPLATE}" "${C_DRIVE}/CONFIG.SYS"
|
|
|
|
|
fi
|
|
|
|
|
}
|
2025-10-18 11:05:20 +03:00
|
|
|
|
2025-10-19 00:45:04 +03:00
|
|
|
detect_dosemu_args
|
|
|
|
|
|
|
|
|
|
if [ "${DOS_FORCE_INSTALL:-0}" = "1" ] || [ ! -f "${INSTALL_SENTINEL_PATH}" ]; then
|
|
|
|
|
reset_drive_c
|
|
|
|
|
touch "${INSTALL_SENTINEL_PATH}"
|
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
|
|
|
chown "${DOS_USER}:${DOS_USER}" "${INSTALL_SENTINEL_PATH}"
|
2025-10-18 22:51:41 +03:00
|
|
|
fi
|
2025-10-19 00:45:04 +03:00
|
|
|
else
|
|
|
|
|
echo "Reusing existing SvarDOS installation on ${C_DRIVE}" >&2
|
2025-10-18 11:05:20 +03:00
|
|
|
fi
|
|
|
|
|
|
2025-10-18 20:34:07 +03:00
|
|
|
sync_allowed_content
|
|
|
|
|
apply_templates
|
|
|
|
|
|
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
|
|
|
chown -R "${DOS_USER}:${DOS_USER}" "${DOSEMU_DIR}"
|
2025-10-18 11:05:20 +03:00
|
|
|
fi
|
|
|
|
|
|
2025-10-18 20:34:07 +03:00
|
|
|
if [ "${ALLOW_MODE}" = "all" ] && [ "${#allowed_entries[@]}" -gt 0 ]; then
|
|
|
|
|
echo "All files in ${ALLOWED_REPO} are available on drive C:."
|
|
|
|
|
elif [ "${#allowed_entries[@]}" -gt 0 ]; then
|
|
|
|
|
echo "Allowlisted files copied to C: from ${ALLOWED_REPO}:"
|
|
|
|
|
for entry in "${allowed_entries[@]}"; do
|
|
|
|
|
echo " ${entry}"
|
|
|
|
|
done
|
2025-10-18 11:05:20 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
2025-10-18 20:34:07 +03:00
|
|
|
exec runuser -u "${DOS_USER}" -- dosemu "${DOSEMU_ARGS[@]}"
|
2025-10-18 11:05:20 +03:00
|
|
|
else
|
2025-10-18 20:34:07 +03:00
|
|
|
exec dosemu "${DOSEMU_ARGS[@]}"
|
2025-10-18 11:05:20 +03:00
|
|
|
fi
|