blob: f589d2b6af4d2f9fdf090dce98d7a8f1fdce583a (
plain) (
tree)
|
|
##############################################
# Include: Setup virtual floppy for drive b: #
##############################################
## Functions ##
setup_virtual_floppy() {
declare -rg SLX_FLOPPY_IMG="${TMPDIR}/floppy.img"
declare -r TMPHOME="${HOME}"
# create floppy disk file + filesystem
dd "if=/dev/zero" "of=${SLX_FLOPPY_IMG}" count=1440 bs=1024
chmod 0600 "${SLX_FLOPPY_IMG}"
mkfs.fat "${SLX_FLOPPY_IMG}" || mkfs.vfat "${SLX_FLOPPY_IMG}" || mkdosfs "${SLX_FLOPPY_IMG}"
if [ -s "${TMPHOME}/.openslx/shares" ]; then
$(safesource "${TMPHOME}/.openslx/shares")
elif [ -s "/opt/openslx/inc/shares" ]; then
$(safesource "/opt/openslx/inc/shares")
fi
# Directory for files that go into the virtual floppy
declare -r FLOPPYDIR="$TMPDIR/floppy"
mkdir -p "$FLOPPYDIR"
chmod 0700 "$FLOPPYDIR"
if notempty SHARE_REMAP_MODE; then
local SHARE_REMAP_MODE_INI="$SHARE_REMAP_MODE"
else
local SHARE_REMAP_MODE_INI="0"
local SHARE_REMAP_MODE="3"
fi
notempty SHARE_CREATE_MISSING_REMAP || local SHARE_CREATE_MISSING_REMAP="1"
# Create file for network shares to mount
declare -g SHARES="${FLOPPYDIR}/shares.dat"
touch "${SHARES}"
chmod 0600 "${SHARES}"
if ! pwdaemon --query "${TMPHOME}/.pwsocket" > "${SHARES}"; then
slxlog "run-virt-pwdaemon" "Could not query pwdaemon"
echo -e '-\t-\t-\t-\t-' > "${SHARES}"
else
sed -i 's/^/192.168.101.1\t/' "${SHARES}" # TODO: Depending on nettype (in case we have != nat some day)
if [ "${SHARE_REMAP_MODE}" = 1 -o "${SHARE_REMAP_MODE}" = 2 ] && [ -s "${TMPHOME}/.openslx/home" ]; then
NETHOME=$(cat "${TMPHOME}/.openslx/home")
notempty SHARE_HOME_DRIVE || local SHARE_HOME_DRIVE="H:"
# Tab between items, so spaces can be used!
echo "${NETHOME} ${SHARE_HOME_DRIVE} Home-Verzeichnis" >> "${SHARES}"
fi
for VAR in ${!SHARE_LINE_*}; do
echo "${!VAR}" >> "${SHARES}"
done
fi
declare -r NETSHARES="$CONFDIR/netshares"
declare -r RUNSCRIPT="$CONFDIR/runscript"
## Network shares
# openslx.exe expects network shares line in the following format:
# <path> <letter> <shortcut> <username> <password>
# which is coincidentally the one we received from dmsd :)
if [ -f "$NETSHARES" ] && [ -s "${NETSHARES}" ]; then
# try to detect if we are running windows and replace '/' with '\'
# in an attempt to fix an improperly given samba path
cmd=(cat)
if [[ "$( tr 'A-Z' 'a-z' <<< ${VM_OS_TYPE})" = *windows* ]]; then
cmd=(tr / '\\')
fi
# replace the tag for the username, if present; the variable expansion escapes all ':' in $USER
sed -i "s:%loginuser%:${USER//:/\\:}:g" "${NETSHARES}"
< "${NETSHARES}" "${cmd[@]}" >> "${SHARES}"
fi
## Runscript
declare -A OPTIONS
# Check downloaded runscript and handle options like
# extension, visibility flag, ...
# options are 'key=value' pairs separated with ';'
if [ -f "$RUNSCRIPT" ] && [ -s "$RUNSCRIPT" ]; then
IFS=$'\n'
for OPT in $( head -n 1 "$RUNSCRIPT" | tr ";" "\n" ); do
KEY=$( cut -s -d '=' -f 1 <<< "${OPT^^}" )
[ -n "$KEY" ] && OPTIONS["$KEY"]="$( cut -s -d '=' -f 2- <<< "$OPT" )"
done
unset IFS
[ -n "${OPTIONS[EXT]}" ] && [ "x${OPTIONS[EXT]:0:1}" != "x." ] && OPTIONS[EXT]=".${OPTIONS[EXT]}"
fi
# Default to muted
local MUTED=1
# Satellite/location setting can override
[[ "$SLX_VM_SOUND" = *_ACTIVE ]] && MUTED="0"
# finally, lecture override
if [[ "$SLX_VM_SOUND" != FORCE_* ]]; then
if [ -n "${OPTIONS[SOUNDMUTED]}" ] && [ "${OPTIONS[SOUNDMUTED]}" != -1 ]; then
MUTED="${OPTIONS[SOUNDMUTED]}"
fi
fi
# Write info file
local UNAME=
[ -s "${HOME}/.openslx/account" ] && UNAME=$(cat "${HOME}/.openslx/account")
notempty UNAME || UNAME=$(whoami)
# Only warn for non-demo
if [ "$SHARE_NO_HOME_WARN" = "2" ] && [ "$UNAME" != "demo" ]; then
SHARE_NO_HOME_WARN=0
fi
# Legacy: openslx.exe expects HOSTRES.TXT
local RESOLUTION=$(xrandr | grep -o -E 'connected\s*(primary)?\s*[0-9]+x[0-9]+\+0\+0' \
| grep -o -E -m1 '[0-9]+x[0-9]+')
cat > "${FLOPPYDIR}/HOSTRES.TXT" <<-EOF
${RESOLUTION}
EOF
(
echo '[openslx]'
# Ugly hack for multi-monitor support with virtualbox.
# The guest additions properly set up the resolutions of multiple
# monitor, thus we need to disable the resolution feature of
# the openslx.exe as it would break what virtualbox did.
if [ "$PLUGIN_ID" = "vmware" ] || [ "$PLUGIN_ID" = "virtualbox" -a "$DISPLAY_COUNT" -eq 1 ]; then
echo "resolution=$RESOLUTION"
fi
cat <<-EOF
username=${UNAME}
createMissingRemap=${SHARE_CREATE_MISSING_REMAP}
remapMode=${SHARE_REMAP_MODE_INI}
homeDrive=${SHARE_HOME_DRIVE}
scriptExt=${OPTIONS[EXT]}
scriptVisibility=${OPTIONS[VISIBILITY]}
passCreds=${SHARE_CREDENTIAL_PASSTHROUGH}
bootIp=${SLX_PXE_CLIENT_IP}
muteSound=${MUTED}
noHomeWarn=${SHARE_NO_HOME_WARN}
[remap]
documents=${SHARE_DOCUMENTS}
downloads=${SHARE_DOWNLOADS}
desktop=${SHARE_DESKTOP}
media=${SHARE_MEDIA}
other=${SHARE_OTHER}
EOF
) > "${FLOPPYDIR}/openslx.ini"
ln -n -s "${VMCHOOSER_DIR}/data/openslx.exe" "${FLOPPYDIR}/openslx.exe"
# If we have a kerberos ticket, copy that one too (TODO: Copy keytab too?)
if [ -n "$KRB5CCNAME" ]; then
kf=${KRB5CCNAME#FILE:}
kf=${kf#file:}
if [ -n "$kf" ] && [ -f "$kf" ]; then
ln -n -s "$kf" "${FLOPPYDIR}/krb5user.key"
fi
fi
# Linux directory
ln -n -s "$VMCHOOSER_DIR/data/linux" "${FLOPPYDIR}/linux"
# User supplied runscript
if [ -n "${OPTIONS[EXT]}" ]; then
sed -i '1d' "${RUNSCRIPT}"
ln -n -s "${RUNSCRIPT}" "${FLOPPYDIR}/runscript${OPTIONS[EXT]}"
fi
# Admin supplied runscript(s)
if [ -d "${CONFDIR}/adminrun" ]; then
ln -n -s "${CONFDIR}/adminrun" "${FLOPPYDIR}/adminrun"
fi
# Hook
run_hooks "floppy" "$FLOPPYDIR"
local size="$( du -s -l -L "${FLOPPYDIR}" | awk '{print $1}' )"
if [ -n "$size" ] && [ "$size" -ge 1400 ]; then
writelog "WARNING: Floppydir contains $size kb of data, will most likely not fit..."
fi
if ! mcopy -s -i "${SLX_FLOPPY_IMG}" "${FLOPPYDIR}"/* "::/"; then
writelog "Error creating floppy image from ${FLOPPYDIR}"
elif ! $DEBUG; then
rm -rf -- "${FLOPPYDIR}"
fi
}
## MAIN ##
# Sanity checks #
# Check if we have any filesystem tool
if ! check_dep --oneof mkfs.fat mkfs.vfat mkdosfs; then
# no tools found in minilinux, this means no floppy/openslx.exe will be supported
slxlog "virt-fstool-missing" "Could not find any of 'mkfs.fat', 'mkfs.vfat', 'mkdosfs'!"
writelog "Could not find any filesystem-related tools to create the floppy's filesystem with!"
error_user "Konnte kein virtuelles Floppy anlegen! Setzen der Auflösung oder Einhängen von Netzwerkfreigaben werden nicht funktionieren. Bitte kontaktieren Sie den Support."
# still continue as this is not really critical
fi
# separate check for other deps
if ! check_dep dd chmod pwdaemon sed head grep cut whoami mcopy; then
writelog "Missing core tools to setup the virtual floppy!"
else
reg_feature_handler "slxfloppy" "setup_virtual_floppy"
fi
|