All of lore.kernel.org
 help / color / mirror / Atom feed
From: acue <acue@i4p.de>
To: qemu-devel@nongnu.org
Cc: Xen Development Mailing List <xen-devel@lists.xensource.com>
Subject: Re: [Qemu-devel] vnc port selection
Date: Thu, 21 Aug 2008 16:34:29 +0200	[thread overview]
Message-ID: <48AD7CF5.30407@i4p.de> (raw)
In-Reply-To: <48ADA659.2030201@codemonkey.ws>

[-- Attachment #1: Type: text/plain, Size: 1793 bytes --]

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


[-- Attachment #2: getFirstFreeVNCPort.Linux.awk --]
[-- Type: text/plain, Size: 1202 bytes --]

########################################################################
#
#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<max{
    idx=$4-min;
    chk[idx]=$4;
}

END{
    l=max-min;
    for(i=0;i<l;i++){
        if(chk[i]==""){
            if(seed==0){break;}
            seed--;
            ptrace("skip("seed")="i);
        }
    }
    if(i<max){
        ptrace("result="i);
        printf("%d",min+i);
    }else{
        ptrace("result exceeds maximum("max")="i);
    }
}

[-- Attachment #3: getFirstFreeVNCPort.OpenBSD.awk --]
[-- Type: text/plain, Size: 1202 bytes --]

########################################################################
#
#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<max{
    idx=$4-min;
    chk[idx]=$4;
}

END{
    l=max-min;
    for(i=0;i<l;i++){
        if(chk[i]==""){
            if(seed==0){break;}
            seed--;
            ptrace("skip("seed")="i);
        }
    }
    if(i<max){
        ptrace("result="i);
        printf("%d",min+i);
    }else{
        ptrace("result exceeds maximum("max")="i);
    }
}

[-- Attachment #4: getFirstFreeVNCPort.SunOS.awk --]
[-- Type: text/plain, Size: 1202 bytes --]

########################################################################
#
#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<max{
    idx=$4-min;
    chk[idx]=$4;
}

END{
    l=max-min;
    for(i=0;i<l;i++){
        if(chk[i]==""){
            if(seed==0){break;}
            seed--;
            ptrace("skip("seed")="i);
        }
    }
    if(i<max){
        ptrace("result="i);
        printf("%d",min+i);
    }else{
        ptrace("result exceeds maximum("max")="i);
    }
}

[-- Attachment #5: hook --]
[-- Type: text/plain, Size: 19056 bytes --]

#!/bin/bash

########################################################################
#
#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_03_001b01
#
########################################################################
#
# Copyright (C) 2007 Arno-Can Uestuensoez (UnifiedSessionsManager.org)
#
########################################################################

VNC_MAGIC=VNC_GENERIC;
VNC_VERSTRING=;
VNC_STATE=DISABLED;
VNCSERVER_OPT=;
VNCVIEWER_OPT=;
VNC_PREREQ=;


export VNC_BASEPORT=${VNC_BASEPORT:-5900}

_myPKGNAME_VNC="${BASH_SOURCE}"
_myPKGVERS_VNC="01.02.001b01"
hookInfoAdd $_myPKGNAME_VNC $_myPKGVERS_VNC
_myPKGBASE_VNC="${_myPKGNAME_VNC%/hook}"


VNC_VERSTRING=${_myPKGVERS_VNC};
VNC_PREREQ="HOST-CAPABILITY:VNC-${VNC_VERSTRING}-${MYARCH}";


if [ -d "${HOME}/.ctys" -a -d "${HOME}/.ctys/vnc" ];then
    if [ -f "${HOME}/.ctys/vnc/vnc.conf.${MYOS}" ];then
	. "${HOME}/.ctys/vnc/vnc.conf.${MYOS}"
    fi
fi

if [ -d "${MYCONFPATH}" -a -d "${MYCONFPATH}/vnc" ];then
    if [ -f "${MYCONFPATH}/vnc/vnc.conf.${MYOS}" ];then
	. "${MYCONFPATH}/vnc/vnc.conf.${MYOS}"
    fi
fi



_waitcVNC=${VNC_INIT_WAITC:-2}
_waitsVNC=${VNC_INIT_WAITS:-2}



#FUNCBEG###############################################################
#NAME:
#  getFirstFreeVNCPort
#
#TYPE:
#  bash-function
#
#DESCRIPTION:
#  Gets the first free port above a given base, thus multiple regions
#  could be managed
#
#EXAMPLE:
#
#PARAMETERS:
#  $1: <MIN>
#  $2: [<MAX>]
#
#OUTPUT:
#  RETURN:
#  VALUES:
#    <first-port>
#
#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: <MIN>
#  $2: [<MAX>]
#
#OUTPUT:
#  RETURN:
#  VALUES:
#    <first-port>
#
#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}|<options-list>
#     Generally a string containing an <options-list>, 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}|<options-list>
#     Generally a string containing an <options-list>, 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: <OPMODE>
#  $2: <ACTION>
#
#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 <session-label>|<session-id>"
		      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
}

WARNING: multiple messages have this Message-ID (diff)
From: acue <acue@i4p.de>
To: qemu-devel@nongnu.org
Cc: Xen Development Mailing List <xen-devel@lists.xensource.com>
Subject: Re: vnc port selection
Date: Thu, 21 Aug 2008 16:34:29 +0200	[thread overview]
Message-ID: <48AD7CF5.30407@i4p.de> (raw)
In-Reply-To: <48ADA659.2030201@codemonkey.ws>

[-- Attachment #1: Type: text/plain, Size: 1793 bytes --]

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


[-- Attachment #2: getFirstFreeVNCPort.Linux.awk --]
[-- Type: text/plain, Size: 1202 bytes --]

########################################################################
#
#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<max{
    idx=$4-min;
    chk[idx]=$4;
}

END{
    l=max-min;
    for(i=0;i<l;i++){
        if(chk[i]==""){
            if(seed==0){break;}
            seed--;
            ptrace("skip("seed")="i);
        }
    }
    if(i<max){
        ptrace("result="i);
        printf("%d",min+i);
    }else{
        ptrace("result exceeds maximum("max")="i);
    }
}

[-- Attachment #3: getFirstFreeVNCPort.OpenBSD.awk --]
[-- Type: text/plain, Size: 1202 bytes --]

########################################################################
#
#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<max{
    idx=$4-min;
    chk[idx]=$4;
}

END{
    l=max-min;
    for(i=0;i<l;i++){
        if(chk[i]==""){
            if(seed==0){break;}
            seed--;
            ptrace("skip("seed")="i);
        }
    }
    if(i<max){
        ptrace("result="i);
        printf("%d",min+i);
    }else{
        ptrace("result exceeds maximum("max")="i);
    }
}

[-- Attachment #4: getFirstFreeVNCPort.SunOS.awk --]
[-- Type: text/plain, Size: 1202 bytes --]

########################################################################
#
#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<max{
    idx=$4-min;
    chk[idx]=$4;
}

END{
    l=max-min;
    for(i=0;i<l;i++){
        if(chk[i]==""){
            if(seed==0){break;}
            seed--;
            ptrace("skip("seed")="i);
        }
    }
    if(i<max){
        ptrace("result="i);
        printf("%d",min+i);
    }else{
        ptrace("result exceeds maximum("max")="i);
    }
}

[-- Attachment #5: hook --]
[-- Type: text/plain, Size: 19056 bytes --]

#!/bin/bash

########################################################################
#
#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_03_001b01
#
########################################################################
#
# Copyright (C) 2007 Arno-Can Uestuensoez (UnifiedSessionsManager.org)
#
########################################################################

VNC_MAGIC=VNC_GENERIC;
VNC_VERSTRING=;
VNC_STATE=DISABLED;
VNCSERVER_OPT=;
VNCVIEWER_OPT=;
VNC_PREREQ=;


export VNC_BASEPORT=${VNC_BASEPORT:-5900}

_myPKGNAME_VNC="${BASH_SOURCE}"
_myPKGVERS_VNC="01.02.001b01"
hookInfoAdd $_myPKGNAME_VNC $_myPKGVERS_VNC
_myPKGBASE_VNC="${_myPKGNAME_VNC%/hook}"


VNC_VERSTRING=${_myPKGVERS_VNC};
VNC_PREREQ="HOST-CAPABILITY:VNC-${VNC_VERSTRING}-${MYARCH}";


if [ -d "${HOME}/.ctys" -a -d "${HOME}/.ctys/vnc" ];then
    if [ -f "${HOME}/.ctys/vnc/vnc.conf.${MYOS}" ];then
	. "${HOME}/.ctys/vnc/vnc.conf.${MYOS}"
    fi
fi

if [ -d "${MYCONFPATH}" -a -d "${MYCONFPATH}/vnc" ];then
    if [ -f "${MYCONFPATH}/vnc/vnc.conf.${MYOS}" ];then
	. "${MYCONFPATH}/vnc/vnc.conf.${MYOS}"
    fi
fi



_waitcVNC=${VNC_INIT_WAITC:-2}
_waitsVNC=${VNC_INIT_WAITS:-2}



#FUNCBEG###############################################################
#NAME:
#  getFirstFreeVNCPort
#
#TYPE:
#  bash-function
#
#DESCRIPTION:
#  Gets the first free port above a given base, thus multiple regions
#  could be managed
#
#EXAMPLE:
#
#PARAMETERS:
#  $1: <MIN>
#  $2: [<MAX>]
#
#OUTPUT:
#  RETURN:
#  VALUES:
#    <first-port>
#
#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: <MIN>
#  $2: [<MAX>]
#
#OUTPUT:
#  RETURN:
#  VALUES:
#    <first-port>
#
#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}|<options-list>
#     Generally a string containing an <options-list>, 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}|<options-list>
#     Generally a string containing an <options-list>, 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: <OPMODE>
#  $2: <ACTION>
#
#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 <session-label>|<session-id>"
		      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
}

  reply	other threads:[~2008-08-21 17:37 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-21 16:37 [Qemu-devel] vnc port selection Gerd Hoffmann
2008-08-21 16:37 ` Gerd Hoffmann
2008-08-21 17:31 ` [Qemu-devel] " Anthony Liguori
2008-08-21 14:34   ` acue [this message]
2008-08-21 14:34     ` acue
2008-08-21 18:30 ` [Qemu-devel] " Avi Kivity
2008-08-21 18:35   ` Anthony Liguori
2008-08-21 19:53     ` [Xen-devel] " Daniel P. Berrange
2008-08-21 19:53       ` Daniel P. Berrange
2008-08-24  8:54     ` Avi Kivity
2008-08-24 10:01       ` Jamie Lokier
2008-08-24 10:01         ` Jamie Lokier
2008-08-26 10:15     ` [Xen-devel] Re: [Qemu-devel] " Ian Jackson
2008-08-26 10:15       ` Ian Jackson
2008-08-21 19:52   ` [Xen-devel] " Daniel P. Berrange
2008-08-21 19:52     ` Daniel P. Berrange

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48AD7CF5.30407@i4p.de \
    --to=acue@i4p.de \
    --cc=qemu-devel@nongnu.org \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.