summaryrefslogblamecommitdiffstats
path: root/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt.d/setup_virtual_floppy.inc
blob: fd62005fd8a072ca7c3ef2dd97f6e207f68c0cdf (plain) (tree)
1
2
3
4
5
6
7



                                              

                                                         
                                    





                                                                                                    

                                                          
                                                   

                                                       
 




                                                             







                                                                                   
                                                 
                                                   


                                                                        
                                                                     
                                                     

                                                                                                                        
                                                                                                                        
                                                                 







                                                                                                        
 

                                                 



                                                                          





                                                                                  
                  


                                                                                                               


                    
                          


                                                            






                                                                                              
 
                                                                                                                 
          
 
                          
                     
                                                 





                                                                                              
          
 

                         
                                                                                    
                                         





                                                                          
                         



                                                                         

                                                                               
          


                                               
                         
                                


                                                        

                                               
                                                 
                                   
                          
                                        







                                    
 
                                                                               




                                                                                  
                                                                  

                  
        

                                                                 

                                 
                                         
                                          
                                                                               

          
                                     
                                             








                                                                                                    

          




                                                                         


















                                                                                                                                                                                       
##############################################
# 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

	local resolution=
	# 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" != "virtualbox" ] || [ "$DISPLAY_COUNT" -eq 1 ]; then
		resolution="${RESOLUTIONS}"
	fi

	cat > "${FLOPPYDIR}/openslx.ini" <<-EOF
	[openslx]
	username=${UNAME}
	resolution=${resolution}
	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

	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