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
}
next prev parent 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.