[FreeNX-kNX] Working Cups printing with Fedora core5
Alastair Johnson
alastair at solutiontrax.com
Mon Nov 27 15:35:33 UTC 2006
Thanks for getting this all together in one post. I have a couple of
clarifications that might save somebody some trouble.
1. You need cups 1.1.x for this to work. Many FC5 users will now have cups
1.2.x because yum will have updated it. These users will need to downgrade to
1.1.x and add cups* to the exclude line in /etc/yum.conf until we can work
out how to support cups 1.2.x. This applies to other distros too.
2. The method of determining $printhost described below is fedora-specific.
Using 'hostname' or 'uname -n' should work more generally. Unfortunately the
hostname is sometimes present in /etc/hosts against the localhost address, so
the name may still resolve to localhost. To cover this I think we should have
$printhost as an option in node.conf and only use the hostname if this isn't
set.
I don't like the 'kill all processes for this user' idea, but I don't have a
better solution at the moment.
On Monday 27 November 2006 13:59, Marcel kraan wrote:
> changed nxnode:
> NXNODE - Version 1.5.0-50 OS (GPL)
>
>
> I have here a complete working nxnode script for fedora core5.
> I have added many extras and changed some functions
>
>
> 1.
> This is add on the end of the node_terminate_session function:
> This will clean up the userspace on the server.
> All processes will be killed. not clean but very efective
>
> # quickkill script by marcel at kraan.net
> if [ "$USER" != "root" ]; then
> /bin/kill -9 `ps axuw |grep $USER | /bin/awk '{print $2}'`
>
> fi
>
>
>
> 2.
> At the srat of the session i have added the IPP_PORT section
> This is for printing NON kde applications
>
> # ok, lets make the session dir first:
>
> sess_id="$SERVER_NAME-$display-$uniqueid"
> [ "$EXPORT_SESSIONID" = "1" ] && export NXSESSIONID="$sess_id"
>
>
> ###########################################################################
>############## # added by marcel at kraan.net added to the environment for
> printing non kde applications # this is not working in the add_printer
> function
> IPP_PORT=$(node_cupsd_get_port)
> export IPP_PORT
>
> ###########################################################################
>##############
>
> 3.
> I have added this part for the cups printing
> Cups printing works only when you print to your hostname on the server and
> not to localhost
>
> Alastair thinks the change from localhost to actual hostname is needed
> because CUPS uses token-based authentication for localhost instead of the
> usual challenge-response methods. Normally this is fine, but since we are
> port-forwarding to a non-local cups we need the challenge-response, so we
> need something that resolves to the local machine but isn't localhost (or
> 127.0.0.1 for that matter)
>
>
> #################################################################
> # by marcel at kraan.net and Alastair Johnson
> # get the server hostname cups printing could not via localhost
>
> if [ -f /etc/sysconfig/network ] ; then
> . /etc/sysconfig/network
> if [ "$NETWORKING" = "yes" ] ; then
> printhost="$HOSTNAME"
> else
> printhost="localhost"
> fi
> fi
>
> if [ "$type" = "smb" ]
> then
>
> DEVICE_URI="smb://$username:$password@$printhost:$port/$share"
> NAME="$share"
> else
>
> DEVICE_URI="ipp://$username:$password@$printhost:$port/printers/$printer"
> NAME="$printer"
> fi
>
> MODEL=$($PATH_BIN/nxclient -printer "$NAME" -display :$display)
> [ -z "$MODEL" -o "$MODEL" = "cancel: aborted" ] && return
>
> PUBLIC="-u allow:$USER"
> [ "$public" == "1" ] && PUBLIC=""
> /usr/sbin/lpadmin -p "$NAME" -E -v "$DEVICE_URI" -m "$MODEL"
> $PUBLIC [ "$defaultPrinter" = "1" ] && /usr/sbin/lpadmin -d "$NAME"
>
> #################################################################
>
>
>
>
> 4.
> At his place i post the entire nxnode script.
> The smbmounting is still not working well and clean.
>
>
> #!/bin/bash
>
> # Free implementation of nxserver components
> #
> # nxnode does accept (for now):
> #
> # --startsession
> # --terminate
> # --smbmount
> # (smbmount is not implemented yet)
> #
> # Copyright (c) 2004 by Fabian Franz.
> #
> # License: GNU GPL, version 2
> #
> # CVS: $Id: nxnode,v 1.77 2005/08/02 15:20:18 fabianx Exp $
> #
> # 21.06.2004: - Full reconnection support
>
> # Read the config file
> . $(PATH=$(cd $(dirname $0) && pwd):$PATH which nxloadconfig) --userconf
>
> echo "NX> 1000 NXNODE - Version $NX_VERSION $NX_LICENSE"
>
> if [ "$1" != "--check" -a "$1" != "--setkey" -a "$1" != "--agent" ]
> then
> read CMDLINE
>
> CMDLINE="a=b&$CMDLINE"
> fi
>
> # --------
>
> # following two functions are Copyright by Klaus Knopper
>
> # same for strings
> stringinstring(){
> case "$2" in *$1*) return 0;; esac
> return 1
> }
>
> # Reread boot command line; echo last parameter's argument or return false.
> getparam(){
> stringinstring "&$1=" "$CMDLINE" || return 1
> echo "$CMDLINE" | tr "&" "\n" | egrep "^"$1"=" | awk -F= '{ VAL=$2 } END {
> print VAL }' return 0
> }
>
> find_app()
> {
> set -- $*
> which $1 2>/dev/null
> }
>
> getparam_user()
> {
> [ $UID -eq 0 ] && echo $(getparam user)
> [ $UID -eq 0 ] || $(whoami)
> }
>
> node_abort()
> {
> echo "$@" 1>&2
> exit 1
> }
>
> getparam_sessionid()
> {
> sessionid=$(getparam sessionid)
>
> [ -n "$sessionid" ] || sessionid=$(getparam session_id)
> [ -n "$sessionid" ] || node_abort "NX> 500 Error: missing parameter
> session id" echo $sessionid
> }
>
>
> node_terminate_agent()
> {
> AGENT_PID=$(cat $USER_FAKE_HOME/.nx/C-$1/pids/agent 2>/dev/null)
> [ -n "$AGENT_PID" ] && kill $AGENT_PID 2>/dev/null
> }
>
> node_terminate_session()
> {
> [ -d "$USER_FAKE_HOME/.nx/C-$1/" ] || return
> AGENT_PID=$(cat $USER_FAKE_HOME/.nx/C-$1/pids/agent 2>/dev/null)
> if [ -n "$AGENT_PID" ]
> then
> kill $AGENT_PID 2>/dev/null
> if ! [ "$virtualdesktop" = "0" -a "$rootless" != "1" ]
> then
> sleep 1
> kill -0 $AGENT_PID 2>/dev/null && kill -9 $AGENT_PID 2>/dev/null
> fi
> fi
> # remove possible leftover display ...
> display=$(echo $1 | rev | cut -d"-" -f2 | rev)
> rm -f /tmp/.X$display-lock
> rm -f /tmp/.X11-unix/X$display
>
> # remove cookie
> $COMMAND_XAUTH -v source $USER_FAKE_HOME/.nx/C-$1/scripts/authority
> >/dev/null 2>&1 [ "$SESSION_LOG_CLEAN" = "1" ] && rm -rf
> $USER_FAKE_HOME/.nx/C-$1/ [ "$SESSION_LOG_CLEAN" = "0" -a "$2" = "failed" ]
> && mv $USER_FAKE_HOME/.nx/C-$1/ $USER_FAKE_HOME/.nx/F-C-$1/ [
> "$SESSION_LOG_CLEAN" = "0" -a "$2" != "failed" ] && mv
> $USER_FAKE_HOME/.nx/C-$1/ $USER_FAKE_HOME/.nx/T-C-$1/
>
> # quickkill script by marcel at kraan.net
> if [ "$USER" != "root" ]; then
> /bin/kill -9 `ps axuw |grep $USER | /bin/awk '{print $2}'`
>
> fi
>
>
> }
>
> node_fail_restore_session()
> {
> echo "NX> 1004 Error: Could not resume session. nxagent process could not
> be found." node_terminate_session "$sess_id" "failed"
> exit 1
> }
>
> node_suspend_session()
> {
> AGENT_PID=$(cat $USER_FAKE_HOME/.nx/C-$1/pids/agent 2>/dev/null)
> if [ -n "$AGENT_PID" ]
> then
> kill -0 $AGENT_PID || return 1
> kill -HUP $AGENT_PID && return 0
> fi
> return 1
> }
>
> # ---------
> #stringinstring "$CMD"
>
> node_start_applications()
> {
> # close input and output file descriptors
> exec 0<&-
> exec 1>&-
> exec 2>&-
>
> . /etc/profile
> [ -f ~/.bash_profile ] && . ~/.bash_profile
>
> mkdir -p $USER_FAKE_HOME/.nx/C-$sess_id/pids/
>
> STARTX=""
> case $type in
> unix-kde)
> STARTX=$COMMAND_START_KDE
> ;;
> unix-gnome)
> STARTX=$COMMAND_START_GNOME
> ;;
> unix-cde)
> STARTX=$COMMAND_START_CDE
> ;;
> unix-application)
> [ "$application" = "xterm" ] && application="$COMMAND_XTERM"
> STARTX=$application
> ;;
> unix-default)
> if [ -x "$HOME/$USER_X_STARTUP_SCRIPT" ]; then
> STARTX="$HOME/$USER_X_STARTUP_SCRIPT"
> elif which "$DEFAULT_X_SESSION" >/dev/null 2>&1 ; then
> STARTX="$DEFAULT_X_SESSION"
> fi
> ;;
> esac
> [ -n "$STARTX" ] || return
>
> if [ "$mediahelper" = "esd" ]
> then
> # Set Espeaker variable
> let ESPEAKER=$display+7000
> export ESPEAKER="127.0.0.1:$ESPEAKER"
>
> # Do not spawn new ESD daemons
> export ESD_NO_SPAWN="yes"
>
> # Check for config file directive
> if [ "$ENABLE_ESD_PRELOAD" = "1" -a -x "$(find_app $ESD_BIN_PRELOAD)" ]
> then
> STARTX="$ESD_BIN_PRELOAD $STARTX"
>
> echo "Info: NXNODE - Using $ESD_BIN_PRELOAD wrapper script." >>
> $USER_FAKE_HOME/.nx/C-$sess_id/session fi
> elif [ "$mediahelper" = "artsd" ]
> then
> # Overwrite users mcoprc
> echo -n "GlobalComm=Arts::X11GlobalComm" > $HOME/.mcoprc
> if [ "$ENABLE_ARTSD_PRELOAD" = "1" -a -x "$(find_app $ARTSD_BIN_PRELOAD)"
> ] then
> STARTX="$ARTSD_BIN_PRELOAD $STARTX"
> echo "Info: NXNODE - Using $ARTSD_BIN_PRELOAD wrapper script." >>
> $USER_FAKE_HOME/.nx/C-$sess_id/session fi
> fi
>
> [ "$virtualdesktop" = "0" -a "$rootless" != "1" ] && export
> LD_PRELOAD="$APPLICATION_LIBRARY_PRELOAD:$LD_PRELOAD" if [
> "$virtualdesktop" = "1" -a "$type" = "unix-application" -a "$DEFAULT_X_WM"
> != "" -a -x "$(find_app $DEFAULT_X_WM)" ] then
> DISPLAY=unix:$display $DEFAULT_X_WM
> >>$USER_FAKE_HOME/.nx/C-$sess_id/session 2>&1 & WM_PID=$!
> fi
> DISPLAY=unix:$display $STARTX >>$USER_FAKE_HOME/.nx/C-$sess_id/session
> 2>&1 & APP_PID=$!
> mkdir -p $USER_FAKE_HOME/.nx/C-$sess_id/pids/
> echo "$APP_PID" > $USER_FAKE_HOME/.nx/C-$sess_id/pids/applications
> wait $APP_PID
> if [ -n "$WM_PID" ]
> then
> # kill the WM after application is finished?
> [ "$KILL_DEFAULT_X_WM" = "1" ] && kill $WM_PID 2>/dev/null
> # or just wait until it finishes?
> [ "$KILL_DEFAULT_X_WM" = "1" ] || wait $WM_PID
> fi
> rm -f $USER_FAKE_HOME/.nx/C-$sess_id/pids/applications
>
> # Do not terminate agent in case of rootless agent mode.
> # The agent times out after a while by itself anyway.
> [ "$virtualdesktop" = "1" -o "$rootless" != "1" ] && node_terminate_agent
> $sess_id }
>
> node_start_agent()
> {
> # Ok, now we do some wicked fd magic.
> #
> # first part:
> #
> # nxagent's fd #2 -> fd #3
>
> # second part:
> #
> # fd #1 -> #4
> # fd #3 -> #1
> # tee | node_start_monitor
>
> # third part
> # fd #4 -> #1
>
> # => all output of nxagent goes to tee | node_start_monitor, while
> # leaving all other output flow through like normally.
>
> # preparations
> exec 3>&2
> exec 4>&1
>
> {
>
> {
>
> export
> DISPLAY="nx/nx,options=$USER_FAKE_HOME/.nx/C-$sess_id/options:$display"
> export XAUTHORITY="$USER_FAKE_HOME/.nx/C-$sess_id/authority"
> export HOME="$USER_FAKE_HOME"
>
> # backwards compatibility
> K=""
> [ -n "$keyboard" ] && K="-keyboard $keyboard"
> [ -n "$kbtype" ] && K="-kbtype $kbtype"
> B=""
> [ -n "$backingstore" -a "$ENABLE_2_0_0_BACKEND" != "1" ] && B="-bs
> $backingstore" G=""
> [ -n "$geometry" ] && G="-geometry $geometry"
> R="-D"
> [ "$rootless" = "1" ] && R="-R"
> vncfullscreen=""
> [ "$geometry" = "fullscreen" -a "$type" = "vnc" ] &&
> vncfullscreen="-fullscreen" && G="" [ "$geometry" = "fullscreen" -a "$type"
> = "windows" ] && G="-geometry `echo $screeninfo | cut -d"x" -f1,2`"
>
> if [ "$type" = "windows" ]
> then
> # nxdesktop session (Windows RDP)
> [ "$SET_LD_LIBRARY_PATH" = "1" ] && export
> LD_LIBRARY_PATH="$AGENT_LIBRARY_PATH:$LD_LIBRARY_PATH" U=""
> P=""
> D=""
> [ -n "$agent_user" ] && U="-u $agent_user"
> [ -n "$agent_password" ] && P="-p -"
> [ -n "$agent_domain" ] && D="-d $agent_domain"
> echo "$agent_password" | $PATH_BIN/nxdesktop -name "NX -
> $user@$SERVER_NAME:$display - $session (GPL Edition)" -option
> "$USER_FAKE_HOME/.nx/C-$sess_id/options" $K $G $U $P $D $agent_server
> $AGENT_EXTRA_OPTIONS_RDP 2>&3 & elif [ "$type" = "vnc" ]
> then
> # nxviewer session (VNC RFP)
> [ "$SET_LD_LIBRARY_PATH" = "1" ] && export
> LD_LIBRARY_PATH="$AGENT_LIBRARY_PATH:$LD_LIBRARY_PATH" mkdir -p
> $USER_FAKE_HOME/.nx/C-$sess_id/scripts/
> echo "$agent_password" | $PATH_BIN/nxpasswd
> $USER_FAKE_HOME/.nx/C-$sess_id/scripts/.passwd doit $PATH_BIN/nxviewer
> -encodings tight hextile copyrect raw -passwd
> $USER_FAKE_HOME/.nx/C-$sess_id/scripts/.passwd -name "NX -
> $user@$SERVER_NAME:$display - $session (GPL Edition)" -option
> "$USER_FAKE_HOME/.nx/C-$sess_id/options" $vncfullscreen $G $K $agent_server
> $AGENT_EXTRA_OPTIONS_RFB 2>&3 &
> elif [ "$R" = "-R" -a "$rootless" != "1" ]
> then
> # nxproxy single application mode session
> [ "$SET_LD_LIBRARY_PATH" = "1" ] && export
> LD_LIBRARY_PATH="$PROXY_LIBRARY_PATH:$LD_LIBRARY_PATH" $PATH_BIN/nxproxy -C
> :$display $PROXY_EXTRA_OPTIONS 2>&3 &
> else
> # nxagent session (X11)
> [ "$SET_LD_LIBRARY_PATH" = "1" ] && export
> LD_LIBRARY_PATH="$AGENT_LIBRARY_PATH:$LD_LIBRARY_PATH" P="-nopersistent"
> OLD_IFS=$IFS
> IFS=","
> [ "$ENABLE_PERSISTENT_SESSION" = "all" ] && P="-persistent"
> [ "$ENABLE_PERSISTENT_SESSION" = "all" ] || for USERNAME in
> $ENABLE_PERSISTENT_SESSION; do [ "${USERNAME:0:1}" != "@" ] && [ "$USER" =
> "$USERNAME" ] && P="-persistent" && break ; [ "${USERNAME:0:1}" = "@" ] &&
> [ -z $(groups "$USER" | egrep "^${USERNAME:1}:") ] && P="-persistent" &&
> break ; done
> for USERNAME in $DISABLE_PERSISTENT_SESSION; do
> [ "${USERNAME:0:1}" != "@" ] && [ "$USER" = "$USERNAME" ] &&
> P="-nopersistent" && break ; [ "${USERNAME:0:1}" = "@" ] && [ -z $(groups
> "$USER" | egrep "^${USERNAME:1}:") ] && P="-nopersistent" && break ; done
> IFS=$OLD_IFS
> FP=""
> [ -n "$AGENT_FONT_SERVER" ] && FP="-fp $AGENT_FONT_SERVER"
> PATH="$PATH_BIN:$PATH" $PATH_BIN/nxagent $P $R -name "NX -
> $user@$SERVER_NAME:$display - $session (GPL Edition)" -option
> "$USER_FAKE_HOME/.nx/C-$sess_id/options" $K $G $B $FP :$display
> $AGENT_EXTRA_OPTIONS_X 2>&3 & fi
> PID=$!
> mkdir -p $USER_FAKE_HOME/.nx/C-$sess_id/pids/
> echo "$PID" > $USER_FAKE_HOME/.nx/C-$sess_id/pids/agent
> wait $PID
> AGENT_EXIT_STATUS=$?
> failed=""
> if [ $AGENT_EXIT_STATUS -ne 0 ]
> then
> echo "NX> 1004 Error: NX Agent exited with exit status 1."
> failed="failed"
> fi
> echo "NX> 1006 Session status: closed"
>
> rm -f $USER_FAKE_HOME/.nx/C-$sess_id/pids/agent
> node_terminate_session "$sess_id" $failed
>
> # remove possible leftovers of nxagent
> rm -f /tmp/.X$display-lock
> rm -f /tmp/.X11-unix/X$display
> } 3>&1 1>&4 | tee $USER_FAKE_HOME/.nx/C-$sess_id/session |
> node_start_monitor; } 4>&1 }
>
> node_kill_proxy()
> {
> # Info: Proxy running in server mode with pid '5279'.
> PROXY_PID=$(grep "Info: Proxy running in server mode with pid"
> $USER_FAKE_HOME/.nx/C-$1/session | cut -d"'" -f2) sleep 2
> [ -n "$PROXY_PID" ] && kill $PROXY_PID 2>/dev/null
> }
>
> node_cupsd_stop()
> {
> [ -e "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd" ] || return
> NODE_CUPSD_PID=$(cat "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd")
> # Check for a running userspace cupsd, look if its still active
> # and kill it if so
> ( [ -n "$NODE_CUPSD_PID" ] && kill -0 $NODE_CUPSD_PID && kill
> $NODE_CUPSD_PID && sleep 2 && kill -0 $NODE_CUPSD_PID && kill -9
> $NODE_CUPSD_PID ) 2>/dev/null
> # delete pid file
> rm -f "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd"
> # remove all printers
> echo >"$USER_FAKE_HOME/.nx/C-$sess_id/cups/printers.conf"
> }
>
> node_cupsd_setup()
> {
> let NODE_CUPSD_PORT=$display+9000 # offset 9000 for userspace cupsd's
> export NODE_CUPSD_PORT
> mkdir -p "$USER_FAKE_HOME/.nx/C-$sess_id/pids/"
> [ -e "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd" ] && return
> touch "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd"
>
> mkdir -p $USER_FAKE_HOME/.nx/C-$sess_id/cups/spool/tmp
> $USER_FAKE_HOME/.nx/C-$sess_id/cups/spool/certs
> $USER_FAKE_HOME/.nx/C-$sess_id/cups/ppd ln -sf spool/certs
> $USER_FAKE_HOME/.nx/C-$sess_id/cups/certs
> cat <<EOF > $USER_FAKE_HOME/.nx/C-$sess_id/cups/cupsd.conf
> AccessLog /dev/null
> ErrorLog error_log
> PageLog page_log
> LogLevel info
> TempDir $USER_FAKE_HOME/.nx/C-$sess_id/cups/spool/tmp
> RequestRoot $USER_FAKE_HOME/.nx/C-$sess_id/cups/spool
> ServerRoot $USER_FAKE_HOME/.nx/C-$sess_id/cups/
> Port $NODE_CUPSD_PORT
> Browsing Off
> ServerName localhost
>
> <Location />
> Order Deny,Allow
> Deny From All
> Allow from 127.0.0.1
> </Location>
> EOF
> touch $USER_FAKE_HOME/.nx/C-$sess_id/cups/printers.conf
> $USER_FAKE_HOME/.nx/C-$sess_id/cups/classes.conf
>
> # copy mime.* files
> cp "$CUPS_ETC"/mime.* "$USER_FAKE_HOME/.nx/C-$sess_id/cups/"
>
> # start cupsd
> $COMMAND_CUPSD -f -c "$USER_FAKE_HOME/.nx/C-$sess_id/cups/cupsd.conf"
> &>/dev/null </dev/null & CUPSD_PID=$!
> sleep 3
> echo $CUPSD_PID >"$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd"
> # setup KDE
> if [ "$ENABLE_KDE_CUPS" = "1" -a -e "$KDE_PRINTRC" ]
> then
> if egrep -q "^Port=" "$KDE_PRINTRC"
> then
> perl -pi -e 's/^Port=.*/Port='"$NODE_CUPSD_PORT"'/g' "$KDE_PRINTRC"
> else
> echo "[CUPS]" >> "$KDE_PRINTRC"
> echo "Port=$NODE_CUPSD_PORT" >> "$KDE_PRINTRC"
> fi
> fi
>
> }
>
> node_cupsd_reload()
> {
> [ -e "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd" ] || return
> NODE_CUPSD_PID=$(cat "$USER_FAKE_HOME/.nx/C-$sess_id/pids/cupsd")
> [ -n "$NODE_CUPSD_PID" ] && kill -0 $NODE_CUPSD_PID && kill -HUP
> $NODE_CUPSD_PID }
>
> node_cupsd_get_port()
> {
> node_cupsd_setup
> echo $NODE_CUPSD_PORT
> }
>
> node_umount_smb()
> {
> [ -e "$USER_FAKE_HOME/.nx/C-$sess_id/scripts/mpoint" ] || return
> cat "$USER_FAKE_HOME/.nx/C-$sess_id/scripts/mpoint" | while read mpoint
> do
> $COMMAND_SMBUMOUNT "$mpoint" >/dev/null 2>/dev/null
> done
> }
>
>
> node_stop_services()
> {
> node_umount_smb
> node_cupsd_stop
> }
>
> node_emergency_exit()
> {
> # umount shares & stop printers
> node_stop_services
>
> # kill the session
> node_terminate_session "$sess_id" "failed"
>
> echo "NX> 1004 Error: Emergency exit due to kill signal."
> }
>
> #
> # Monitoring the nxagent: Its also kind of a "state-machine"
> # as it has to keep track of different
> # connection states and react differently.
> #
>
> node_start_monitor_2_0_0()
> {
> TAIL_PID=""
> SUSPEND_STATUS="$2"
> SESSION_STATUS=""
>
> while read line
> do
> #
> # Catch tail pid
> #
>
> if stringinstring "Info: tail -f running with pid" "$line"
> then
> TAIL_PID=$(echo $line | cut -d"'" -f2)
> fi
>
> #
> # Session messages
> #
>
> if stringinstring "Session: Starting session at" "$line"
> then
> echo "NX> 1009 Session status: starting"
> fi
>
> if stringinstring "Session: Suspending session at" "$line"
> then
> echo "NX> 1009 Session status: suspending"
> fi
>
> if stringinstring "Session: Terminating session at" "$line"
> then
> echo "NX> 1009 Session status: terminating"
> fi
>
> if stringinstring "Session: Resuming session at" "$line"
> then
> echo "NX> 1009 Session status: resuming"
> fi
>
>
> #
> # Session suspend
> #
>
> if stringinstring "Session: Session suspended at" "$line"
> then
> echo "NX> 1005 Session status: suspended"
> # umount shares & stop printers
>
> if [ "$SUSPEND_STATUS" = "Running" ]
> then
> node_suspend_session $sess_id
> SUSPEND_STATUS=""
> else
> node_stop_services
> fi
> fi
>
> #
> # Watchdog termination
> #
>
> if stringinstring "Info: Watchdog running with pid" "$line"
> then
> WATCHDOG_PID=$(echo $line | cut -d"'" -f2)
> fi
>
> if stringinstring "Info: Waiting the watchdog process to complete."
> "$line" then
> # Kill the watchdog
> kill $WATCHDOG_PID 2>/dev/null
> fi
>
> #
> # Session is running
> #
>
> if stringinstring "Info: Waiting for connection from" "$line"
> then
> echo "NX> 710 Session status: running"
> echo "NX> 1002 Commit"
> echo "NX> 1006 Session status: running"
> fi
>
> #
> # Reconnection success!
> #
>
> if stringinstring "Session: Session resumed at" "$line"
> then
> echo "NX> 718 Session restore succeded"
> if [ "$1" = "restore" ]
> then
> kill $TAIL_PID
> break
> fi
> fi
>
> #
> # Reconnection failure
> #
>
> if stringinstring "Session: Display failure detected at" "$line"
> then
> echo "NX> 596 Error: Session $1 failed. Reason was: $line"
> if [ "$1" = "restore" ]
> then
> kill $TAIL_PID
> break
> fi
> fi
> done
>
> trap "" EXIT
>
> [ "$1" = "restore" ] || node_stop_services
> # close all open file descriptors
> exec 0<&-
> exec 1>&-
> exec 2>&-
> exit 0
> }
>
> node_start_monitor_1_5_0()
> {
> RUNNING=0
> TAIL_PID=""
> SUSPEND_STATUS="$2"
>
> while read line
> do
> #
> # Catch tail pid
> #
>
> if stringinstring "Info: tail -f running with pid" "$line"
> then
> TAIL_PID=$(echo $line | cut -d"'" -f2)
> fi
>
> #
> # Detect nxagent syntax errors
> #
>
> #SYNTAX=""
>
> #stringinstring "Unrecognized option:" "$line" && SYNTAX="yes"
> #stringinstring "NXAGENT: Fatal IO error on display" "$line" &&
> SYNTAX="yes" #stringinstring "NXAGENT: Unable to open display" "$line" &&
> SYNTAX="yes" #if [ -n "$SYNTAX" ]
> #then
> # kill $TAIL_PID 2>/dev/null
> # echo "NX> 1004 Error: nxagent failed to start with: $line"
> # [ "$SESSION_LOG_CLEAN" = "1" ] && rm -rf
> $USER_FAKE_HOME/.nx/C-$sess_id/ # [ "$SESSION_LOG_CLEAN" = "1" ] || mv
> $USER_FAKE_HOME/.nx/C-$sess_id/ $USER_FAKE_HOME/.nx/F-C-$sess_id/ # break
> #fi
>
> #
> # Session suspend
> #
>
> if stringinstring "Info: Session suspended." "$line"
> then
> echo "NX> 1005 Session status: suspended"
> # umount shares & stop printers
>
> if [ "$SUSPEND_STATUS" = "Running" ]
> then
> node_suspend_session $sess_id
> SUSPEND_STATUS=""
> else
> node_stop_services
> fi
> fi
>
> #
> # Proxy termination
> #
>
> if stringinstring "Info: Waiting for a further signal to complete."
> "$line" then
> # Kill the proxy
> kill -HUP $PROXY_PID 2>/dev/null
> fi
>
> #
> # Session end
> #
>
> if stringinstring "Info: End of session requested by " "$line" && [
> "$RECONNECT" = "0" ] && ! stringinstring "'SIGHUP'" "$line" then
> echo "NX> 1009 Session status: terminating"
> kill -HUP $PROXY_PID 2>/dev/null
> fi
>
> #
> # Session is running
> #
>
> if stringinstring "Info: Waiting for connection from" "$line"
> then
> echo "NX> 710 Session status: running"
> echo "NX> 1002 Commit"
> echo "NX> 1006 Session status: running"
> fi
>
> #
> # Status = Running - Do _not_ fail anymore.
> #
>
> if stringinstring "Info: Connection with remote proxy established."
> "$line" then
> RUNNING=1
> fi
>
> #
> # Catch proxy pid
> #
>
> if stringinstring "Info: Proxy running in server mode with pid" "$line"
> then
> PROXY_PID=$(echo $line | cut -d"'" -f2)
> fi
>
> #
> # Reconnection success!
> #
>
> if stringinstring "Info: Reconnection succeded." "$line"
> then
> echo "NX> 718 Session restore succeded"
> if [ "$1" = "restore" ]
> then
> kill $TAIL_PID
> break
> fi
> fi
>
> #
> # Reconnection failure
> #
>
> if stringinstring "Info: Reconnection failed:" "$line"
> then
> echo "NX> 1005 Session status: suspended"
> echo "NX> 596 Error: Session restore failed. Reason was: $line"
> if [ "$1" = "restore" ]
> then
> kill $TAIL_PID
> break
> fi
> fi
>
> #
> # Error handling.
> #
>
> #if stringinstring "Error: Connection with remote host" "$line" && [
> "$RUNNING" = "0" ] #then
> # kill $TAIL_PID 2>/dev/null
> # echo "NX> 1004 Error:"
> # echo "Session '$sess_id' has failed after reaching usable state."
> # [ "$SESSION_LOG_CLEAN" = "1" ] && rm -rf
> $USER_FAKE_HOME/.nx/C-$sess_id/ # [ "$SESSION_LOG_CLEAN" = "1" ] || mv
> $USER_FAKE_HOME/.nx/C-$sess_id/ $USER_FAKE_HOME/.nx/F-C-$sess_id/ # break
> #fi
> done
>
> trap "" EXIT
>
> [ "$1" = "restore" ] || node_stop_services
> # close all open file descriptors
> exec 0<&-
> exec 1>&-
> exec 2>&-
> exit 0
> }
>
> node_start_monitor()
> {
> [ "$ENABLE_2_0_0_BACKEND" = "1" ] && node_start_monitor_2_0_0 "$@"
> [ "$ENABLE_2_0_0_BACKEND" = "1" ] || node_start_monitor_1_5_0 "$@"
> }
>
> node_startsession()
> {
>
> #
> user=knoppix&userip=192.168.1.66&uniqueid=6A8269CC467264EAEF6349D062689755&
>display=1000&session=lappi%5ffull&type=unix%2dkde&cache=8M&images=32M&cookie
>=84765070afee043cf83f85d21130145f&link=lan&render=1&backingstore=when_reques
>ted&imagecompressionmethod=0&geometry=fullscreen&keyboard=fr&media=0&samba=1
>&agent_server=&agent_user=&agent_password=
>
> user=$(getparam user)
> userip=$(getparam userip)
> uniqueid=$(getparam uniqueid)
> display=$(getparam display)
> session=$(getparam session)
> type=$(getparam type | sed 's/%2d/-/g')
> application=$(getparam application)
> cache=$(getparam cache)
> images=$(getparam images)
> cookie=$(getparam cookie)
> link=$(getparam link)
> virtualdesktop=$(getparam virtualdesktop)
> render=$(getparam render)
> backingstore=$(getparam backingstore)
> imagecompressionmethod=$(getparam imagecompressionmethod)
> imagecompressionlevel=$(getparam imagecompressionlevel)
> geometry=$(getparam geometry)
> keyboard=$(getparam keyboard)
> kbtype=$(getparam kbtype)
> media=$(getparam media)
> mediahelper=$(getparam mediahelper)
> sync=$(getparam sync)
> samba=$(getparam samba)
> cups=$(getparam cups)
> agent_server=$(getparam agent_server)
> agent_user=$(getparam agent_user)
> agent_password=$(getparam agent_password)
> agent_domain=$(getparam agent_domain)
> screeninfo=$(getparam screeninfo)
> nodelay=$(getparam nodelay)
> [ "$PROXY_TCP_NODELAY" = "0" ] && nodelay=0
>
> # 1.5.0 options
> rdpcolors=$(getparam rdpcolors)
> rdpcache=$(getparam rdpcache)
> http=$(getparam http)
>
> # nxclient > 1.5.0-106 variables
> resize=$(getparam resize)
> keybd=$(getparam keybd)
> kbload=$(getparam kbload)
> keymap=$(getparam keymap)
>
> rootless=0
> # Its still the clients decision
> [ "$ENABLE_ROOTLESS_MODE" = "1" ] && rootless=$(getparam rootless)
>
> # FreeNX specific variables
> clientproto=$(getparam clientproto)
> status=$(getparam status)
> host=$(getparam host)
>
> fullscreen=""
> [ "$geometry" = "fullscreen" ] && fullscreen="1"
>
> [ "$EXPORT_USERIP" = "1" ] && export NXUSERIP="$userip"
>
> ssl_tunnel=$(getparam encryption)
> [ -z "$ssl_tunnel" ] && ssl_tunnel=0
>
> if [ "$ssl_tunnel" = "1" ]
> then
> # we need to use the IP of the "calling" server now
> userip=$(echo $SSH_CLIENT $SSH2_CLIENT | cut -d" " -f1 | sed
> 's/::ffff://g') [ -z "$userip" ] && userip="127.0.0.1"
> [ -z "$userip" -a "$host" != "127.0.0.1" ] && userip="*"
> fi
>
> # ok, lets make the session dir first:
>
> sess_id="$SERVER_NAME-$display-$uniqueid"
> [ "$EXPORT_SESSIONID" = "1" ] && export NXSESSIONID="$sess_id"
>
> ##########################################################################
>############### # added by marcel at kraan.net added to the environment for
> printing non kde applications # this is not working in the add_printer
> function
> IPP_PORT=$(node_cupsd_get_port)
> export IPP_PORT
> ##########################################################################
>###############
>
> OLD_UMASK=$(umask)
> umask 0022
> mkdir -p $USER_FAKE_HOME
> umask 0077
> mkdir -p $USER_FAKE_HOME/.nx/C-$sess_id
> umask $OLD_UMASK
>
> #
> cache=8M,images=32M,pack=nopack,link=lan,type=unix-kde,cleanup=0,accept=192
>.168.1.66,cookie=E38A94A77F975443AF04EC911881B120,id=Knoppix-1000-6A8269CC46
>7264EAEF6349D062689755,samba=1,render=1:1000
>
> PACK=""
> [ -z "$imagecompressionlevel" ] && imagecompressionlevel="9"
>
> [ "$imagecompressionmethod" = "0" ] && PACK="pack=nopack,"
> [ "$imagecompressionmethod" = "1" ] &&
> PACK="pack=16m-jpeg-$imagecompressionlevel," [ "$imagecompressionmethod" =
> "2" ] && PACK="pack=16m-png-9,"
>
> proxy_cookie=$(echo $[$RANDOM*$RANDOM] | $COMMAND_MD5SUM | cut -d" " -f1)
>
> if [ "$clientproto" = "1.5.0" ]
> then
> # enable fake cookie authentication
> cookie=$proxy_cookie
> fi
>
> # write options file
> [ -z "$samba" ] && samba=0
> [ -z "$media" ] && media=0
> [ -z "$nodelay" ] && nodelay=1
>
> CACHE="cache=$cache,"
> [ -z "$cache" ] && CACHE=""
> IMAGES="images=$images,"
> [ -z "$images" ] && IMAGES=""
>
> ACCEPT="accept=$userip,"
> [ "$userip" = "*" ] && ACCEPT=""
>
> OLD_UMASK=$(umask)
> umask 0077
>
> cat << EOF > $USER_FAKE_HOME/.nx/C-$sess_id/options
> ${kbtype:+kbtype=$kbtype,}${kbload:+kbload=$kbload,}${keymap:+keymap=$keyma
>p,}${resize:+resize=$resize,}${CACHE}${IMAGES}${PACK}link=$link,nodelay=$nod
>elay,type=$type,cleanup=0,${ACCEPT}cookie=$proxy_cookie,id=$sess_id,samba=$s
>amba,media=$media${sync:+,sync=$sync}${cups:+,cups=$cups}${keybd:+,keybd=$ke
>ybd}${http:+,http=$http}${rdpcolors:+,rdpcolors=$rdpcolors}${rdpcache:+,rdpc
>ache=$rdpcache}${fullscreen:+,fullscreen=1}:$display EOF
> umask $OLD_UMASK
> #samba=$samba,
> #cache=$cache,images=$images,pack=nopack,link=$link,type=$type,cleanup=0,a
>ccept=$userip,cookie=$proxy_cookie,id=$sess_id
> #samba=$samba,media=$media,render=$render:$display
>
> # write xauth script file
>
> $COMMAND_XAUTH >/dev/null 2>&1 <<EOF
> add localhost:$display MIT-MAGIC-COOKIE-1 $cookie
> add unix:$display MIT-MAGIC-COOKIE-1 $cookie
> exit
> EOF
>
> $COMMAND_XAUTH -f "$USER_FAKE_HOME/.nx/C-$sess_id/authority" >/dev/null
> 2>&1 <<EOF add localhost:$display MIT-MAGIC-COOKIE-1 $cookie
> add unix:$display MIT-MAGIC-COOKIE-1 $cookie
> exit
> EOF
>
> mkdir -m700 $USER_FAKE_HOME/.nx/C-$sess_id/scripts/ 2>/dev/null || chmod
> 700 $USER_FAKE_HOME/.nx/C-$sess_id/scripts/
>
> cat << EOF >$USER_FAKE_HOME/.nx/C-$sess_id/scripts/authority
> remove localhost:$display
> remove unix:$display
> exit
> EOF
>
> if [ "$1" = "restore" ]
> then
> echo > $USER_FAKE_HOME/.nx/C-$sess_id/session
> sh -c 'echo "Info: tail -f running with pid '\'\$$\''."; exec tail -n1 -f
> '$USER_FAKE_HOME'/.nx/C-'$sess_id'/session' | node_start_monitor "$1"
> "$status" &
>
> MONITOR_PID=$!
> export MONITOR_PID
>
> mkdir -p $USER_FAKE_HOME/.nx/C-$sess_id/pids/
> echo "$MONITOR_PID" > $USER_FAKE_HOME/.nx/C-$sess_id/pids/monitor
>
> node_suspend_session $sess_id || { echo "Info: Reconnection failed: NX
> Agent process could not be found."
>
> >>$USER_FAKE_HOME'/.nx/C-'$sess_id'/session'; node_fail_restore_session; }
>
> else
> node_start_agent &
> node_start_applications &
> fi
>
> if which "$NODE_AUTOSTART" >/dev/null 2>&1
> then
> sess_id="$SERVER_NAME-$display-$uniqueid"
> # go into background immediately
> NXSESSIONID="$sess_id" DISPLAY=unix:$display "$NODE_AUTOSTART" "$1"
> >/dev/null 2>&1 & # dont't wait for this child!
> disown $!
> fi
>
> cat << EOF
> NX> 700 Session id: $sess_id
> NX> 705 Session display: $display
> NX> 703 Session type: $type
> NX> 701 Proxy cookie: $proxy_cookie
> NX> 702 Proxy IP: $userip
> NX> 706 Agent cookie: $cookie
> NX> 704 Session cache: $type
> NX> 707 SSL tunneling: $ssl_tunnel
> EOF
>
> # collection ...
>
> # NX> 1004 Error:
> #Session 'Knoppix-1000-40EFB9F64FA55C64C41C72CA39EBD720' has failed after
> reaching usable state. Session directory
> '/home/knoppix/.nx/F-C-Knoppix-1000-40EFB9F64FA55C64C41C72CA39EBD720' will
> be not deleted to allow for further investigation.
>
> if [ -n "$MONITOR_PID" ]
> then
> wait "$MONITOR_PID"
> rm -f $USER_FAKE_HOME/.nx/C-$sess_id/pids/monitor
> fi
> wait # for all children
> }
>
> cmd_node_terminate()
> {
> sessionid=$(getparam_sessionid)
> echo "NX> 716 Terminating session $sessionid on user request."
> display=$(cd $USER_FAKE_HOME/.nx/; echo C-$SERVER_NAME-*-$sessionid | rev
> |cut -d"-" -f2 |rev) node_terminate_session
> "$SERVER_NAME-$display-$sessionid"
> }
>
>
> cmd_node_suspend()
> {
> sessionid=$(getparam_sessionid)
> echo "NX> 716 Suspending session $sessionid on user request."
> display=$(cd $USER_FAKE_HOME/.nx/; echo C-$SERVER_NAME-*-$sessionid | rev
> | cut -d"-" -f2 |rev) node_suspend_session
> "$SERVER_NAME-$display-$sessionid"
> }
>
> cmd_node_smbmount()
> {
> sessionid=$(getparam_sessionid)
> port=$(getparam port)
> username=$(getparam username)
> password=$(getparam password)
> share=$(getparam share)
> computername=$(getparam computername)
> dir=$(getparam dir | sed 's|$(SHARES)|MyShares|g')
> rdir=$(getparam dir | sed 's|$(SHARES)/||g')
> display=$(cd $USER_FAKE_HOME/.nx/; echo C-$SERVER_NAME-*-$sessionid |
> rev|cut -d"-" -f2| rev) mkdir -p "$HOME/$dir"
>
> ##################### begin ##############
> sleep 7
> ERROR=$(PASSWD="$password" "$COMMAND_SMBMOUNT" "//$computername/$rdir"
> "$HOME/$dir" -o user="$username,ip=127.0.0.1,port=$port" 2>&1)
> #TEST="$COMMAND_SMBMOUNT //$computername/$rdir $HOME/$dir -o
> user=$username,pass=$password,ip=127.0.0.1,port=$port" 2>&1
> #$PATH_BIN/nxclient -dialog ok -caption "NXServer Message" -message "This
> command to mount: $TEST" -noautokill -display :$display & #exec $TEST;
> ##################### end #################
>
>
> if [ $? -eq 0 ]
> then
> $PATH_BIN/nxclient -dialog ok -caption "NXServer Message" -message "Info:
> Share: '//$computername/$rdir' mounted on: '$HOME/$dir'" -noautokill
> -display :$display &
> echo "$HOME/$dir" >>
> "$USER_FAKE_HOME/.nx/C-$SERVER_NAME-$display-$sessionid/scripts/mpoint"
> else
> $PATH_BIN/nxclient -dialog ok -caption "NXServer Message" -message "Info:
> Share: '//$computername/$rdir' failed to mount: $ERROR" -noautokill
> -display :$display &
> fi
> }
>
> cmd_node_addprinter()
> {
> sessionid=$(getparam_sessionid)
> type=$(getparam type)
> port=$(getparam port)
> username=$(getparam username)
> password=$(getparam password)
> share=$(getparam share)
> printer=$(getparam printer)
> computername=$(getparam computername)
> public=$(getparam public)
> model=$(getparam model)
> defaultPrinter=$(getparam defaultPrinter)
> display=$(cd $USER_FAKE_HOME/.nx/; echo C-$SERVER_NAME-*-$sessionid | rev
> | cut -d"-" -f2 | rev) sess_id="$SERVER_NAME-$display-$sessionid"
> # this will also setup the userspace cupsd
> IPP_PORT=$(node_cupsd_get_port)
> export IPP_PORT
>
> #################################################################
> # by marcel at kraan.net
> # get the server hostname cups printing could not via localhost
>
> if [ -f /etc/sysconfig/network ] ; then
> . /etc/sysconfig/network
> if [ "$NETWORKING" = "yes" ] ; then
> printhost="$HOSTNAME"
> else
> printhost="localhost"
> fi
> fi
>
> if [ "$type" = "smb" ]
> then
> DEVICE_URI="smb://$username:$password@$printhost:$port/$share"
> NAME="$share"
> else
> #DEVICE_URI="ipp://localhost:$port/printers/$printer"
> DEVICE_URI="ipp://$username:$password@$printhost:$port/printers/$printer"
> NAME="$printer"
> fi
> #MODEL=$($PATH_BIN/nxclient -printer "$NAME" -noautokill -display
> :$display) MODEL=$($PATH_BIN/nxclient -printer "$NAME" -display :$display)
> [ -z "$MODEL" -o "$MODEL" = "cancel: aborted" ] && return
>
> PUBLIC="-u allow:$USER"
> [ "$public" == "1" ] && PUBLIC=""
> /usr/sbin/lpadmin -p "$NAME" -E -v "$DEVICE_URI" -m "$MODEL" $PUBLIC
> [ "$defaultPrinter" = "1" ] && /usr/sbin/lpadmin -d "$NAME"
>
> #################################################################
> }
>
>
> case "$1" in
> --startsession)
> node_startsession
> ;;
> --resumesession)
> node_startsession "restore"
> ;;
> --terminate)
> cmd_node_terminate
> ;;
> --suspend)
> cmd_node_suspend
> ;;
> --smbmount)
> cmd_node_smbmount &>/dev/null </dev/null &
> ;;
> --addprinter)
> cmd_node_addprinter &>/dev/null </dev/null &
> ;;
> --check)
> echo "NX> 716 finished"
> ;;
> --agent)
> echo "NX> 716 Starting NX Agent ..."
> shift
> [ "$SET_LD_LIBRARY_PATH" = "1" ] && export
> LD_LIBRARY_PATH="$AGENT_LIBRARY_PATH:$LD_LIBRARY_PATH"
> PATH="$PATH:$PATH_BIN" $PATH_BIN/nxagent -name "NX Agent Test - Args: $@"
> $@ echo "NX> 716 NX Agent exited with status: $?"
> ;;
> --setkey)
> mkdir -m 700 -p $HOME/.ssh
> if ! grep -q "$(cat $NX_ETC_DIR/users.id_dsa.pub)"
> $HOME/.ssh/$SSH_AUTHORIZED_KEYS 2>/dev/null then
> cat $NX_ETC_DIR/users.id_dsa.pub >> $HOME/.ssh/$SSH_AUTHORIZED_KEYS
> chmod 600 $HOME/.ssh/$SSH_AUTHORIZED_KEYS
> echo "NX> 716 Public key added to: $HOME/.ssh/$SSH_AUTHORIZED_KEYS"
> else
> echo "NX> 716 Public key is already present in:
> $HOME/.ssh/$SSH_AUTHORIZED_KEYS" fi
> ;;
> *)
> echo "NX> 500 Error: Command not found"
> ;;
> esac
> echo "NX> 1001 Bye."
More information about the FreeNX-kNX
mailing list