From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KWE64-0003R0-Ag for qemu-devel@nongnu.org; Thu, 21 Aug 2008 13:37:20 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KWE62-0003Qc-E6 for qemu-devel@nongnu.org; Thu, 21 Aug 2008 13:37:19 -0400 Received: from [199.232.76.173] (port=41265 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KWE62-0003QW-5f for qemu-devel@nongnu.org; Thu, 21 Aug 2008 13:37:18 -0400 Received: from smtp2.vianetworks.de ([212.168.16.99]:59373) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KWE60-0007up-Pu for qemu-devel@nongnu.org; Thu, 21 Aug 2008 13:37:18 -0400 Received: from deih30213528-03.berl1.eu.psigh.com (deih30213528-03.berl1.eu.psigh.com [62.50.36.18]) by smtp2.vianetworks.de (8.13.8/8.13.8) with ESMTP id m7LHb3eD079924 for ; Thu, 21 Aug 2008 19:37:05 +0200 (CEST) (envelope-from acue@i4p.de) Message-ID: <48AD7CF5.30407@i4p.de> Date: Thu, 21 Aug 2008 16:34:29 +0200 From: acue MIME-Version: 1.0 Subject: Re: [Qemu-devel] vnc port selection References: <48AD99CF.6070004@redhat.com> <48ADA659.2030201@codemonkey.ws> In-Reply-To: <48ADA659.2030201@codemonkey.ws> Content-Type: multipart/mixed; boundary="------------050609020706050001020104" Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Xen Development Mailing List This is a multi-part message in MIME format. --------------050609020706050001020104 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Anthony Liguori wrote: > Gerd Hoffmann wrote: >> Hi folks, >> >> Xen's qemu-dm version has a '-vncunused' command line switch which asks >> the internal vnc server to pick any unused tcp port to listen on. The >> actual port is communicated to the outside world via xenstore. >> >> I'm looking for a reasonable way to implement that functionality in >> upstream qemu. First, I think it shouldn't be a separate command line >> switch but an option for the existion -vnc switch. > > Maybe something like a to=N option. So you would have: > > -vnc localhost:0,to=10 > > That would try from displays 0 to 10 and select the first one it could > attach to. > >> Second, we need a >> way to communicate the port picked which isn't xen-specific. Obvious >> choice is a monitor info subcommand. >> > > There's already an info vnc. It can be added to that. > > Regards, > > Anthony Liguori > >> Comments? Other suggestions? >> >> cheers, >> Gerd >> >> > > > > Hello Gerd, Even though currently it is a bash+awk solution the algorithm could be of interest for you. It works on Linux+OpenBSD+Solaris and accepts MIN and MAX value for the port. An aditional seed-value is added for slowly-released ports for immediate access. I use different ranges particularly in order to distinguish displayforwarding and "clientforwarding". Thus one range for local vncviewer access by OpenSSH with "-X" option, another for forwarded remote vncviewer access by OpenSSH tunnels with port-forwarding. The files are available at http:/sourceforge.net/projects/ctys with the directory path: ctys.01_07_001b04/plugins/VNC Arno -- ---------------------------------------------------------------------------- Arno-Can Uestuensoez www.i4p.de / www.i4p.com --------------050609020706050001020104 Content-Type: text/plain; name="getFirstFreeVNCPort.Linux.awk" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="getFirstFreeVNCPort.Linux.awk" ######################################################################## # #PROJECT: Unified Sessions Manager #AUTHOR: Arno-Can Uestuensoez - acue@UnifiedSessionsManager.org #MAINTAINER: Arno-Can Uestuensoez - acue_sf1@sourceforge.net #SHORT: ctys #CALLFULLNAME: Commutate To Your Session #LICENCE: GPL3 #VERSION: 01_06_001a10 # ######################################################################## # # Copyright (C) 2007 Arno-Can Uestuensoez (UnifiedSessionsManager.org) # ######################################################################## function ptrace(inp){ if(!d){ print line ":" inp | "cat 1>&2" } } BEGIN{ ptrace("awk:getFirstFreeVNCPort"); ptrace("min ="min); ptrace("max ="max); ptrace("seed="seed); chk[0]=""; } { gsub("^[0-9.]*:+","",$4); } $4>min&&$4&2" } } BEGIN{ ptrace("awk:getFirstFreeVNCPort"); ptrace("min ="min); ptrace("max ="max); ptrace("seed="seed); chk[0]=""; } { gsub("^[0-9.]*:+","",$4); } $4>min&&$4&2" } } BEGIN{ ptrace("awk:getFirstFreeVNCPort"); ptrace("min ="min); ptrace("max ="max); ptrace("seed="seed); chk[0]=""; } { gsub("^[0-9.]*:+","",$4); } $4>min&&$4 # $2: [] # #OUTPUT: # RETURN: # VALUES: # # #FUNCEND############################################################### function getFirstFreeVNCPort () { printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:CALL=<${*}>" local MIN=${1:-$VNC_BASEPORT}; local MAX=$2; [ -z "$MAX" ]&&let MAX=MIN+1000; local _seed=$((RANDOM%VNCPORTSEED)); doDebug $S_XEN ${D_MAINT} $LINENO $BASH_SOURCE local D=$? printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:MIN=${MIN} MAX=${MAX} seed=${_seed}" case ${MYOS} in Linux) local localClientAccess=`${CTYS_NETSTAT} -n -l -t|awk -v d="${D}" -v min="${MIN}" -v max="${MAX}" -v seed="${_seed}" -f ${_myPKGBASE_VNC}/getFirstFreeVNCPort.${MYOS}.awk` ;; OpenBSD) local localClientAccess=`${CTYS_NETSTAT} -n -l -t|awk -v d="${D}" -v min="${MIN}" -v max="${MAX}" -v seed="${_seed}" -f ${_myPKGBASE_VNC}/getFirstFreeVNCPort.${MYOS}.awk` ;; SunOS) local localClientAccess=`${CTYS_NETSTAT} -n -l -t|awk -v d="${D}" -v min="${MIN}" -v max="${MAX}" -v seed="${_seed}" -f ${_myPKGBASE_VNC}/getFirstFreeVNCPort.${MYOS}.awk` ;; esac printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:localClientAccess=<${localClientAccess}>" echo -n -e "${localClientAccess}"; } #FUNCBEG############################################################### #NAME: # getFirstFreeVNCDisplay # #TYPE: # bash-function # #DESCRIPTION: # Gets the first free display above a given base, thus multiple regions # could be managed # #EXAMPLE: # #PARAMETERS: # $1: # $2: [] # #OUTPUT: # RETURN: # VALUES: # # #FUNCEND############################################################### function getFirstFreeVNCDisplay () { printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:CALL=<${*}>" local MIN=${1:-$VNC_BASEPORT}; local MAX=$2; [ -z "$MAX" ]&&let MAX=VNC_PORT+1000; printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:MIN=${MIN} MAX=${MAX}" local _myPort=`getFirstFreeVNCPort ${@}` local _myDisplay=$((_myPort-MIN)); printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:_myPort=<${_myPort}>" printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:_myDisplay=<${_myDisplay}>" echo -n -e "${_myDisplay}"; } #FUNCBEG############################################################### #NAME: # serverRequireVNC # #TYPE: # bash-function # #DESCRIPTION: # Reports whether a server component has to be called for the current # action. # #EXAMPLE: # #PARAMETERS: # $*: ${EXECCALL}| # Generally a string containing an , where the # first match is choosen. So only one type option is allowed to # be contained. # #OUTPUT: # RETURN: # INPUT, where required changes for destination are set. # VALUES: # 0: true, required - output is valid. # 1: false, not required - output is not valid. # #FUNCEND############################################################### function serverRequireVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME \$@=$@" local _ret=1; local _res=; local _S=`getSessionType ${*}`;_S=${_S:-$C_SESSIONTYPE}; local _A=`getActionResulting ${*}`; case $_A in GETCLIENTPORT) printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_res=\"${*}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_ret=\"0\"" echo -n "${*}"; return 0 ;; esac local _CS_SPLIT=${*}; _CS_SPLIT=${_CS_SPLIT//CONNECTIONFORWARDING/SERVERONLY} _CS_SPLIT=${_CS_SPLIT//*LOCALONLY*/} _CS_SPLIT=${_CS_SPLIT//*CLIENTONLY*/} if [ -n "${_CS_SPLIT}" ];then _res="${_CS_SPLIT}";_ret=0; fi printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_CS_SPLIT=\"${_CS_SPLIT}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_S=\"${_S}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_A=\"${_A}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_res=\"${_res}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_ret=\"${_ret}\"" echo -n "${_res}"; return ${_ret}; } #FUNCBEG############################################################### #NAME: # clientRequireVNC # #TYPE: # bash-function # #DESCRIPTION: # Reports whether a client component has to be called for the current # action. # #EXAMPLE: # #PARAMETERS: # $*: ${EXECCALL}| # Generally a string containing an , where the # first match is choosen. So only one type option is allowed to # be contained. # #OUTPUT: # RETURN: # INPUT, where required changes for destination are set. # VALUES: # 0: true, required - output is valid. # 1: false, not required - output is not valid. # #FUNCEND############################################################### function clientRequireVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME \$@=$@" local _ret=1; local _res=; local _A=`getActionResulting ${*}`; local _S=`getSessionType ${*}`;_S=${_S:-$C_SESSIONTYPE}; local _CS_SPLIT=${*}; _CS_SPLIT=${_CS_SPLIT//*DISPLAYFORWARDING*/} _CS_SPLIT=${_CS_SPLIT//*SERVERONLY*/} if [ "${_CS_SPLIT}" == "${*}" ];then _res="${_CS_SPLIT}";_ret=0; fi printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_CS_SPLIT=\"${_CS_SPLIT}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_S=\"${_S}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_A=\"${_A}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_res=\"${_res}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_ret=\"${_ret}\"" echo -n "${_res}"; return ${_ret}; } #FUNCBEG############################################################### #NAME: # setVersionVNC # #TYPE: # bash-function # #DESCRIPTION: # Sets defaults and MAGIC-ID for local vmware version. # #EXAMPLE: # #PARAMETERS: # # #OUTPUT: # GLOBALS: # VNC_MAGIC: {VNC_REAL412|VNC_TIGHT129|...} # Value to be checked. # # VMW_DEFAULTOPTS # Appropriate defaults. # # -RealVNC - 4.1.2 # -TightVNC - 1.2.9 # # RETURN: # # VALUES: # #FUNCEND############################################################### function setVersionVNC () { local _checkonly=; local _ret=0; if [ "$1" == "NOEXIT" ];then local _checkonly=1; fi local _verstrg=; if [ -z "${VNCSEXE}" ];then ABORT=2; printERR $LINENO $BASH_SOURCE ${ABORT} "Missing executable for VNCserver" printERR $LINENO $BASH_SOURCE ${ABORT} "can not find:" printERR $LINENO $BASH_SOURCE ${ABORT} " -> vncserv" printERR $LINENO $BASH_SOURCE ${ABORT} "" printERR $LINENO $BASH_SOURCE ${ABORT} "Check your PATH" printERR $LINENO $BASH_SOURCE ${ABORT} " -> PATH=${PATH}" printERR $LINENO $BASH_SOURCE ${ABORT} "" if [ "${C_SESSIONTYPE}" == "VNC" -a -z "${_checkonly}" ];then gotoHell ${ABORT} else return ${ABORT} fi _ret=${ABORT}; else local _vsexe=`${VNCSEXE} --help 2>&1|egrep '(Usage:|usage:)'` ABORT=2; if [ -n "$_vsexe" ];then printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCSEXE} --help)\"` => [ `setSeverityColor INF OK` ]" _ret=0; else printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCSEXE} --help)\"` => [ `setSeverityColor ERR NOK` ]" _ret=${ABORT}; fi fi if [ -z "${VNCVEXE}" ];then ABORT=2 printERR $LINENO $BASH_SOURCE ${ABORT} "Missing executable for VNCviewer" printERR $LINENO $BASH_SOURCE ${ABORT} "can not find:" printERR $LINENO $BASH_SOURCE ${ABORT} " -> vncviewer" printERR $LINENO $BASH_SOURCE ${ABORT} "" printERR $LINENO $BASH_SOURCE ${ABORT} "Check your PATH" printERR $LINENO $BASH_SOURCE ${ABORT} " -> PATH=${PATH}" printERR $LINENO $BASH_SOURCE ${ABORT} "" if [ "${C_SESSIONTYPE}" == "VNC" -a -z "${_checkonly}" ];then gotoHell ${ABORT} else return ${ABORT} fi _ret=${ABORT}; fi if [ -n "`${VNCVEXE} --help 2>&1|egrep '(RealVNC)'`" ];then # _verstrg=`${VNCVEXE} --help 2>&1|awk '/VNC [Vv]iewer/{printf("%s\n",$5);}'` _verstrg=`${VNCVEXE} --help 2>&1|sed -n 's/VNC [Vv]iewer[^0-9]*\([0-9]*.[0-9]*.[0-9]*\).*/\1/p'` ABORT=2; if [ -n "$_verstrg" ];then _verstrg="RealVNC-${_verstrg}" printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} -version)\"` => [ `setSeverityColor INF OK` ]" _ret=0; else printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} --version)\"` => [ `setSeverityColor ERR NOK` ]" _ret=${ABORT}; fi else if [ -n "`${VNCVEXE} --help 2>&1|egrep '(TightVNC)'`" ];then _verstrg=`${VNCVEXE} --help 2>&1|awk -v a=${_allign} '/[vV]iewer [vV]ersion/{printf("%s\n",$4);}'` ABORT=2; if [ -n "$_verstrg" ];then _verstrg="TightVNC-${_verstrg}" printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} -version)\"` => [ `setSeverityColor INF OK` ]" _ret=0; else printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} --version)\"` => [ `setSeverityColor ERR NOK` ]" _ret=${ABORT}; fi else if [ -n "`${VNCVEXE} --help 2>&1|egrep '(open display:)'`" ];then printWNG 1 $LINENO $BASH_SOURCE 0 "DISPLAY is not available" printWNG 1 $LINENO $BASH_SOURCE 0 " 1. One common cause is the call of \"ssh\" without the \"-X\"" printWNG 1 $LINENO $BASH_SOURCE 0 " option. Even for the utilized check by \"vncviewer --help\" " printWNG 1 $LINENO $BASH_SOURCE 0 " option a display is required." _verstrg=GENERIC _ret=0; else printWNG 1 $LINENO $BASH_SOURCE 0 "Can not evaluate version for \"which-ed\" vncviewer." printWNG 1 $LINENO $BASH_SOURCE 0 "." printWNG 1 $LINENO $BASH_SOURCE 0 " 1. One common cause is the call of \"ssh\" without the \"-X\"" printWNG 1 $LINENO $BASH_SOURCE 0 " option. Even for the utilized check by \"vncviewer --help\" " printWNG 1 $LINENO $BASH_SOURCE 0 " option a display is required." printWNG 1 $LINENO $BASH_SOURCE 0 " 2. Another common cause for the initial usage is the missing " printWNG 1 $LINENO $BASH_SOURCE 0 " permission \"X11Forwarding yes\" in \"/etc/ssh/sshd_conf\"." _verstrg=GENERIC _ret=0; fi fi fi printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE " _verstrg=${_verstrg}" #currently somewhat restrictive to specific versions. case ${_verstrg} in "TightVNC"*) VNC_MAGIC=VNCT; VNC_STATE=ENABLED; VNC_PREREQ="${VNC_PREREQ}%${_verstrg}-${MYARCH} vncserver,vncviewer"; VNCSERVER_OPT="${VNCSERVER_OPT_TightVNC}"; VNCVIEWER_OPT="${VNCVIEWER_OPT_TightVNC}"; _ret=0; ;; "RealVNC"*) VNC_MAGIC=VNCR; VNC_STATE=ENABLED; VNC_PREREQ="${VNC_PREREQ}%${_verstrg}-${MYARCH} vncserver,vncviewer"; VNCSERVER_OPT="${VNCSERVER_OPT_RealVNC}"; VNCVIEWER_OPT="${VNCVIEWER_OPT_RealVNC}"; _ret=0; ;; *) VNC_MAGIC=VNCG; VNCSERVER_OPT="${VNCSERVER_OPT_GENERIC}"; VNCVIEWER_OPT="${VNCVIEWER_OPT_GENERIC}"; VNC_PREREQ="${VNC_PREREQ}%${_verstrg}-${MYARCH}"; _ret=2; ;; esac printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_MAGIC = ${VNC_MAGIC}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_VERSTRING = ${VNC_VERSTRING}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_STATE = ${VNC_STATE}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_PREREQ = ${VNC_PREREQ}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNCSERVER_OPT = ${VNCSERVER_OPT}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNCVIEWER_OPT = ${VNCVIEWER_OPT}" return $_ret; } #FUNCBEG############################################################### #NAME: # noClientServerSplitSupportedMessageVNC # #TYPE: # bash-function # #DESCRIPTION: # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # VALUES: # #FUNCEND############################################################### function noClientServerSplitSupportedMessageVNC () { ABORT=2 printERR $LINENO $BASH_SOURCE ${ABORT} "Unexpected ERROR!!!" printERR $LINENO $BASH_SOURCE ${ABORT} "VNC perfectly supports ClientServerSplit!!!" printERR $LINENO $BASH_SOURCE ${ABORT} "Check for process ownership, probably just missing permissions." printERR $LINENO $BASH_SOURCE ${ABORT} "On grave slow machines just a timeout may have occured." printERR $LINENO $BASH_SOURCE ${ABORT} "Try a following connect, if so adapt TIMEOUT value, but for this target only." } #FUNCBEG############################################################### #NAME: # clientServerSplitSupportedVNC # #TYPE: # bash-function # #DESCRIPTION: # Checks whether the split of client and server is supported. # This is just a hardcoded attribute. # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # 0: If supported # 1: else # # VALUES: # #FUNCEND############################################################### function clientServerSplitSupportedVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME $1" case $1 in CREATE)return 0;; CANCEL)return 0;; esac return 1; } #FUNCBEG############################################################### #NAME: # enumerateMySessionsVNC # #TYPE: # bash-function # #DESCRIPTION: # Not supported. # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # VALUES: # #FUNCEND############################################################### function enumerateMySessionsVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:\$@=${@}" } # #Managed load of sub-packages gwhich are required in almost any case. #On-demand-loads will be performed within requesting action. # hookPackage "${_myPKGBASE_VNC}/session" hookPackage "${_myPKGBASE_VNC}/list" hookPackage "${_myPKGBASE_VNC}/info" if [ -d "${HOME}/.ctys" -a -d "${HOME}/.ctys/vnc" ];then #Source pre-set environment from user if [ -f "${HOME}/.ctys/vnc/vnc.conf" ];then . "${HOME}/.ctys/vnc/vnc.conf" fi #Source pre-set environment from installation if [ -f "${MYCONFPATH}/vnc/vnc/cli.conf" ];then . "${MYCONFPATH}/conf/vnc/vnc.conf" fi fi #FUNCBEG############################################################### #NAME: # handleVNC # #TYPE: # bash-function # #DESCRIPTION: # #EXAMPLE: # #PARAMETERS: # $1: # $2: # #OUTPUT: # RETURN: # # VALUES: # #FUNCEND############################################################### function handleVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "${FUNCNAME}:$*" local OPMODE=$1;shift local ACTION=$1;shift case ${ACTION} in CREATE) case ${OPMODE} in PROLOGUE) ;; EPILOGUE) ;; CHECKPARAM|ASSEMBLE|EXECUTE) hookPackage "${_myPKGBASE_VNC}/create" createConnectVNC ${OPMODE} ${ACTION} ;; esac ;; CANCEL) case ${OPMODE} in PROLOGUE) ;; EPILOGUE) ;; CHECKPARAM|ASSEMBLE|EXECUTE) hookPackage "${_myPKGBASE_VNC}/cancel" cutCancelSessionVNC ${OPMODE} ${ACTION} ;; esac ;; GETCLIENTPORT) case ${OPMODE} in PROLOGUE) ;; EPILOGUE) ;; CHECKPARAM) if [ -n "$C_MODE_ARGS" ];then printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "C_MODE_ARGS=$C_MODE_ARGS" _C_GETCLIENTPORT=$C_MODE_ARGS else ABORT=1 printERR $LINENO $BASH_SOURCE ${ABORT} "Missing |" gotoHell ${ABORT} fi ;; EXECUTE) printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "Remote command:C_MODE_ARGS=${C_MODE_ARGS}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "CLIENTPORT(VNC,${MYHOST},${_C_GETCLIENTPORT})=`getClientTPVNC ${_C_GETCLIENTPORT}`" echo "CLIENTPORT(VNC,${MYHOST},${_C_GETCLIENTPORT})=`getClientTPVNC ${_C_GETCLIENTPORT}`" gotoHell 0 ;; ASSEMBLE) ;; esac ;; *) #SUSPEND|RESUME|RESET ABORT=1; printERR $LINENO $BASH_SOURCE ${ABORT} "System Error, unsupported ACTION for VNC:ACTION=${ACTION} OPMODE=${OPMODE}" ;; esac } #FUNCBEG############################################################### #NAME: # initVNC # #TYPE: # bash-function # #DESCRIPTION: # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # # VALUES: # #FUNCEND############################################################### function initVNC () { local _curInit=$1;shift local _initConsequences=$1 local ret=0; local _raise=$((INITSTATE<_curInit)); printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:${INITSTATE} -> ${_curInit} - ${_raise}" if [ "$_raise" == "1" ];then #for raise of INITSTATE do not touch the OS's decisions, just expand. case $_curInit in 0);;#NOP - Done by shell 1) #add own help to searchlist for options MYOPTSFILES="${MYOPTSFILES} ${MYHELPPATH}/010_vnc" setVersionVNC $_initConsequences ret=$? ;; 2);; 3);; 4);; 5);; 6);; esac else case $_curInit in *);; esac fi return $ret } --------------050609020706050001020104-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: acue Subject: Re: vnc port selection Date: Thu, 21 Aug 2008 16:34:29 +0200 Message-ID: <48AD7CF5.30407@i4p.de> References: <48AD99CF.6070004@redhat.com> <48ADA659.2030201@codemonkey.ws> Reply-To: qemu-devel@nongnu.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050609020706050001020104" Return-path: In-Reply-To: <48ADA659.2030201@codemonkey.ws> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org Errors-To: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org To: qemu-devel@nongnu.org Cc: Xen Development Mailing List List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------050609020706050001020104 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Anthony Liguori wrote: > Gerd Hoffmann wrote: >> Hi folks, >> >> Xen's qemu-dm version has a '-vncunused' command line switch which asks >> the internal vnc server to pick any unused tcp port to listen on. The >> actual port is communicated to the outside world via xenstore. >> >> I'm looking for a reasonable way to implement that functionality in >> upstream qemu. First, I think it shouldn't be a separate command line >> switch but an option for the existion -vnc switch. > > Maybe something like a to=N option. So you would have: > > -vnc localhost:0,to=10 > > That would try from displays 0 to 10 and select the first one it could > attach to. > >> Second, we need a >> way to communicate the port picked which isn't xen-specific. Obvious >> choice is a monitor info subcommand. >> > > There's already an info vnc. It can be added to that. > > Regards, > > Anthony Liguori > >> Comments? Other suggestions? >> >> cheers, >> Gerd >> >> > > > > Hello Gerd, Even though currently it is a bash+awk solution the algorithm could be of interest for you. It works on Linux+OpenBSD+Solaris and accepts MIN and MAX value for the port. An aditional seed-value is added for slowly-released ports for immediate access. I use different ranges particularly in order to distinguish displayforwarding and "clientforwarding". Thus one range for local vncviewer access by OpenSSH with "-X" option, another for forwarded remote vncviewer access by OpenSSH tunnels with port-forwarding. The files are available at http:/sourceforge.net/projects/ctys with the directory path: ctys.01_07_001b04/plugins/VNC Arno -- ---------------------------------------------------------------------------- Arno-Can Uestuensoez www.i4p.de / www.i4p.com --------------050609020706050001020104 Content-Type: text/plain; name="getFirstFreeVNCPort.Linux.awk" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="getFirstFreeVNCPort.Linux.awk" ######################################################################## # #PROJECT: Unified Sessions Manager #AUTHOR: Arno-Can Uestuensoez - acue@UnifiedSessionsManager.org #MAINTAINER: Arno-Can Uestuensoez - acue_sf1@sourceforge.net #SHORT: ctys #CALLFULLNAME: Commutate To Your Session #LICENCE: GPL3 #VERSION: 01_06_001a10 # ######################################################################## # # Copyright (C) 2007 Arno-Can Uestuensoez (UnifiedSessionsManager.org) # ######################################################################## function ptrace(inp){ if(!d){ print line ":" inp | "cat 1>&2" } } BEGIN{ ptrace("awk:getFirstFreeVNCPort"); ptrace("min ="min); ptrace("max ="max); ptrace("seed="seed); chk[0]=""; } { gsub("^[0-9.]*:+","",$4); } $4>min&&$4&2" } } BEGIN{ ptrace("awk:getFirstFreeVNCPort"); ptrace("min ="min); ptrace("max ="max); ptrace("seed="seed); chk[0]=""; } { gsub("^[0-9.]*:+","",$4); } $4>min&&$4&2" } } BEGIN{ ptrace("awk:getFirstFreeVNCPort"); ptrace("min ="min); ptrace("max ="max); ptrace("seed="seed); chk[0]=""; } { gsub("^[0-9.]*:+","",$4); } $4>min&&$4 # $2: [] # #OUTPUT: # RETURN: # VALUES: # # #FUNCEND############################################################### function getFirstFreeVNCPort () { printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:CALL=<${*}>" local MIN=${1:-$VNC_BASEPORT}; local MAX=$2; [ -z "$MAX" ]&&let MAX=MIN+1000; local _seed=$((RANDOM%VNCPORTSEED)); doDebug $S_XEN ${D_MAINT} $LINENO $BASH_SOURCE local D=$? printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:MIN=${MIN} MAX=${MAX} seed=${_seed}" case ${MYOS} in Linux) local localClientAccess=`${CTYS_NETSTAT} -n -l -t|awk -v d="${D}" -v min="${MIN}" -v max="${MAX}" -v seed="${_seed}" -f ${_myPKGBASE_VNC}/getFirstFreeVNCPort.${MYOS}.awk` ;; OpenBSD) local localClientAccess=`${CTYS_NETSTAT} -n -l -t|awk -v d="${D}" -v min="${MIN}" -v max="${MAX}" -v seed="${_seed}" -f ${_myPKGBASE_VNC}/getFirstFreeVNCPort.${MYOS}.awk` ;; SunOS) local localClientAccess=`${CTYS_NETSTAT} -n -l -t|awk -v d="${D}" -v min="${MIN}" -v max="${MAX}" -v seed="${_seed}" -f ${_myPKGBASE_VNC}/getFirstFreeVNCPort.${MYOS}.awk` ;; esac printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:localClientAccess=<${localClientAccess}>" echo -n -e "${localClientAccess}"; } #FUNCBEG############################################################### #NAME: # getFirstFreeVNCDisplay # #TYPE: # bash-function # #DESCRIPTION: # Gets the first free display above a given base, thus multiple regions # could be managed # #EXAMPLE: # #PARAMETERS: # $1: # $2: [] # #OUTPUT: # RETURN: # VALUES: # # #FUNCEND############################################################### function getFirstFreeVNCDisplay () { printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:CALL=<${*}>" local MIN=${1:-$VNC_BASEPORT}; local MAX=$2; [ -z "$MAX" ]&&let MAX=VNC_PORT+1000; printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:MIN=${MIN} MAX=${MAX}" local _myPort=`getFirstFreeVNCPort ${@}` local _myDisplay=$((_myPort-MIN)); printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:_myPort=<${_myPort}>" printDBG $S_LIB ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:_myDisplay=<${_myDisplay}>" echo -n -e "${_myDisplay}"; } #FUNCBEG############################################################### #NAME: # serverRequireVNC # #TYPE: # bash-function # #DESCRIPTION: # Reports whether a server component has to be called for the current # action. # #EXAMPLE: # #PARAMETERS: # $*: ${EXECCALL}| # Generally a string containing an , where the # first match is choosen. So only one type option is allowed to # be contained. # #OUTPUT: # RETURN: # INPUT, where required changes for destination are set. # VALUES: # 0: true, required - output is valid. # 1: false, not required - output is not valid. # #FUNCEND############################################################### function serverRequireVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME \$@=$@" local _ret=1; local _res=; local _S=`getSessionType ${*}`;_S=${_S:-$C_SESSIONTYPE}; local _A=`getActionResulting ${*}`; case $_A in GETCLIENTPORT) printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_res=\"${*}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_ret=\"0\"" echo -n "${*}"; return 0 ;; esac local _CS_SPLIT=${*}; _CS_SPLIT=${_CS_SPLIT//CONNECTIONFORWARDING/SERVERONLY} _CS_SPLIT=${_CS_SPLIT//*LOCALONLY*/} _CS_SPLIT=${_CS_SPLIT//*CLIENTONLY*/} if [ -n "${_CS_SPLIT}" ];then _res="${_CS_SPLIT}";_ret=0; fi printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_CS_SPLIT=\"${_CS_SPLIT}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_S=\"${_S}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_A=\"${_A}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_res=\"${_res}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_ret=\"${_ret}\"" echo -n "${_res}"; return ${_ret}; } #FUNCBEG############################################################### #NAME: # clientRequireVNC # #TYPE: # bash-function # #DESCRIPTION: # Reports whether a client component has to be called for the current # action. # #EXAMPLE: # #PARAMETERS: # $*: ${EXECCALL}| # Generally a string containing an , where the # first match is choosen. So only one type option is allowed to # be contained. # #OUTPUT: # RETURN: # INPUT, where required changes for destination are set. # VALUES: # 0: true, required - output is valid. # 1: false, not required - output is not valid. # #FUNCEND############################################################### function clientRequireVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME \$@=$@" local _ret=1; local _res=; local _A=`getActionResulting ${*}`; local _S=`getSessionType ${*}`;_S=${_S:-$C_SESSIONTYPE}; local _CS_SPLIT=${*}; _CS_SPLIT=${_CS_SPLIT//*DISPLAYFORWARDING*/} _CS_SPLIT=${_CS_SPLIT//*SERVERONLY*/} if [ "${_CS_SPLIT}" == "${*}" ];then _res="${_CS_SPLIT}";_ret=0; fi printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_CS_SPLIT=\"${_CS_SPLIT}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_S=\"${_S}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "_A=\"${_A}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_res=\"${_res}\"" printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:_ret=\"${_ret}\"" echo -n "${_res}"; return ${_ret}; } #FUNCBEG############################################################### #NAME: # setVersionVNC # #TYPE: # bash-function # #DESCRIPTION: # Sets defaults and MAGIC-ID for local vmware version. # #EXAMPLE: # #PARAMETERS: # # #OUTPUT: # GLOBALS: # VNC_MAGIC: {VNC_REAL412|VNC_TIGHT129|...} # Value to be checked. # # VMW_DEFAULTOPTS # Appropriate defaults. # # -RealVNC - 4.1.2 # -TightVNC - 1.2.9 # # RETURN: # # VALUES: # #FUNCEND############################################################### function setVersionVNC () { local _checkonly=; local _ret=0; if [ "$1" == "NOEXIT" ];then local _checkonly=1; fi local _verstrg=; if [ -z "${VNCSEXE}" ];then ABORT=2; printERR $LINENO $BASH_SOURCE ${ABORT} "Missing executable for VNCserver" printERR $LINENO $BASH_SOURCE ${ABORT} "can not find:" printERR $LINENO $BASH_SOURCE ${ABORT} " -> vncserv" printERR $LINENO $BASH_SOURCE ${ABORT} "" printERR $LINENO $BASH_SOURCE ${ABORT} "Check your PATH" printERR $LINENO $BASH_SOURCE ${ABORT} " -> PATH=${PATH}" printERR $LINENO $BASH_SOURCE ${ABORT} "" if [ "${C_SESSIONTYPE}" == "VNC" -a -z "${_checkonly}" ];then gotoHell ${ABORT} else return ${ABORT} fi _ret=${ABORT}; else local _vsexe=`${VNCSEXE} --help 2>&1|egrep '(Usage:|usage:)'` ABORT=2; if [ -n "$_vsexe" ];then printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCSEXE} --help)\"` => [ `setSeverityColor INF OK` ]" _ret=0; else printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCSEXE} --help)\"` => [ `setSeverityColor ERR NOK` ]" _ret=${ABORT}; fi fi if [ -z "${VNCVEXE}" ];then ABORT=2 printERR $LINENO $BASH_SOURCE ${ABORT} "Missing executable for VNCviewer" printERR $LINENO $BASH_SOURCE ${ABORT} "can not find:" printERR $LINENO $BASH_SOURCE ${ABORT} " -> vncviewer" printERR $LINENO $BASH_SOURCE ${ABORT} "" printERR $LINENO $BASH_SOURCE ${ABORT} "Check your PATH" printERR $LINENO $BASH_SOURCE ${ABORT} " -> PATH=${PATH}" printERR $LINENO $BASH_SOURCE ${ABORT} "" if [ "${C_SESSIONTYPE}" == "VNC" -a -z "${_checkonly}" ];then gotoHell ${ABORT} else return ${ABORT} fi _ret=${ABORT}; fi if [ -n "`${VNCVEXE} --help 2>&1|egrep '(RealVNC)'`" ];then # _verstrg=`${VNCVEXE} --help 2>&1|awk '/VNC [Vv]iewer/{printf("%s\n",$5);}'` _verstrg=`${VNCVEXE} --help 2>&1|sed -n 's/VNC [Vv]iewer[^0-9]*\([0-9]*.[0-9]*.[0-9]*\).*/\1/p'` ABORT=2; if [ -n "$_verstrg" ];then _verstrg="RealVNC-${_verstrg}" printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} -version)\"` => [ `setSeverityColor INF OK` ]" _ret=0; else printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} --version)\"` => [ `setSeverityColor ERR NOK` ]" _ret=${ABORT}; fi else if [ -n "`${VNCVEXE} --help 2>&1|egrep '(TightVNC)'`" ];then _verstrg=`${VNCVEXE} --help 2>&1|awk -v a=${_allign} '/[vV]iewer [vV]ersion/{printf("%s\n",$4);}'` ABORT=2; if [ -n "$_verstrg" ];then _verstrg="TightVNC-${_verstrg}" printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} -version)\"` => [ `setSeverityColor INF OK` ]" _ret=0; else printDBG $S_LIB ${D_SYS} $LINENO "$BASH_SOURCE" "$FUNCNAME:`setSeverityColor TRY \"call(${VNCVEXE} --version)\"` => [ `setSeverityColor ERR NOK` ]" _ret=${ABORT}; fi else if [ -n "`${VNCVEXE} --help 2>&1|egrep '(open display:)'`" ];then printWNG 1 $LINENO $BASH_SOURCE 0 "DISPLAY is not available" printWNG 1 $LINENO $BASH_SOURCE 0 " 1. One common cause is the call of \"ssh\" without the \"-X\"" printWNG 1 $LINENO $BASH_SOURCE 0 " option. Even for the utilized check by \"vncviewer --help\" " printWNG 1 $LINENO $BASH_SOURCE 0 " option a display is required." _verstrg=GENERIC _ret=0; else printWNG 1 $LINENO $BASH_SOURCE 0 "Can not evaluate version for \"which-ed\" vncviewer." printWNG 1 $LINENO $BASH_SOURCE 0 "." printWNG 1 $LINENO $BASH_SOURCE 0 " 1. One common cause is the call of \"ssh\" without the \"-X\"" printWNG 1 $LINENO $BASH_SOURCE 0 " option. Even for the utilized check by \"vncviewer --help\" " printWNG 1 $LINENO $BASH_SOURCE 0 " option a display is required." printWNG 1 $LINENO $BASH_SOURCE 0 " 2. Another common cause for the initial usage is the missing " printWNG 1 $LINENO $BASH_SOURCE 0 " permission \"X11Forwarding yes\" in \"/etc/ssh/sshd_conf\"." _verstrg=GENERIC _ret=0; fi fi fi printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE " _verstrg=${_verstrg}" #currently somewhat restrictive to specific versions. case ${_verstrg} in "TightVNC"*) VNC_MAGIC=VNCT; VNC_STATE=ENABLED; VNC_PREREQ="${VNC_PREREQ}%${_verstrg}-${MYARCH} vncserver,vncviewer"; VNCSERVER_OPT="${VNCSERVER_OPT_TightVNC}"; VNCVIEWER_OPT="${VNCVIEWER_OPT_TightVNC}"; _ret=0; ;; "RealVNC"*) VNC_MAGIC=VNCR; VNC_STATE=ENABLED; VNC_PREREQ="${VNC_PREREQ}%${_verstrg}-${MYARCH} vncserver,vncviewer"; VNCSERVER_OPT="${VNCSERVER_OPT_RealVNC}"; VNCVIEWER_OPT="${VNCVIEWER_OPT_RealVNC}"; _ret=0; ;; *) VNC_MAGIC=VNCG; VNCSERVER_OPT="${VNCSERVER_OPT_GENERIC}"; VNCVIEWER_OPT="${VNCVIEWER_OPT_GENERIC}"; VNC_PREREQ="${VNC_PREREQ}%${_verstrg}-${MYARCH}"; _ret=2; ;; esac printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_MAGIC = ${VNC_MAGIC}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_VERSTRING = ${VNC_VERSTRING}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_STATE = ${VNC_STATE}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNC_PREREQ = ${VNC_PREREQ}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNCSERVER_OPT = ${VNCSERVER_OPT}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "VNCVIEWER_OPT = ${VNCVIEWER_OPT}" return $_ret; } #FUNCBEG############################################################### #NAME: # noClientServerSplitSupportedMessageVNC # #TYPE: # bash-function # #DESCRIPTION: # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # VALUES: # #FUNCEND############################################################### function noClientServerSplitSupportedMessageVNC () { ABORT=2 printERR $LINENO $BASH_SOURCE ${ABORT} "Unexpected ERROR!!!" printERR $LINENO $BASH_SOURCE ${ABORT} "VNC perfectly supports ClientServerSplit!!!" printERR $LINENO $BASH_SOURCE ${ABORT} "Check for process ownership, probably just missing permissions." printERR $LINENO $BASH_SOURCE ${ABORT} "On grave slow machines just a timeout may have occured." printERR $LINENO $BASH_SOURCE ${ABORT} "Try a following connect, if so adapt TIMEOUT value, but for this target only." } #FUNCBEG############################################################### #NAME: # clientServerSplitSupportedVNC # #TYPE: # bash-function # #DESCRIPTION: # Checks whether the split of client and server is supported. # This is just a hardcoded attribute. # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # 0: If supported # 1: else # # VALUES: # #FUNCEND############################################################### function clientServerSplitSupportedVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME $1" case $1 in CREATE)return 0;; CANCEL)return 0;; esac return 1; } #FUNCBEG############################################################### #NAME: # enumerateMySessionsVNC # #TYPE: # bash-function # #DESCRIPTION: # Not supported. # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # VALUES: # #FUNCEND############################################################### function enumerateMySessionsVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "$FUNCNAME:\$@=${@}" } # #Managed load of sub-packages gwhich are required in almost any case. #On-demand-loads will be performed within requesting action. # hookPackage "${_myPKGBASE_VNC}/session" hookPackage "${_myPKGBASE_VNC}/list" hookPackage "${_myPKGBASE_VNC}/info" if [ -d "${HOME}/.ctys" -a -d "${HOME}/.ctys/vnc" ];then #Source pre-set environment from user if [ -f "${HOME}/.ctys/vnc/vnc.conf" ];then . "${HOME}/.ctys/vnc/vnc.conf" fi #Source pre-set environment from installation if [ -f "${MYCONFPATH}/vnc/vnc/cli.conf" ];then . "${MYCONFPATH}/conf/vnc/vnc.conf" fi fi #FUNCBEG############################################################### #NAME: # handleVNC # #TYPE: # bash-function # #DESCRIPTION: # #EXAMPLE: # #PARAMETERS: # $1: # $2: # #OUTPUT: # RETURN: # # VALUES: # #FUNCEND############################################################### function handleVNC () { printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "${FUNCNAME}:$*" local OPMODE=$1;shift local ACTION=$1;shift case ${ACTION} in CREATE) case ${OPMODE} in PROLOGUE) ;; EPILOGUE) ;; CHECKPARAM|ASSEMBLE|EXECUTE) hookPackage "${_myPKGBASE_VNC}/create" createConnectVNC ${OPMODE} ${ACTION} ;; esac ;; CANCEL) case ${OPMODE} in PROLOGUE) ;; EPILOGUE) ;; CHECKPARAM|ASSEMBLE|EXECUTE) hookPackage "${_myPKGBASE_VNC}/cancel" cutCancelSessionVNC ${OPMODE} ${ACTION} ;; esac ;; GETCLIENTPORT) case ${OPMODE} in PROLOGUE) ;; EPILOGUE) ;; CHECKPARAM) if [ -n "$C_MODE_ARGS" ];then printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "C_MODE_ARGS=$C_MODE_ARGS" _C_GETCLIENTPORT=$C_MODE_ARGS else ABORT=1 printERR $LINENO $BASH_SOURCE ${ABORT} "Missing |" gotoHell ${ABORT} fi ;; EXECUTE) printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "Remote command:C_MODE_ARGS=${C_MODE_ARGS}" printDBG $S_VNC ${D_BULK} $LINENO $BASH_SOURCE "CLIENTPORT(VNC,${MYHOST},${_C_GETCLIENTPORT})=`getClientTPVNC ${_C_GETCLIENTPORT}`" echo "CLIENTPORT(VNC,${MYHOST},${_C_GETCLIENTPORT})=`getClientTPVNC ${_C_GETCLIENTPORT}`" gotoHell 0 ;; ASSEMBLE) ;; esac ;; *) #SUSPEND|RESUME|RESET ABORT=1; printERR $LINENO $BASH_SOURCE ${ABORT} "System Error, unsupported ACTION for VNC:ACTION=${ACTION} OPMODE=${OPMODE}" ;; esac } #FUNCBEG############################################################### #NAME: # initVNC # #TYPE: # bash-function # #DESCRIPTION: # #EXAMPLE: # #PARAMETERS: # #OUTPUT: # RETURN: # # VALUES: # #FUNCEND############################################################### function initVNC () { local _curInit=$1;shift local _initConsequences=$1 local ret=0; local _raise=$((INITSTATE<_curInit)); printDBG $S_VNC ${D_MAINT} $LINENO $BASH_SOURCE "$FUNCNAME:${INITSTATE} -> ${_curInit} - ${_raise}" if [ "$_raise" == "1" ];then #for raise of INITSTATE do not touch the OS's decisions, just expand. case $_curInit in 0);;#NOP - Done by shell 1) #add own help to searchlist for options MYOPTSFILES="${MYOPTSFILES} ${MYHELPPATH}/010_vnc" setVersionVNC $_initConsequences ret=$? ;; 2);; 3);; 4);; 5);; 6);; esac else case $_curInit in *);; esac fi return $ret } --------------050609020706050001020104--