blob: 706cae621eaa37dcf43c1efd9f84a6f32293b2fb (
plain) (
tree)
|
|
##############################################
# Include: Setup virtual floppy for drive b: #
##############################################
## Functions ##
# download the given resource for this lecture
# and makes it accessible globally through a
# variable of the same name. Given name will be
# put to lower case before wget'ing so its safe
# to use upper case variables...
load_dmsd_resource() {
[ $# -eq 0 ] && writelog "Missing argument for resource." && return
while [ $# -gt 0 ]; do
local RESOURCE="$1"
declare -g ${RESOURCE}="${TMPDIR}/${RESOURCE}"
local RESOURCE_URL="${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}/$(echo $1 | awk '{print tolower($0)}')"
shift
echo "DOWNLOAD to ${!RESOURCE}"
if ! wget -T 6 -O "${!RESOURCE}" "${RESOURCE_URL}" 2> /dev/null >&2; then
writelog "Downloading runscript from '${RESOURCE_URL}' failed."
continue
fi
if [ ! -s "${!RESOURCE}" ]; then
# zero bytes, log and ignore
writelog "Downloaded resource from '${RESOURCE_URL}' has zero bytes."
unset "${RESOURCE}"
else
# there is stuff in it, make it readonly
readonly "${RESOURCE}"
fi
done
return 0
}
setup_virtual_floppy() {
declare -rg SLX_FLOPPY_IMG="${TMPDIR}/floppy.img"
declare -rg 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")
else
$(safesource "/opt/openslx/inc/shares")
fi
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"
# 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]+')
# TODO fallback if this fails? this is currently never checked...
cat > "${TMPDIR}/HOSTRES.TXT" <<-EOF
${RESOLUTION}
EOF
# Create file for network shares to mount
declare -g SHARES="${TMPDIR}/shares.dat"
touch "${SHARES}"
chmod 0600 "${SHARES}"
if ! pwdaemon --query "${TMPHOME}/.pwsocket" > "${SHARES}"; then
slxlog "virt-pwdaemon" "Could not start pwdaemon"
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 ] && [ -e "${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
## 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 load_dmsd_resource NETSHARES; then
if [ -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
fi
## Runscript
# Check downloaded runscript, handle extension marker
if load_dmsd_resource RUNSCRIPT; then
local EXT=
if [ -s "$RUNSCRIPT" ]; then
EXT=$(head -n 1 "$RUNSCRIPT" | grep -o -i '^EXT=.*$' | cut -d '=' -f 2-)
[ -n "$EXT" ] && [ "x${EXT:0:1}" != "x." ] && EXT=".$EXT"
fi
fi
# Write info file
local UNAME=
[ -s "${HOME}/.openslx/account" ] && UNAME=$(cat "${HOME}/.openslx/account")
notempty UNAME || UNAME=$(whoami)
cat > "${TMPDIR}/openslx.ini" <<-EOF
[openslx]
username=${UNAME}
resolution=${RESOLUTION}
createMissingRemap=${SHARE_CREATE_MISSING_REMAP}
remapMode=${SHARE_REMAP_MODE_INI}
homeDrive=${SHARE_HOME_DRIVE}
megaDrive=SEGA
scriptExt=${EXT}
passCreds=${SHARE_CREDENTIAL_PASSTHROUGH}
bootIp=${SLX_PXE_CLIENT_IP}
[remap]
documents=${SHARE_DOCUMENTS}
downloads=${SHARE_DOWNLOADS}
desktop=${SHARE_DESKTOP}
media=${SHARE_MEDIA}
other=${SHARE_OTHER}
EOF
# Copy all them there filez into floppy image
mcopy -i "${SLX_FLOPPY_IMG}" "${TMPDIR}/openslx.ini" "${TMPDIR}/HOSTRES.TXT" "${SHARES}" "${VMCHOOSER_DIR}/data/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
mcopy -i "${SLX_FLOPPY_IMG}" "$kf" "::/krb5user.key"
fi
fi
# Copy guest configuration (with added information) config.xml to be accessed
# via virtual floppy
mcopy -i "${SLX_FLOPPY_IMG}" "$XML_FILE" "::/config.xml"
# Copying linux directory:
mcopy -s -i "${SLX_FLOPPY_IMG}" "$VMCHOOSER_DIR/data/linux" "::/"
# User supplied runscript
if [ -n "$EXT" ]; then
sed -i '1d' "${RUNSCRIPT}"
mcopy -i "${SLX_FLOPPY_IMG}" "${RUNSCRIPT}" "::/runscript${EXT}"
fi
# Admin supplied runscript(s)
if [ -d "${VMCHOOSER_DIR}/adminrun" ]; then
mcopy -s -i "${SLX_FLOPPY_IMG}" "${VMCHOOSER_DIR}/adminrun" "::/"
fi
rm -f -- "${SHARES}" "${TMPDIR}/openslx.ini" "${TMPDIR}/HOSTRES.TXT"
}
## 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
|