This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch release/4.0.1.x in repository x2goserver. from c072251 x2goserver/bin/x2gostartagent: use x2goagent.port_randomization configuration value. new 9079d15 x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. new c597b3d x2goserver/bin/x2gostartagent: update copyright notice. new 0da0c2c x2goserver/bin/x2gostartagent: fix most shellcheck warnings, whitespace errors, use more quotes and curly braces. new 4877f5e x2goserver/bin/x2gostartagent: drop obsolete X2GO_BIN environment variable usage. new 98e48fe x2goserver/bin/x2gostartagent: make shellcheck happy by referencing "${SAVED_DISPLAY}" once. new 5c1e0b2 x2goserver/bin/x2gostartagent: checking for the exit status of a variable assignment isn't helping us in finding out if x2goagent is still running. new 369a0b5 x2goserver/bin/x2gostartagent: replace perl call with bash pattern substitution. new 6ae7c4f x2goserver/bin/x2gostartagent: some shells do not handle quotes in pattern substitutions gracefully. new a26de65 x2goserver/lib: new script x2gogetfreeport, consists of duplicated functionality in x2gostartagent. new 9297f6b x2goserver/lib: new script x2gogetrandomport, contains the port randomization (or pseudo-randomization) features that are part of x2gostartagent, but need to be accessible by other scripts as well. new 455a4d7 x2goserver/bin/x2gostartagent: remove spurious semicolon and add quotes on the lib path line. new 56dd4b6 x2goserver/bin/x2gostartagent: start using x2gogetrandomport, delete now-duplicate code. new f97cd4b x2goserver/bin/x2gostartagent: fix return code that should have been zero, indicating success. new 6b0488c x2goserver/bin/x2goresume-session: remove spurious semicolon and add quotes on the lib path line. new d4d954b x2goserver/bin/x2goresume-session: properly randomize first port, just like in x2gostartagent. new 7a76b29 x2goserver/bin/x2go{startagent,resume-session}: use x2gogetfreeport instead of duplicating the same code everywhere. Fixes: #1230. new daa6a6a x2goserver/bin/x2gostartagent: fix hostname detection. new fdd8a9d x2goserver/bin/x2goresume-session: fix shellcheck warnings, use bash-style tests, more quotes, curly braces, wrap literal strings in single quotes, avoid useless constructs, fix whitespace errors and probably more. new 9de1883 x2goserver/bin/x2gostartagent: use single quotes for literal strings, bash-style checks, more curly braces, terminate options for commands that use outside input (variables), fix copyright notice. new 2c18015 x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. new 0b5bae4 x2goserver/lib/x2gogetfreeport: use error code 1 for general failure, shift parameter sanitization failure codes up. new 3748fe5 x2goserver/lib: new script x2gocheckport, containing common functionality for port checking. new 1ec6d63 x2goserver/lib/x2gogetfreeport: check start and end paramters in a stricter fashion. new a837685 x2goserver/lib/x2gogetfreeport: use the check_*_port functions, require current host name as a parameter and adapt x2gogetfreeport usages accordingly. new 4da317d x2goserver/bin/x2goresume-session: actually check if the old port values have been refurbished within the system and reassign them. new 6fe6d68 x2goserver/bin/x2goresume-ression: whitespace fix only. new 9cb67ac x2goserver/bin/x2gostartagent: check and adapt exit codes. The 27 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Summary of changes: debian/changelog | 66 ++++ x2goserver/bin/x2goresume-session | 386 +++++++++++------------ x2goserver/bin/x2gostartagent | 625 ++++++++++++++++---------------------- x2goserver/lib/x2gocheckport | 280 +++++++++++++++++ x2goserver/lib/x2gogetfreeport | 98 ++++++ x2goserver/lib/x2gogetrandomport | 120 ++++++++ 6 files changed, 1023 insertions(+), 552 deletions(-) create mode 100644 x2goserver/lib/x2gocheckport create mode 100755 x2goserver/lib/x2gogetfreeport create mode 100755 x2goserver/lib/x2gogetrandomport -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 9079d151c3fa32fc455362780614dd006c5be172 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 20:08:21 2018 +0100 x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. --- debian/changelog | 1 + x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index abaa2da..9f52781 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,7 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium configuration value. Currently only a value of "host-based" is directly mapped to the host-based algorithm, while any other value (or a failure of failure) are mapped to the "pure-random" code path. + - x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 15e44ee..a092b9e 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -65,7 +65,7 @@ get_random_port() { X2GO_LIB_PATH="$(x2gopath libexec)"; -$X2GO_LIB_PATH/x2gosyslog "$0" "info" "$(basename $0) called with options: $@" +$X2GO_LIB_PATH/x2gosyslog "$0" "info" "$(basename $0) called with options: ${*}" # Refer to x2goserver.conf. -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit c597b3d141586d61793a995e482fd543ab6fa625 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 20:11:58 2018 +0100 x2goserver/bin/x2gostartagent: update copyright notice. --- debian/changelog | 1 + x2goserver/bin/x2gostartagent | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 9f52781..cdc82dc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,7 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium mapped to the host-based algorithm, while any other value (or a failure of failure) are mapped to the "pure-random" code path. - x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. + - x2goserver/bin/x2gostartagent: update copyright notice. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index a092b9e..8622f60 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2007-2015 X2Go Project - http://wiki.x2go.org +# Copyright (C) 2007-20157 X2Go Project - http://wiki.x2go.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,8 +17,8 @@ # Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # -# Copyright (C) 2007-2015 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> -# Copyright (C) 2007-2015 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> +# Copyright (C) 2007-2017 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> +# Copyright (C) 2007-2017 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> # rnowotny, <rnowotny@rotek.at> # Patch for SSH_PORT, to not use the same SSH port on each server, which is a -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 0da0c2c84f578b54383a397f6bad87b764977f73 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 2 03:18:17 2018 +0100 x2goserver/bin/x2gostartagent: fix most shellcheck warnings, whitespace errors, use more quotes and curly braces. --- debian/changelog | 2 + x2goserver/bin/x2gostartagent | 425 +++++++++++++++++++++--------------------- 2 files changed, 213 insertions(+), 214 deletions(-) diff --git a/debian/changelog b/debian/changelog index cdc82dc..aba7586 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,6 +15,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium of failure) are mapped to the "pure-random" code path. - x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. - x2goserver/bin/x2gostartagent: update copyright notice. + - x2goserver/bin/x2gostartagent: fix most shellcheck warnings, whitespace + errors, use more quotes and curly braces. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 8622f60..c13f5b4 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -42,7 +42,7 @@ get_server_ip_address() { typeset src_address="$(grep -oe 'src[[:space:]]\{1,\}\(\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}\)' <<< "${ip_output}" | sed -e 's/src[[:space:]]\{1,\}//')" if [ -n "${src_address}" ]; then - printf "${src_address}" + printf '%s' "${src_address}" return "0" fi @@ -57,66 +57,66 @@ get_random_port() { # Or maybe not. RANDOM="${unix_timestamp}" - typeset -i random_port="$((30000 + ${RANDOM}))" - printf "${random_port}" + typeset -i random_port="$((30000 + RANDOM))" + printf '%s' "${random_port}" - exit 0 + return "0" } X2GO_LIB_PATH="$(x2gopath libexec)"; -$X2GO_LIB_PATH/x2gosyslog "$0" "info" "$(basename $0) called with options: ${*}" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "$(basename "${0}") called with options: ${*}" # Refer to x2goserver.conf. typeset -i randomize_ssh_port="1" typeset randomize_ssh_port_config_value='' -randomize_ssh_port_config_value="$(${X2GO_LIB_PATH}/x2goqueryconfig "x2goagent" "port_randomization")" +randomize_ssh_port_config_value="$("${X2GO_LIB_PATH}/x2goqueryconfig" "x2goagent" "port_randomization")" # Failures or incorrect values are implicitly caught by the default value. [[ "${randomize_ssh_port_config_value}" = "host-based" ]] && randomize_ssh_port='0' if [ "${randomize_ssh_port}" = "1" ]; then - ${X2GO_LIB_PATH}/x2gosyslog "$0" "debug" "Full SSH port randomization requested." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "Full SSH port randomization requested." SSH_PORT="$(get_random_port)" else - ${X2GO_LIB_PATH}/x2gosyslog "$0" "debug" "host-based SSH port initialization requested." - typeset ip_address="$(get_server_ip_address)" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "host-based SSH port initialization requested." + typeset ip_address='' - if [ "$?" = "0" ]; then + if ip_address="$(get_server_ip_address)"; then typeset -i ip_address_last_octet="${ip_address##*.}" - SSH_PORT="$((30000 + (${ip_address_last_octet} * 128)))" + SSH_PORT="$((30000 + (ip_address_last_octet * 128)))" else - ${X2GO_LIB_PATH}/x2gosyslog "$0" "warning" "IP-based SSH port initialization requested, but failed to fetch primary address." - ${X2GO_LIB_PATH}/x2gosyslog "$0" "warning" "Falling back to randomization." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "IP-based SSH port initialization requested, but failed to fetch primary address." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "Falling back to randomization." SSH_PORT="$(get_random_port)" fi fi -X2GO_PORT=49 #First port for X2GO=50 +X2GO_PORT="49" #First port for X2GO=50 # some sanity checks before session startup... -if egrep "^backend[ ]*=[ ]*postgres" /etc/x2go/x2gosql/sql 1>/dev/null 2>/dev/null && [ "x$USER" = "xroot" ]; then +if grep -E "^backend[ ]*=[ ]*postgres" "/etc/x2go/x2gosql/sql" 1>"/dev/null" 2>"/dev/null" && [ "x${USER}" = "xroot" ]; then msg="The super-user \"root\" is not allowed to launch X2Go sessions." - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -1 -elif [ -z "$USER" ]; then + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + exit "1" +elif [ -z "${USER}" ]; then msg="The \$USER environment variable is not set. Aborting session startup." - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -2 -elif [ -z "$HOME" ]; then + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + exit "2" +elif [ -z "${HOME}" ]; then msg="The \$HOME environment variable is not set. Aborting session startup." - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -4 -elif ! echo $HOME | iconv -f ASCII -t ASCII 1>/dev/null 2>/dev/null; then + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + exit "3" +elif ! iconv -f ASCII -t ASCII &>"/dev/null" <<< "${HOME}"; then msg="Your home directory path contains non-ASCII characters. Aborting session startup." - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -5 + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + exit "4" fi # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this @@ -131,163 +131,162 @@ fi # # Workaround: use hostname. typeset current_host_name="" -current_host_name="$(hostname)" -if [[ "${?}" -ne "0" ]]; then +if current_host_name="$(hostname)"; then typeset msg="Unable to retrieve machine's hostname. This is required. Aborting session startup." "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit 1 + exit "5" fi X2GO_ROOT="${HOME}/.x2go" -export NX_ROOT=$X2GO_ROOT +export NX_ROOT="${X2GO_ROOT}" X2GO_NXAGENT_DEFAULT_OPTIONS="-extension GLX -nolisten tcp" -if [ -r /etc/x2go/x2goagent.options ]; then - source /etc/x2go/x2goagent.options +if [ -r "/etc/x2go/x2goagent.options" ]; then + source "/etc/x2go/x2goagent.options" fi -if [ -z "$X2GO_NXAGENT_OPTIONS" ]; then - X2GO_NXAGENT_OPTIONS="$X2GO_NXAGENT_DEFAULT_OPTIONS" +if [ -z "${X2GO_NXAGENT_OPTIONS}" ]; then + X2GO_NXAGENT_OPTIONS="${X2GO_NXAGENT_DEFAULT_OPTIONS}" fi -REMOTE=localhost +REMOTE="localhost" # shadow sessions (via x2godesktopsharing) set the X2GO_CLIENT var in the process environment # so either it is already set or we obtain it from SSH_CLIENT/SSH_CONNECTION -if [ -z "$X2GO_CLIENT" ] && [ -n "$SSH_CLIENT" ]; then - X2GO_CLIENT=`echo $SSH_CLIENT | awk '{print $1}'` -elif [ -z "$X2GO_CLIENT" ] && [ -n "$SSH_CONNECTION" ]; then - X2GO_CLIENT=`echo $SSH_CONNECTION | awk '{print $1}'` +if [ -z "${X2GO_CLIENT}" ] && [ -n "${SSH_CLIENT}" ]; then + X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CLIENT}")" +elif [ -z "${X2GO_CLIENT}" ] && [ -n "${SSH_CONNECTION}" ]; then + X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CONNECTION}")" fi -if [ -z "$X2GO_CLIENT" ]; then +if [ -z "${X2GO_CLIENT}" ]; then msg="The \$X2GO_CLIENT environment variable is not set. Possible reasons: \$SSH_CLIENT not set or \$SSH_CONNECTION not set. Or \$X2GO_CLIENT not set by ,,X2Go Desktop Sharing'' applet. Aborting session startup." - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -3 + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + exit "6" fi -$X2GO_LIB_PATH/x2gosyslog "$0" "debug" "client announced itself as ,,$X2GO_CLIENT''" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "client announced itself as ,,${X2GO_CLIENT}''" -X2GO_GEOMETRY="$1"; shift -X2GO_LINK="$1"; shift -X2GO_PACK="$1"; shift -X2GO_TYPE="$1"; shift -X2GO_KBD_LAYOUT="$1"; shift -X2GO_KBD_TYPE="$1"; shift -X2GO_SET_KBD="$1"; shift -X2GO_STYPE="$1"; shift -X2GO_CMD="$1"; shift -X2GO_RESIZE=1 -X2GO_FULLSCREEN=0 +X2GO_GEOMETRY="${1}"; shift +X2GO_LINK="${1}"; shift +X2GO_PACK="${1}"; shift +X2GO_TYPE="${1}"; shift +X2GO_KBD_LAYOUT="${1}"; shift +X2GO_KBD_TYPE="${1}"; shift +X2GO_SET_KBD="${1}"; shift +X2GO_STYPE="${1}"; shift +X2GO_CMD="${1}"; shift +X2GO_RESIZE="1" +X2GO_FULLSCREEN="0" X2GO_CLIPBOARD="" -XAUTHORITY=${XAUTHORITY:-"$HOME/.Xauthority"} +: "${XAUTHORITY:="${HOME}/.Xauthority"}" -if [ "$X2GO_STYPE" == "S" ]; then +if [ "${X2GO_STYPE}" == "S" ]; then - SHADOW_MODE=`echo $X2GO_CMD |awk '{split($0,a,"XSHAD"); print a[1]}'` - SHADOW_USER=`echo $X2GO_CMD |awk '{split($0,a,"XSHAD"); print a[2]}'` - SHADOW_DESKTOP=`echo $X2GO_CMD |awk '{split($0,a,"XSHAD"); print a[3]}'` + SHADOW_MODE="$(awk '{split($0,a,"XSHAD"); print a[1]}' <<< "${X2GO_CMD}")" + SHADOW_USER="$(awk '{split($0,a,"XSHAD"); print a[2]}' <<< "${X2GO_CMD}")" + SHADOW_DESKTOP="$(awk '{split($0,a,"XSHAD"); print a[3]}' <<< "${X2GO_CMD}")" - if [ -z "$1" ]; then + if [ -z "${1}" ]; then # can this line be removed? - #echo "suser $SHADOW_USER user $USER " >> /tmp/uagent + #echo "suser ${SHADOW_USER} user ${USER} " >>"/tmp/uagent" - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "shadow session requested: mode $SHADOW_MODE, user: $SHADOW_USER, desktop: $SHADOW_DESKTOP" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "shadow session requested: mode ${SHADOW_MODE}, user: ${SHADOW_USER}, desktop: ${SHADOW_DESKTOP}" else - SHADREQ_USER="$1"; shift - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "preparing shadow session request for user $SHADREQ_USER, agent starts for user ${USER}" + SHADREQ_USER="${1}"; shift + "${X2GO_LIB_PATH}/x2gosyslog" "$0" "debug" "preparing shadow session request for user ${SHADREQ_USER}, agent starts for user ${USER}" fi - if [ "$SHADOW_USER" != "$USER" ]; then + if [ "${SHADOW_USER}" != "${USER}" ]; then - $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "user ,,$USER'' requests desktop sharing from user ,,$SHADOW_USER'' for desktop ,,$SHADOW_DESKTOP''" - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "executing command: x2godesktopsharing client $X2GO_CLIENT $X2GO_GEOMETRY $X2GO_LINK $X2GO_PACK $X2GO_TYPE $X2GO_KBD_LAYOUT $X2GO_KBD_TYPE $X2GO_SET_KBD $X2GO_STYPE $X2GO_CMD $USER" - OUTPUT=`x2godesktopsharing client "$X2GO_CLIENT" "$X2GO_GEOMETRY" "$X2GO_LINK" "$X2GO_PACK" "$X2GO_TYPE" "$X2GO_KBD_LAYOUT" "$X2GO_KBD_TYPE" "$X2GO_SET_KBD" "$X2GO_STYPE" "$X2GO_CMD" "$USER"` - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "command result is: $OUTPUT" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "user ,,${USER}'' requests desktop sharing from user ,,${SHADOW_USER}'' for desktop ,,${SHADOW_DESKTOP}''" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "executing command: x2godesktopsharing client ${X2GO_CLIENT} ${X2GO_GEOMETRY} ${X2GO_LINK} ${X2GO_PACK} ${X2GO_TYPE} ${X2GO_KBD_LAYOUT} ${X2GO_KBD_TYPE} ${X2GO_SET_KBD} ${X2GO_STYPE} ${X2GO_CMD} ${USER}" + OUTPUT="$(x2godesktopsharing "client" "${X2GO_CLIENT}" "${X2GO_GEOMETRY}" "${X2GO_LINK}" "${X2GO_PACK}" "${X2GO_TYPE}" "${X2GO_KBD_LAYOUT}" "${X2GO_KBD_TYPE}" "${X2GO_SET_KBD}" "${X2GO_STYPE}" "${X2GO_CMD}" "${USER}")" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "command result is: ${OUTPUT}" if [ "${OUTPUT:0:4}" == "DENY" ]; then - echo "ACCESS DENIED" 1>&2 + echo "ACCESS DENIED" >&2 DENIAL_REASON="${OUTPUT:5}" - if [ -z "$DENIAL_REASON" ]; then - DENIAL_REASON="the user ,,$SHADOW_USER'' does not seem to have desktop sharing activated" + if [ -z "${DENIAL_REASON}" ]; then + DENIAL_REASON="the user ,,${SHADOW_USER}'' does not seem to have desktop sharing activated" fi - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "ERROR: user $SHADOW_USER denied desktop sharing session" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" - exit -1 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: user ${SHADOW_USER} denied desktop sharing session" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" + exit "7" fi - X2GO_COOKIE=`echo $OUTPUT | awk '{print $2}'` - X2GO_PORT=`echo $OUTPUT | awk '{print $1}'` - - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "received shadow session information: cookie: $X2GO_COOKIE, port: $X2GO_PORT" - xauth -f "$XAUTHORITY" add "${current_host_name}/unix:${X2GO_PORT}" MIT-MAGIC-COOKIE-1 "${X2GO_COOKIE}" - xauth -f "$XAUTHORITY" add "${current_host_name}:${X2GO_PORT}" MIT-MAGIC-COOKIE-1 "${X2GO_COOKIE}" - - echo $X2GO_PORT - echo $X2GO_COOKIE - echo $OUTPUT | awk '{print $3}' - echo $OUTPUT | awk '{print $4}' - echo $OUTPUT | awk '{print $5}' - echo $OUTPUT | awk '{print $6}' - echo $OUTPUT | awk '{print $7}' - exit 0 + X2GO_COOKIE="$(awk '{print $2}' <<< "${OUTPUT}")" + X2GO_PORT="$(awk '{print $1}' <<< "${OUTPUT}")" + + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "received shadow session information: cookie: ${X2GO_COOKIE}, port: ${X2GO_PORT}" + xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" + xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" + + echo "${X2GO_PORT}" + echo "${X2GO_COOKIE}" + awk '{print $3}' <<< "${OUTPUT}" + awk '{print $4}' <<< "${OUTPUT}" + awk '{print $5}' <<< "${OUTPUT}" + awk '{print $6}' <<< "${OUTPUT}" + awk '{print $7}' <<< "${OUTPUT}" + exit "8" else - X2GO_CLIPBOARD="$1"; shift + X2GO_CLIPBOARD="${1}"; shift fi fi -LIMIT=`x2gosessionlimit` -LWORD=`echo $LIMIT | awk '{print $1}'` +LIMIT="$(x2gosessionlimit)" +LWORD="$(awk '{print $1}' <<< "${LIMIT}")" -if [ "$LWORD" == "LIMIT" ]; then - echo $LIMIT 1>&2 - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "session limit has been reached for user ,,$USER'', cannot start new session" - exit -1 +if [ "${LWORD}" == "LIMIT" ]; then + echo "${LIMIT}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "session limit has been reached for user ,,${USER}'', cannot start new session" + exit "9" fi -export NX_CLIENT="$X2GO_LIB_PATH/x2gosuspend-agent" +export NX_CLIENT="${X2GO_LIB_PATH}/x2gosuspend-agent" -COLORDEPTH=`echo $X2GO_TYPE | awk '{split($0,a,"-depth_"); print a[2]}'` +COLORDEPTH="$(awk '{split($0,a,"-depth_"); print a[2]}' <<< "${X2GO_TYPE}")" SESSION_TYPE="D" NOEXITPARAM="" -if [ "$X2GO_STYPE" == "R" ]; then +if [ "${X2GO_STYPE}" == "R" ]; then SESSION_TYPE="R" -elif [ "$X2GO_STYPE" == "P" ]; then +elif [ "${X2GO_STYPE}" == "P" ]; then SESSION_TYPE="R" NOEXITPARAM="-norootlessexit" -elif [ "$X2GO_STYPE" == "S" ]; then +elif [ "${X2GO_STYPE}" == "S" ]; then SESSION_TYPE="S" fi -if [ "$X2GO_CLIENT" == "" ]; then +if [ -z "${X2GO_CLIENT}" ]; then X2GO_CLIENT="${current_host_name}" fi # define the full path to the ss utility -ss=$(PATH="$PATH:/usr/sbin:/sbin" type -P ss); +ss="$(PATH="${PATH}:/usr/sbin:/sbin" type -P "ss")" -while [ "$OUTPUT" != "inserted" ]; do +while [ "${OUTPUT}" != "inserted" ]; do typeset -a used_displays IFS='' read -ar used_displays < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") - #Get all used in system ports from X2Go database and ss output - USED_PORTS=$( - "$X2GO_LIB_PATH/x2gogetports" "${current_host_name}"; - "$ss" -nt -all | + # Get all used in system ports from X2Go database and ss output + USED_PORTS="$( + "${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; + "${ss}" -nt -all | awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }'; - ); + )" - X2GO_PORT=$(($X2GO_PORT + 1)) + X2GO_PORT="$((X2GO_PORT + 1))" typeset -i search_x2go_port="0" @@ -310,27 +309,28 @@ while [ "$OUTPUT" != "inserted" ]; do done if [[ "${search_x2go_port}" -gt "59535" ]]; then - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "no free display number available, cannot start new session" - exit -1 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "no free display number available, cannot start new session" + exit "10" fi X2GO_PORT="${search_x2go_port}" - #Test if the session is already in use. nxagent uses 6000+DISPLAY to open a port. Therefore this must be tested, too. - NX_PORT=$(($X2GO_PORT + 6000)) - if $ss -lxs 2>/dev/null | egrep "(@|)/tmp/.X11-unix/X${X2GO_PORT}(|-lock) " 1>/dev/null || - grep -q "|${NX_PORT}|" <<<$USED_PORTS ; then + # Test if the session is already in use. nxagent uses 6000+DISPLAY to open a port. Therefore this must be tested, too. + NX_PORT="$((X2GO_PORT + 6000))" + if "${ss}" -lxs 2>"/dev/null" | grep -E "(@|)/tmp/.X11-unix/X${X2GO_PORT}(|-lock) " >"/dev/null" || + grep -q "|${NX_PORT}|" <<< "${USED_PORTS}"; then OUTPUT="XXX" else - SESSION_NAME="${USER}-${X2GO_PORT}-`date +\"%s\"`" - if [ "$COLORDEPTH" != "" ]; then + SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" + if [ "${COLORDEPTH}" != "" ]; then SESSION_NAME="${SESSION_NAME}_st${SESSION_TYPE}${X2GO_CMD}_dp${COLORDEPTH}" - SESSION_NAME=`echo "$SESSION_NAME" | perl -pe "s/:/PP/g"` + SESSION_NAME="$(perl -pe "s/:/PP/g" <<< "${SESSION_NAME}")" fi + # sanitize session name - SESSION_NAME=`echo "$SESSION_NAME" | perl -pe "s/[^a-zA-Z0-9\.\_\-\@]//g"` + SESSION_NAME="$(perl -pe "s/[^a-zA-Z0-9\.\_\-\@]//g" <<< "${SESSION_NAME}")" - OUTPUT=`$X2GO_LIB_PATH/x2goinsertsession "$X2GO_PORT" "${current_host_name}" "$SESSION_NAME"` + OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" # Catching errors here would be nice, but the current layout doesn't allow this. # Keep this in mind as a FIXME. #if [[ "${?}" -ne "0" ]]; then @@ -339,31 +339,31 @@ while [ "$OUTPUT" != "inserted" ]; do # # # Make x2goclient fail. # echo "${msg}" >&2 - # exit 1 + # exit "11" #fi fi done -while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; do +while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do OUTPUT="" - while [ "$OUTPUT" != "inserted" ]; do - SSH_PORT=$(($SSH_PORT + 1)) + while [ "${OUTPUT}" != "inserted" ]; do + SSH_PORT="$((SSH_PORT + 1))" - #Get all used in system ports from X2Go database and ss output - USED_PORTS=$( + # Get all used in system ports from X2Go database and ss output + USED_PORTS="$( "$X2GO_LIB_PATH/x2gogetports" "${current_host_name}"; - "$ss" -nt -all | + "${ss}" -nt -all | awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }'; - ); + )" - #get free port + # get free port SSH_PORT=`echo "for(\\$i=$SSH_PORT;\\$br ne \"true\";\\$i++){ if(\"$USED_PORTS\" =~ m/\\|\\$i\\|/){\\$br=\"false\";}else{\\$br=\"true\";print \\$i;}}"|perl` - #check if port in /etc/services - SERV=`grep $SSH_PORT /etc/services` - if [ "$SERV" == "" ]; then - OUTPUT=`$X2GO_LIB_PATH/x2goinsertport "${current_host_name}" "$SESSION_NAME" "$SSH_PORT"` + # check if port in /etc/services + SERV="$(grep "${SSH_PORT}" "/etc/services")" + if [ "${SERV}" == "" ]; then + OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" # Catching errors here would be nice, but the current layout doesn't allow this. # Keep this in mind as a FIXME. @@ -373,48 +373,48 @@ while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; d # # # Make x2goclient fail. # echo "${msg}" >&2 - # exit 1 + # exit "12" #fi fi done - if [ "$GR_PORT" == "" ]; then - GR_PORT="$SSH_PORT" - elif [ "$SOUND_PORT" == "" ]; then - SOUND_PORT="$SSH_PORT" + if [ -z "${GR_PORT}" ]; then + GR_PORT="${SSH_PORT}" + elif [ -z "${SOUND_PORT}" ]; then + SOUND_PORT="${SSH_PORT}" else - FS_PORT="$SSH_PORT" + FS_PORT="${SSH_PORT}" fi done # rootless sessions of geometry fullscreen are invalid -if [ "$X2GO_GEOMETRY" == "fullscreen" ] && [ "$SESSION_TYPE" == "R" ]; then +if [ "${X2GO_GEOMETRY}" == "fullscreen" ] && [ "${SESSION_TYPE}" == "R" ]; then X2GO_GEOMETRY="" fi # no geometry for desktop sessions shall result in fullscreen desktop sessions -if [ "$X2GO_GEOMETRY" == "" ] && [ "$SESSION_TYPE" == "D" ]; then +if [ "${X2GO_GEOMETRY}" == "" ] && [ "${SESSION_TYPE}" == "D" ]; then X2GO_GEOMETRY="fullscreen" fi -if [ "$X2GO_GEOMETRY" == "fullscreen" ]; then - X2GO_FULLSCREEN=1 +if [ "${X2GO_GEOMETRY}" == "fullscreen" ]; then + X2GO_FULLSCREEN="1" fi # shadow sessions are never fullscreen session and adopt the original session's geometry -if [ "$X2GO_STYPE" == "S" ]; then - X2GO_GEOMETRY=`DISPLAY="$SHADOW_DESKTOP" xwininfo -root | grep geometry` - X2GO_GEOMETRY=`echo "$X2GO_GEOMETRY" | sed -e "s/ //g"` - X2GO_GEOMETRY=`echo "$X2GO_GEOMETRY" | sed -e "s/-geometry//"` +if [ "${X2GO_STYPE}" == "S" ]; then + X2GO_GEOMETRY="$(DISPLAY="${SHADOW_DESKTOP}" xwininfo -root | grep geometry)" + X2GO_GEOMETRY="$(sed -e "s/ //g" <<< "${X2GO_GEOMETRY}")" + X2GO_GEOMETRY="$(sed -e "s/-geometry//" <<< "${X2GO_GEOMETRY}")" fi -if [ ! -d "$X2GO_ROOT" ]; then - mkdir "$X2GO_ROOT" +if [ ! -d "${X2GO_ROOT}" ]; then + mkdir "${X2GO_ROOT}" fi X2GO_TMP_ROOT="/tmp/.x2go-${USER}" -if [ ! -d "$X2GO_TMP_ROOT" ]; then - mkdir "$X2GO_TMP_ROOT" +if [ ! -d "${X2GO_TMP_ROOT}" ]; then + mkdir "${X2GO_TMP_ROOT}" fi SESSION_DIR="${X2GO_TMP_ROOT}/C-${SESSION_NAME}" @@ -423,134 +423,131 @@ STATE_FILE="${X2GO_ROOT}/C-${SESSION_NAME}/state" # do not use $TMP or $TEMP here, the session.log file location has to be accessible by root SESSION_LOG="${SESSION_DIR}/session.log" mkdir -p "${SESSION_DIR}" -if [ "x$X2GO_STYPE" = "xS" ]; then - chmod -f 0710 "${SESSION_DIR}" - if groups "$USER" | grep x2godesktopsharing 1>/dev/null 2>/dev/null; then - $X2GO_LIB_PATH/x2gosyslog "$0" "info" "user ,,$USER'' grants access to ${SESSION_DIR} for group ,,x2godesktopsharing''" - chown :x2godesktopsharing "${SESSION_DIR}" +if [ "x${X2GO_STYPE}" = "xS" ]; then + chmod -f "0710" "${SESSION_DIR}" + if groups "${USER}" | grep "x2godesktopsharing" &>"/dev/null"; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "user ,,${USER}'' grants access to ${SESSION_DIR} for group ,,x2godesktopsharing''" + chown ":x2godesktopsharing" "${SESSION_DIR}" fi else - chmod -f 0700 "${SESSION_DIR}" + chmod -f "0700" "${SESSION_DIR}" fi touch "${SESSION_LOG}" -chmod -f 0600 "${SESSION_LOG}" +chmod -f "0600" "${SESSION_LOG}" -if [ ! -d "$X2GO_ROOT/ssh" ]; then - mkdir "$X2GO_ROOT/ssh" +if [ ! -d "${X2GO_ROOT}/ssh" ]; then + mkdir "${X2GO_ROOT}/ssh" fi -grep PPid /proc/$PPID/status > ${SESSION_DIR}/sshd.pid +grep "PPid" "/proc/${PPID}/status" >"${SESSION_DIR}/sshd.pid" -X2GO_COOKIE=`mcookie` +X2GO_COOKIE="$(mcookie)" PATH="${PATH}:${X2GO_BIN}/" export PATH -xauth -f "$XAUTHORITY" add "${current_host_name}/unix:${X2GO_PORT}" MIT-MAGIC-COOKIE-1 "${X2GO_COOKIE}" -xauth -f "$XAUTHORITY" add "${current_host_name}:${X2GO_PORT}" MIT-MAGIC-COOKIE-1 "${X2GO_COOKIE}" +xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" +xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" -option_geometry="" -if [ -n "$X2GO_GEOMETRY" ] && [ "$X2GO_GEOMETRY" != "fullscreen" ]; then +typeset option_geometry="" +if [ -n "${X2GO_GEOMETRY}" ] && [ "${X2GO_GEOMETRY}" != "fullscreen" ]; then option_geometry="geometry=${X2GO_GEOMETRY}," fi -if [ -n "$X2GO_CLIPBOARD" ] && [ -z "`echo $X2GO_CLIPBOARD | sed -re 's/(0|none|client|server|both|1)//'`" ]; then - clipboard=",clipboard=$X2GO_CLIPBOARD" +typeset tmp_regex='^(0|none|client|server|both|1)$' +if [ -n "${X2GO_CLIPBOARD}" ] && [[ "${X2GO_CLIPBOARD}" =~ ${tmp_regex} ]]; then + clipboard=",clipboard=${X2GO_CLIPBOARD}" else clipboard=",clipboard=both" fi -if [ "$X2GO_SET_KBD" == "0" ] || [ "$X2GO_KBD_TYPE" == "auto" ];then - X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=$X2GO_COOKIE,errors=${SESSION_LOG},kbtype=null/null,${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" +if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" == "auto" ]; then + X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=${X2GO_COOKIE},errors=${SESSION_LOG},kbtype=null/null,${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" else - X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=$X2GO_COOKIE,errors=${SESSION_LOG},kbtype=${X2GO_KBD_TYPE},${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" + X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=${X2GO_COOKIE},errors=${SESSION_LOG},kbtype=${X2GO_KBD_TYPE},${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" fi echo "${X2GO_HOST}:${X2GO_PORT}" >"${SESSION_DIR}/options" NX_AGENT=":${X2GO_PORT}" -SAVED_DISPLAY="$DISPLAY" +SAVED_DISPLAY="${DISPLAY}" DISPLAY="nx/nx,options=${SESSION_DIR}/options:${X2GO_PORT}" export DISPLAY -if [ "$X2GODPI" == "" ]; then +if [ "${X2GODPI}" == "" ]; then X2GODPIOPTION_="" else - X2GODPIOPTION_="-dpi $X2GODPI" + X2GODPIOPTION_="-dpi ${X2GODPI}" fi NOLISTOPT="" -if [ "$X2GOXDMCP" == "" ] ;then +if [ "${X2GOXDMCP}" == "" ] ;then XDMCPOPT="" if [ "x${X2GO_NXAGENT_OPTIONS}" != "x${X2GO_NXAGENT_OPTIONS/' -nolisten tcp'/''}" ]; then NOLISTOPT="-nolisten tcp" fi else - XDMCPOPT="-query $X2GOXDMCP" + XDMCPOPT="-query ${X2GOXDMCP}" fi # run x2goserver-extensions for pre-start -x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" pre-start || true +x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "pre-start" || true SESSION_WINDOW_TITLE="X2GO-${SESSION_NAME}" agent_geometry="" -if [ -n "$X2GO_GEOMETRY" ] && [ "$X2GO_GEOMETRY" != "fullscreen" ]; then +if [ -n "${X2GO_GEOMETRY}" ] && [ "${X2GO_GEOMETRY}" != "fullscreen" ]; then agent_geometry="-geometry ${X2GO_GEOMETRY}" fi # systemd is prone to kill remaining sessions on user logouts. # That sort of makes sense to clean up stray processes, # but gets in the way of our persistent session scheme. -loginctl enable-linger >/dev/null 2>&1 || : +loginctl "enable-linger" &>"/dev/null" || : -if [ "$X2GO_STYPE" == "S" ]; then +if [ "${X2GO_STYPE}" == "S" ]; then # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') -SESSION_TYPE ('-${SESSION_TYPE}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') -shadow SHADOW_DESKTOP ('${SHADOW_DESKTOP}') -shadowmode SHADOW_MODE ('${SHADOW_MODE}') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGEN [...] - NX_TEMP=/tmp x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ -$SESSION_TYPE -auth "$XAUTHORITY" -shadow $SHADOW_DESKTOP -shadowmode $SHADOW_MODE $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & + NX_TEMP="/tmp" x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ -$SESSION_TYPE -auth "$XAUTHORITY" -shadow $SHADOW_DESKTOP -shadowmode $SHADOW_MODE $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & else # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') XDMCPPOPT ('${XDMCPOPT}') -SESSION_TYPE ('-${SESSION_TYPE}') NOEXITPARAM ('${NOEXITPARAM}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGENT}\"') 2>\"SESSION_LOG\" ('\"$ [...] - NX_TEMP=/tmp x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ $XDMCPOPT -$SESSION_TYPE $NOEXITPARAM -auth "$XAUTHORITY" $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') XDMCPPOPT ('${XDMCPOPT}') -SESSION_TYPE ('-${SESSION_TYPE}') NOEXITPARAM ('${NOEXITPARAM}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGENT}\"') 2>\"SESSION_LOG\" ('\"${ [...] + NX_TEMP="/tmp" x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ $XDMCPOPT -$SESSION_TYPE $NOEXITPARAM -auth "$XAUTHORITY" $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & fi ln -s "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" -X2GO_AGENT_PID=$! -X2GO_AGENT_RETVAL=$? -test $X2GO_AGENT_RETVAL && { - $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "successfully started X2Go agent session with ID $SESSION_NAME" +X2GO_AGENT_PID="${!}" +X2GO_AGENT_RETVAL="${?}" +if [ "${X2GO_AGENT_RETVAL}" -eq "0" ]; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "successfully started X2Go Agent session with ID ${SESSION_NAME}" # run x2goserver-extensions for post-start - x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" post-start || true - -} || { - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "ERROR: failed to start X2Go agent session with ID $SESSION_NAME" + x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "post-start" || true +else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: failed to start X2Go Agent session with ID ${SESSION_NAME}" # run x2goserver-extensions for fail-start - x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" fail-start || true - -} - -X2GO_SND_PORT=1024 + x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "fail-start" || true +fi -$X2GO_LIB_PATH/x2gocreatesession "$X2GO_COOKIE" "$X2GO_AGENT_PID" "$X2GO_CLIENT" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$SESSION_NAME" > /dev/null +"${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >"/dev/null" -if [ "$X2GO_SET_KBD" == "0" ] || [ "$X2GO_KBD_TYPE" != "auto" ]; then - $X2GO_LIB_PATH/x2gosyslog "$0" "info" "blocking creation of agent's keyboard file ${SESSION_DIR}/keyboard as requested by session startup command" - mkdir -p ${SESSION_DIR}/keyboard +if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" != "auto" ]; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "blocking creation of agent's keyboard file ${SESSION_DIR}/keyboard as requested by session startup command" + mkdir -p "${SESSION_DIR}/keyboard" fi -echo $X2GO_PORT -echo $X2GO_COOKIE -echo $X2GO_AGENT_PID -echo $SESSION_NAME -echo $GR_PORT -echo $SOUND_PORT -echo $FS_PORT +echo "${X2GO_PORT}" +echo "${X2GO_COOKIE}" +echo "${X2GO_AGENT_PID}" +echo "${SESSION_NAME}" +echo "${GR_PORT}" +echo "${SOUND_PORT}" +echo "${FS_PORT}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 6ae7c4f8435579c2856bb894d5061039ad83a1f4 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 2 04:12:49 2018 +0100 x2goserver/bin/x2gostartagent: some shells do not handle quotes in pattern substitutions gracefully. Remove them. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 2ac8412..c661382 100644 --- a/debian/changelog +++ b/debian/changelog @@ -34,6 +34,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium not impossible. - x2goserver/bin/x2gostartagent: replace perl call with bash pattern substitution. + - x2goserver/bin/x2gostartagent: some shells do not handle quotes in + pattern substitutions gracefully. Remove them. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 6781925..48e8ab6 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -491,7 +491,7 @@ fi NOLISTOPT="" if [ "${X2GOXDMCP}" == "" ] ;then XDMCPOPT="" - if [ "x${X2GO_NXAGENT_OPTIONS}" != "x${X2GO_NXAGENT_OPTIONS/' -nolisten tcp'/''}" ]; then + if [ "x${X2GO_NXAGENT_OPTIONS}" != "x${X2GO_NXAGENT_OPTIONS/ -nolisten tcp/}" ]; then NOLISTOPT="-nolisten tcp" fi else -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 369a0b558b69d1e641057e4d81be75289e49cca8 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 2 04:10:22 2018 +0100 x2goserver/bin/x2gostartagent: replace perl call with bash pattern substitution. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 4614bc3..2ac8412 100644 --- a/debian/changelog +++ b/debian/changelog @@ -32,6 +32,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium that enough processes to overflow the PID + to get to the original PID value need to be spawned in a very short amount of time. Unlikely, but not impossible. + - x2goserver/bin/x2gostartagent: replace perl call with bash pattern + substitution. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index ad8d635..6781925 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -324,7 +324,7 @@ while [ "${OUTPUT}" != "inserted" ]; do SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" if [ "${COLORDEPTH}" != "" ]; then SESSION_NAME="${SESSION_NAME}_st${SESSION_TYPE}${X2GO_CMD}_dp${COLORDEPTH}" - SESSION_NAME="$(perl -pe "s/:/PP/g" <<< "${SESSION_NAME}")" + SESSION_NAME="${SESSION_NAME//:/PP}" fi # sanitize session name -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 9297f6b1c94192ef307a6fcdaad817624fab2fc3 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 05:38:00 2018 +0100 x2goserver/lib: new script x2gogetrandomport, contains the port randomization (or pseudo-randomization) features that are part of x2gostartagent, but need to be accessible by other scripts as well. --- debian/changelog | 3 + x2goserver/lib/x2gogetrandomport | 120 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/debian/changelog b/debian/changelog index 6696e7f..0befe04 100644 --- a/debian/changelog +++ b/debian/changelog @@ -38,6 +38,9 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium pattern substitutions gracefully. Remove them. - x2goserver/lib: new script x2gogetfreeport, consists of duplicated functionality in x2gostartagent. + - x2goserver/lib: new script x2gogetrandomport, contains the port + randomization (or pseudo-randomization) features that are part of + x2gostartagent, but need to be accessible by other scripts as well. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2gogetrandomport b/x2goserver/lib/x2gogetrandomport new file mode 100755 index 0000000..c269270 --- /dev/null +++ b/x2goserver/lib/x2gogetrandomport @@ -0,0 +1,120 @@ +#!/bin/bash + +# Copyright (C) 2017-2018 X2Go Project - https://wiki.x2go.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +typeset x2go_lib_path="$(x2gopath "libexec")" + +"${x2go_lib_path}/x2gosyslog" "${0}" "debug" "$(basename "${0}") called with options: ${*}" + +# rnowotny, <rnowotny@rotek.at> +# Patch for SSH_PORT, to not use the same SSH port on each server, which is a +# problem if you want to connect to different servers at the same time with +# the windows client. +# Original problem report: https://www.mail-archive.com/x2go-user@lists.berlios.de/msg00547.html +# Currently implementation is based on the submitted patch, but differs heavily. + +# Gets the outward-facing server IPv4 address. +# Does not take any parameters. +# Outputs the default outgoing IPv4 address. +# Returns 0 on success, otherwise non-0. +get_server_ip_address() { + # The provided IP address should be outside of any local network. + # We are only interested in how the kernel would try to reach the + # non-local IP address specified here. It is not actually contacted + # in any way. + typeset ip_output="$(ip route get 8.8.8.8)" + + # Remove newlines. + ip_output="${ip_output//$'\n'}" + + # Fetch source address. + typeset src_address="$(grep -oe 'src[[:space:]]\{1,\}\(\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}\)' <<< "${ip_output}" | sed -e 's/src[[:space:]]\{1,\}//')" + + if [[ -n "${src_address}" ]]; then + printf '%s\n' "${src_address}" + return "0" + fi + + return "1" +} + +# Get some purely random port. +# Does not take any parameters. +# Outputs a random port value in range [30000, 62767]. +# Returns 0. +get_pure_random_port() { + typeset -i unix_timestamp="$(date "+%s")" + + # Seed ${RANDOM}. This should probably be changed some time before 2106. + # Or maybe not. + RANDOM="${unix_timestamp}" + + typeset -i random_port="$((30000 + RANDOM))" + printf '%d\n' "${random_port}" + + return "0" +} + +# Gets a pseudo-random port based on the machine's +# outgoing IP address. +# Does not take any parameters. +# Outputs a host-based pseudo-random port value. +# Returns 0 on success, otherwise non-0. +get_host_based_random_port() { + "${x2go_lib_path}/x2gosyslog" "${0}" "debug" "host-based SSH port initialization requested." + typeset ip_address='' + typeset -i ret_port='0' + typeset -i ret='1' + + if ip_address="$(get_server_ip_address)"; then + typeset -i ip_address_last_octet="${ip_address##*.}" + ret_port="$((30000 + (ip_address_last_octet * 128)))" + + printf '%d\n' "${ret_port}" + fi + + return "${ret}" +} + + +# Refer to x2goserver.conf. +typeset -i randomize_ssh_port="1" +typeset randomize_ssh_port_config_value='' + +randomize_ssh_port_config_value="$("${x2go_lib_path}/x2goqueryconfig" "x2goagent" "port_randomization")" + +# Failures or incorrect values are implicitly caught by the default value. +[[ "${randomize_ssh_port_config_value}" = "host-based" ]] && randomize_ssh_port='0' + +if [ "${randomize_ssh_port}" = "1" ]; then + "${x2go_lib_path}/x2gosyslog" "${0}" "debug" "Full SSH port randomization requested." + get_random_port +else + "${x2go_lib_path}/x2gosyslog" "${0}" "debug" "host-based SSH port initialization requested." + + if ! get_host_based_random_port; then + "${x2go_lib_path}/x2gosyslog" "${0}" "warning" "IP-based SSH port initialization requested, but failed to fetch primary address." + "${x2go_lib_path}/x2gosyslog" "${0}" "warning" "Falling back to randomization." + get_random_port + fi +fi + +# No explicit return value, will use the last command's return value. +# Make sure that the last command executed exits with the +# return value you want to pass through! +exit -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit a26de658a6d00bafb311d6b467efb86cb6102244 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 03:04:50 2018 +0100 x2goserver/lib: new script x2gogetfreeport, consists of duplicated functionality in x2gostartagent. --- debian/changelog | 2 + x2goserver/lib/x2gogetfreeport | 169 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) diff --git a/debian/changelog b/debian/changelog index c661382..6696e7f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -36,6 +36,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium substitution. - x2goserver/bin/x2gostartagent: some shells do not handle quotes in pattern substitutions gracefully. Remove them. + - x2goserver/lib: new script x2gogetfreeport, consists of duplicated + functionality in x2gostartagent. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2gogetfreeport b/x2goserver/lib/x2gogetfreeport new file mode 100755 index 0000000..2f91297 --- /dev/null +++ b/x2goserver/lib/x2gogetfreeport @@ -0,0 +1,169 @@ +#!/bin/bash + +# Copyright (C) 2017-2018 X2Go Project - https://wiki.x2go.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +# Get first free port. +# Takes a command for ss, the port type, a start andan end port +# as parameters. +# If an ss command is not given, a default of "ss" is assumed. +# If the port type is not given, a default of "lowlevel" is assumed. +# If the start port is not given, a default of 1 is assumed. +# If the end port is not given, a default of 65535 is assumed. +# Valid values for the port type are "lowlevel" and "display". +# Prints the first free port value on success, or the initial start +# port number on failure. +# Returns 0 on success or non-0 on failure. +typeset ss="${1:-"ss"}" +typeset type="${2:-"lowlevel"}" +typeset start="${3:-"1"}" +typeset end="${4:-"65535"}" + +# Check parameter sanity. +typeset empty_regex='^[[:space:]]*$' +if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then + exit "1" +fi +typeset -i start_i="${start}" +typeset -i end_i="${end}" +if [[ -z "${start}" ]] || [[ "${start}" != "${start_i}" ]] || [[ "${start}" -ne "${start_i}" ]]; then + exit "2" +fi +if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]]; then + exit "3" +fi +[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit "4" + + +# Skip unnecessary work. +if [[ "${type}" = 'display' ]]; then + typeset -a used_displays + typeset -a used_displays_work + used_displays=() + used_displays_work=() + # What this does is very unobvious, so here's how that works: + # The -d parameter with an empty string as its argument makes + # the read utility process a "line" until the first such delimiter + # is found. Since an empty string in C is terminated by a NULL + # character, the delimiter will be set to this NULL character. + # Hence, assuming that the input string does not contain any + # NULL characters, the whole input string will be treated as + # one big line. + # Then, normal word splitting kicks in and the -a flag tells + # read to put all words into elements of the provided array + # variable. + IFS="${IFS}|" read -r -d '' -a used_displays_work < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") + + # Filter out any empty or invalid values. + typeset -i item_i='0' + typeset item='' + for item in "${used_displays_work[@]}"; do + item_i="${item}" + + [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_displays+=( "${item}" ) + done +fi + +# Same algorithm again for the system ports in use, but we cannot really +# use a function to duplicate code less since arrays and functions don't +# mix well in bash. + +# Get all used in system ports from X2Go database and ss output +typeset -a used_ports +typeset -a used_ports_work +used_ports=() +used_ports_work=() +IFS="${IFS}|" read -r -d '' -a used_ports_work < <("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; + "${ss}" -nt -all | awk ' + { + n = split ($0, lines, "\n"); + for (i = 1; i <= n; ++i) { + split (lines[i], words, " "); + delim = split (words[4], ports, ":"); + if (delim > 1) { + printf ("\n%d\n", ports[delim]) + } + } + }') + +# Filter out any empty or invalid values. +item_i='0' +item='' +for item in "${used_ports_work[@]}"; do + item_i="${item}" + + [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_ports+=( "${item}" ) +done + +typeset -i ret_port="${start}" +typeset -i ret='1' +typeset -i work_port='0' +typeset -i stop_port='65535' +[[ "${type}" = 'display' ]] && stop_port="$((stop_port - 6000))" +# Find the next free port number. +for ((work_port = start; i <= stop_port; ++work_port)); do + typeset -i i="0" + typeset -i value_found="0" + + if [[ "${type}" = 'display' ]]; then + for ((i = 0; i < ${#used_displays[@]}; ++i)); do + if [[ "${used_displays[i]}" = "${work_port}" ]]; then + # We need to continue with the next port number, + # this one is taken. + value_found="1" + break + fi + done + + # Check if such a socket is already in use system-wide. + if "${ss}" -lxs 2>"/dev/null" | grep -Eqs "(@|)/tmp/.X11-unix/X${work_port}(|-lock) " >"/dev/null"; then + continue + fi + fi + + # Port number taken? Continue with the next one. + [[ "${value_found}" -ne "0" ]] && continue + + # Check raw port number. Either to make sure that the corresponding + # raw port for the DISPLAY port found is still free, or also in the + # general case. + typeset -i map_port="${work_port}" + [[ "${type}" = 'display' ]] && map_port="$((map_port + 6000))" + for ((i = 0; i < ${#used_ports[@]}; ++i)); do + if [[ "${used_ports[i]}" = "${map_port}" ]]; then + value_found="1" + break + fi + done + + # Port number taken? Continue with the next one. + [[ "${value_found}" -ne "0" ]] && continue + + # If the port is a well-known one, don't block it. + grep -qs "${work_port}" "/etc/services" &>"/dev/null" && continue + + # Searched the array and got nothing? Great, grab that port number! + ret_port="${work_port}" + ret='0' + break +done + +# At this point, ${ret} and ${ret_port} should be set up correctly. +# Either to the first free port value if one has been found (and ${ret} +# to zero) or to the start port value (and ${ret} to one.) +printf '%d\n' "${ret_port}" +exit "${ret}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 56dd4b6b3534453f05ce0edd37195733247146cf Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 05:49:17 2018 +0100 x2goserver/bin/x2gostartagent: start using x2gogetrandomport, delete now-duplicate code. Also adjust return values accordingly. --- debian/changelog | 2 + x2goserver/bin/x2gostartagent | 91 +++++++------------------------------------ 2 files changed, 17 insertions(+), 76 deletions(-) diff --git a/debian/changelog b/debian/changelog index 9e3e16e..f315edc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -43,6 +43,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium x2gostartagent, but need to be accessible by other scripts as well. - x2goserver/bin/x2gostartagent: remove spurious semicolon and add quotes on the lib path line. + - x2goserver/bin/x2gostartagent: start using x2gogetrandomport, delete + now-duplicate code. Also adjust return values accordingly. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 89eb0c1..1dd5e65 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -20,78 +20,17 @@ # Copyright (C) 2007-2017 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> # Copyright (C) 2007-2017 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> -# rnowotny, <rnowotny@rotek.at> -# Patch for SSH_PORT, to not use the same SSH port on each server, which is a -# problem if you want to connect to different servers at the same time with -# the windows client. -# Original problem report: https://www.mail-archive.com/x2go-user@lists.berlios.de/msg00547.html -# Currently implementation is based on the submitted patch, but differs heavily. - -# Get server IP address. -get_server_ip_address() { - # The provided IP address should be outside of any local network. - # We are only interested in how the kernel would try to reach the - # non-local IP address specified here. It is not actually contacted - # in any way. - typeset ip_output="$(ip route get 8.8.8.8)" - - # Remove newlines. - ip_output="${ip_output//$'\n'}" - - # Fetch source address. - typeset src_address="$(grep -oe 'src[[:space:]]\{1,\}\(\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}\)' <<< "${ip_output}" | sed -e 's/src[[:space:]]\{1,\}//')" - - if [ -n "${src_address}" ]; then - printf '%s' "${src_address}" - return "0" - fi - - return "1" -} - -# Get some random port. -get_random_port() { - typeset -i unix_timestamp="$(date "+%s")" - - # Seed ${RANDOM}. This should probably be changed some time before 2106. - # Or maybe not. - RANDOM="${unix_timestamp}" - - typeset -i random_port="$((30000 + RANDOM))" - printf '%s' "${random_port}" - - return "0" -} - X2GO_LIB_PATH="$(x2gopath "libexec")" "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "$(basename "${0}") called with options: ${*}" +if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then + typeset msg="Unable to get (pseudo-)randomized starting port value." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" -# Refer to x2goserver.conf. -typeset -i randomize_ssh_port="1" -typeset randomize_ssh_port_config_value='' - -randomize_ssh_port_config_value="$("${X2GO_LIB_PATH}/x2goqueryconfig" "x2goagent" "port_randomization")" - -# Failures or incorrect values are implicitly caught by the default value. -[[ "${randomize_ssh_port_config_value}" = "host-based" ]] && randomize_ssh_port='0' - -if [ "${randomize_ssh_port}" = "1" ]; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "Full SSH port randomization requested." - SSH_PORT="$(get_random_port)" -else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "host-based SSH port initialization requested." - typeset ip_address='' - - if ip_address="$(get_server_ip_address)"; then - typeset -i ip_address_last_octet="${ip_address##*.}" - SSH_PORT="$((30000 + (ip_address_last_octet * 128)))" - else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "IP-based SSH port initialization requested, but failed to fetch primary address." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "Falling back to randomization." - SSH_PORT="$(get_random_port)" - fi + # Make x2goclient fail. + echo "${msg}" >&2 + exit "1" fi X2GO_PORT="49" #First port for X2GO=50 @@ -101,22 +40,22 @@ if grep -E "^backend[ ]*=[ ]*postgres" "/etc/x2go/x2gosql/sql" 1>"/dev/null" 2>" msg="The super-user \"root\" is not allowed to launch X2Go sessions." echo "${msg}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "1" + exit "2" elif [ -z "${USER}" ]; then msg="The \$USER environment variable is not set. Aborting session startup." echo "${msg}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "2" + exit "3" elif [ -z "${HOME}" ]; then msg="The \$HOME environment variable is not set. Aborting session startup." echo "${msg}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "3" + exit "4" elif ! iconv -f ASCII -t ASCII &>"/dev/null" <<< "${HOME}"; then msg="Your home directory path contains non-ASCII characters. Aborting session startup." echo "${msg}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "4" + exit "5" fi # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this @@ -138,7 +77,7 @@ if current_host_name="$(hostname)"; then # Make x2goclient fail. echo "${msg}" >&2 - exit "5" + exit "6" fi X2GO_ROOT="${HOME}/.x2go" @@ -167,7 +106,7 @@ if [ -z "${X2GO_CLIENT}" ]; then msg="The \$X2GO_CLIENT environment variable is not set. Possible reasons: \$SSH_CLIENT not set or \$SSH_CONNECTION not set. Or \$X2GO_CLIENT not set by ,,X2Go Desktop Sharing'' applet. Aborting session startup." echo "${msg}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "6" + exit "7" fi "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "client announced itself as ,,${X2GO_CLIENT}''" @@ -220,7 +159,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then fi "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: user ${SHADOW_USER} denied desktop sharing session" "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" - exit "7" + exit "8" fi X2GO_COOKIE="$(awk '{print $2}' <<< "${OUTPUT}")" X2GO_PORT="$(awk '{print $1}' <<< "${OUTPUT}")" @@ -236,7 +175,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "8" + exit "9" else X2GO_CLIPBOARD="${1}"; shift fi @@ -248,7 +187,7 @@ LWORD="$(awk '{print $1}' <<< "${LIMIT}")" if [ "${LWORD}" == "LIMIT" ]; then echo "${LIMIT}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "session limit has been reached for user ,,${USER}'', cannot start new session" - exit "9" + exit "10" fi export NX_CLIENT="${X2GO_LIB_PATH}/x2gosuspend-agent" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 455a4d7377657d9363004ea5e5a41b72819f0e99 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 05:40:43 2018 +0100 x2goserver/bin/x2gostartagent: remove spurious semicolon and add quotes on the lib path line. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 0befe04..9e3e16e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -41,6 +41,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/lib: new script x2gogetrandomport, contains the port randomization (or pseudo-randomization) features that are part of x2gostartagent, but need to be accessible by other scripts as well. + - x2goserver/bin/x2gostartagent: remove spurious semicolon and add quotes + on the lib path line. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 48e8ab6..89eb0c1 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -63,7 +63,7 @@ get_random_port() { return "0" } -X2GO_LIB_PATH="$(x2gopath libexec)"; +X2GO_LIB_PATH="$(x2gopath "libexec")" "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "$(basename "${0}") called with options: ${*}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit f97cd4b09995eed16a3c84a0b46c323c7554a579 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 05:51:18 2018 +0100 x2goserver/bin/x2gostartagent: fix return code that should have been zero, indicating success. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index f315edc..62e83b0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -45,6 +45,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium on the lib path line. - x2goserver/bin/x2gostartagent: start using x2gogetrandomport, delete now-duplicate code. Also adjust return values accordingly. + - x2goserver/bin/x2gostartagent: fix return code that should have been + zero, indicating success. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 1dd5e65..033ad68 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -175,7 +175,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "9" + exit "0" else X2GO_CLIPBOARD="${1}"; shift fi -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 4877f5edc847dc202fc398e488e2e98b69cf828b Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 2 03:21:47 2018 +0100 x2goserver/bin/x2gostartagent: drop obsolete X2GO_BIN environment variable usage. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index aba7586..72ede22 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/bin/x2gostartagent: update copyright notice. - x2goserver/bin/x2gostartagent: fix most shellcheck warnings, whitespace errors, use more quotes and curly braces. + - x2goserver/bin/x2gostartagent: drop obsolete X2GO_BIN environment + variable usage. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index c13f5b4..de5ddeb 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -446,9 +446,6 @@ grep "PPid" "/proc/${PPID}/status" >"${SESSION_DIR}/sshd.pid" X2GO_COOKIE="$(mcookie)" -PATH="${PATH}:${X2GO_BIN}/" -export PATH - xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 5c1e0b2b65e456c0c091eb4d368d78de97223517 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 2 03:48:02 2018 +0100 x2goserver/bin/x2gostartagent: checking for the exit status of a variable assignment isn't helping us in finding out if x2goagent is still running. Even otherwise, the exit status would be useless since we spawn x2goagent in the background. Better check if the PID still exists and error out if it's gone. There certainly is potential for race conditions (i.e., x2goagent started, then exited, then another process took its place). On Linux, this situation is unlikely to happen, since PIDs are only recycled once the maximum PID value is reached, meaning that enough processes to overflow the PID + to get to the original PID value need to be spawned in a very short amount of time. Unlikely, but not impossible. --- debian/changelog | 11 +++++++++++ x2goserver/bin/x2gostartagent | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index e9b706a..4614bc3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -21,6 +21,17 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium variable usage. - x2goserver/bin/x2gostartagent: make shellcheck happy by referencing "${SAVED_DISPLAY}" once. + - x2goserver/bin/x2gostartagent: checking for the exit status of a + variable assignment isn't helping us in finding out if x2goagent is + still running. Even otherwise, the exit status would be useless since we + spawn x2goagent in the background. Better check if the PID still exists + and error out if it's gone. There certainly is potential for race + conditions (i.e., x2goagent started, then exited, then another process + took its place). On Linux, this situation is unlikely to happen, since + PIDs are only recycled once the maximum PID value is reached, meaning + that enough processes to overflow the PID + to get to the original PID + value need to be spawned in a very short amount of time. Unlikely, but + not impossible. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 2fe3d85..ad8d635 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -512,6 +512,7 @@ fi # but gets in the way of our persistent session scheme. loginctl "enable-linger" &>"/dev/null" || : +X2GO_AGENT_PID="0" if [ "${X2GO_STYPE}" == "S" ]; then # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') -SESSION_TYPE ('-${SESSION_TYPE}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') -shadow SHADOW_DESKTOP ('${SHADOW_DESKTOP}') -shadowmode SHADOW_MODE ('${SHADOW_MODE}') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGEN [...] @@ -525,17 +526,22 @@ fi ln -s "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" X2GO_AGENT_PID="${!}" -X2GO_AGENT_RETVAL="${?}" -if [ "${X2GO_AGENT_RETVAL}" -eq "0" ]; then +if ps -p "${X2GO_AGENT_PID}" &>"/dev/null"; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "successfully started X2Go Agent session with ID ${SESSION_NAME}" # run x2goserver-extensions for post-start x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "post-start" || true else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: failed to start X2Go Agent session with ID ${SESSION_NAME}" + typeset msg="Failed to start X2Go Agent session with ID ${SESSION_NAME}. X2Go Agent terminated unexpectedly. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + + # Make x2goclient fail. + echo "${msg}" >&2 # run x2goserver-extensions for fail-start x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "fail-start" || true + + exit "13" fi "${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >"/dev/null" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 98e48fed458b255b3225f8f270dc92e74642585a Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 2 03:30:15 2018 +0100 x2goserver/bin/x2gostartagent: make shellcheck happy by referencing "${SAVED_DISPLAY}" once. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 72ede22..e9b706a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium errors, use more quotes and curly braces. - x2goserver/bin/x2gostartagent: drop obsolete X2GO_BIN environment variable usage. + - x2goserver/bin/x2gostartagent: make shellcheck happy by referencing + "${SAVED_DISPLAY}" once. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index de5ddeb..2fe3d85 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -474,6 +474,10 @@ echo "${X2GO_HOST}:${X2GO_PORT}" >"${SESSION_DIR}/options" NX_AGENT=":${X2GO_PORT}" SAVED_DISPLAY="${DISPLAY}" + +# Make shellcheck happy. +: "${SAVED_DISPLAY}" + DISPLAY="nx/nx,options=${SESSION_DIR}/options:${X2GO_PORT}" export DISPLAY -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 6b0488cb2df00cf7426323a2d445fd525abf509e Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 05:54:53 2018 +0100 x2goserver/bin/x2goresume-session: remove spurious semicolon and add quotes on the lib path line. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 62e83b0..7f645cb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -47,6 +47,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium now-duplicate code. Also adjust return values accordingly. - x2goserver/bin/x2gostartagent: fix return code that should have been zero, indicating success. + - x2goserver/bin/x2goresume-session: remove spurious semicolon and add + quotes on the lib path line. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index c1fbab0..2ac10b6 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -20,7 +20,7 @@ # Copyright (C) 2007-2015 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> # Copyright (C) 2007-2015 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> -X2GO_LIB_PATH="$(x2gopath libexec)"; +X2GO_LIB_PATH="$(x2gopath "libexec")" if [ $# -lt 7 ] then -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit d4d954b0a7c8c6d94356dd1d1b3299fb107712fd Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 05:59:21 2018 +0100 x2goserver/bin/x2goresume-session: properly randomize first port, just like in x2gostartagent. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 7f645cb..818e823 100644 --- a/debian/changelog +++ b/debian/changelog @@ -49,6 +49,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium zero, indicating success. - x2goserver/bin/x2goresume-session: remove spurious semicolon and add quotes on the lib path line. + - x2goserver/bin/x2goresume-session: properly randomize first port, just + like in x2gostartagent. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 2ac10b6..34b8f2d 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -186,7 +186,14 @@ if grep -q "|${FS_PORT}|" <<<$SYSTEM_PORTS ; then FS_PORT="" fi -SSH_PORT=30000 #First ssh port 30001 +if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then + typeset msg="Unable to get (pseudo-)randomized starting port value." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + + # Make x2goclient fail. + echo "${msg}" >&2 + exit "1" +fi #Get all used in system ports from X2Go database and netstat output USED_PORTS="$("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; netstat -nt -all | awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }')" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 7a76b291ed589775ee5d84c34b677fd621ce6d11 Author: Mihai Moldovan <ionic@ionic.de> Date: Thu Jan 4 06:16:51 2018 +0100 x2goserver/bin/x2go{startagent,resume-session}: use x2gogetfreeport instead of duplicating the same code everywhere. Fixes: #1230. Also, rely on it returning a valid value and try at most 10 times to fetch a usable port value, then error out and make the session startup or resumption fail. --- debian/changelog | 5 ++ x2goserver/bin/x2goresume-session | 75 ++++++++++----------- x2goserver/bin/x2gostartagent | 136 ++++++++++++++------------------------ 3 files changed, 92 insertions(+), 124 deletions(-) diff --git a/debian/changelog b/debian/changelog index 818e823..f8582d4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -51,6 +51,11 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium quotes on the lib path line. - x2goserver/bin/x2goresume-session: properly randomize first port, just like in x2gostartagent. + - x2goserver/bin/x2go{startagent,resume-session}: use x2gogetfreeport + instead of duplicating the same code everywhere. Fixes: #1230. Also, + rely on it returning a valid value and try at most 10 times to fetch a + usable port value, then error out and make the session startup or + resumption fail. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 34b8f2d..0d2d8ce 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -162,12 +162,6 @@ SERVER=`echo "$SESSIONINFO" | awk -F, {'print $4'}` $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "old ports: $GR_PORT, $SOUND_PORT, $FS_PORT" -#Get all used in system ports from ss output -ss=$(PATH="$PATH:/usr/sbin:/sbin" type -P ss); -USED_PORTS=$( - "$ss" -nt -all | - awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }'; -); #check if saved in DB ports free if grep -q "|${GR_PORT}|" <<<$SYSTEM_PORTS ; then @@ -195,40 +189,47 @@ if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then exit "1" fi -#Get all used in system ports from X2Go database and netstat output -USED_PORTS="$("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; netstat -nt -all | awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }')" - -while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ]; do - OUTPUT="" - while [ "$OUTPUT" != "inserted" ]; do - SSH_PORT=$(($SSH_PORT + 1)) - - #get free port - SSH_PORT=`echo "for(\\$i=$SSH_PORT;\\$br ne \"true\";\\$i++){ if(\"$USED_PORTS\" =~ m/\\|\\$i\\|/){\\$br=\"false\";}else{\\$br=\"true\";print \\$i;}}"|perl` - - #check if port in /etc/services - SERV=`grep $SSH_PORT /etc/services` - if [ "$SERV" == "" ]; then - OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "$SESSION_NAME" "$SSH_PORT")" - - # Catching errors here would be nice, but the current layout doesn't allow this. - # Keep this in mind as a FIXME. - #if [[ "${?}" -ne "0" ]]; then - # typeset msg="Unable to insert new port into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." - # "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - # - # # Make x2goclient fail. - # echo "${msg}" >&2 - # exit 1 - #fi +# define the full path to the ss utility +typeset ss="$(PATH="${PATH}:/usr/sbin:/sbin" type -P 'ss')" + +typeset -i retry='0' +typeset -i max_retry='10' +typeset -i free_port='0' +typeset output='' +while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do + output='' + for ((retry = 0; retry < max_retry; ++retry)); do + free_port='0' + if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'lowlevel' "${SSH_PORT}")"; then + SSH_PORT="${free_port}" + + output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" + + if [[ "${output}" = "inserted" ]]; then + break + else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert port into database. Retrying (run $((retry + 1)))." + fi + else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free port available, cannot start new session. Retrying (run $((retry + 1)))." fi done - if [ "$GR_PORT" == "" ]; then - GR_PORT="$SSH_PORT" - elif [ "$SOUND_PORT" == "" ]; then - SOUND_PORT="$SSH_PORT" + + if [[ "${output}" != "inserted" ]]; then + typeset msg="Unable to find free port or insert new session into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + + # Make x2goclient fail. + echo "${msg}" >&2 + exit "12" + fi + + if [ -z "${GR_PORT}" ]; then + GR_PORT="${SSH_PORT}" + elif [ -z "${SOUND_PORT}" ]; then + SOUND_PORT="${SSH_PORT}" else - FS_PORT="$SSH_PORT" + FS_PORT="${SSH_PORT}" fi done diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 033ad68..d11221a 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -33,7 +33,7 @@ if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then exit "1" fi -X2GO_PORT="49" #First port for X2GO=50 +X2GO_PORT="50" # some sanity checks before session startup... if grep -E "^backend[ ]*=[ ]*postgres" "/etc/x2go/x2gosql/sql" 1>"/dev/null" 2>"/dev/null" && [ "x${USER}" = "xroot" ]; then @@ -213,53 +213,14 @@ fi # define the full path to the ss utility ss="$(PATH="${PATH}:/usr/sbin:/sbin" type -P "ss")" -while [ "${OUTPUT}" != "inserted" ]; do +typeset -i retry='0' +typeset -i max_retry='10' +typeset -i output='' +for ((retry = 0; retry < max_retry; ++retry)); do + typeset -i free_port="${X2GO_PORT}" + if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'display' "${X2GO_PORT}")"; then + X2GO_PORT="${free_port}" - typeset -a used_displays - IFS='' read -ar used_displays < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") - - # Get all used in system ports from X2Go database and ss output - USED_PORTS="$( - "${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; - "${ss}" -nt -all | - awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }'; - )" - - X2GO_PORT="$((X2GO_PORT + 1))" - - typeset -i search_x2go_port="0" - - # Find the next free port number. - for ((search_x2go_port = X2GO_PORT; i <= 59535; ++search_x2go_port)); do - typeset -i i="0" - typeset -i value_found="0" - - for ((i = 0; i < ${#used_displays[@]}; ++i)); do - if [[ "${used_displays[i]}" =~ /|${search_x2go_port}|/ ]]; then - # We need to continue with the next port number, - # this one is taken. - value_found="1" - break - fi - done - - # Searched the array and got nothing? Great, grab that port number! - [[ "${value_found}" -eq "0" ]] && break - done - - if [[ "${search_x2go_port}" -gt "59535" ]]; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "no free display number available, cannot start new session" - exit "10" - fi - - X2GO_PORT="${search_x2go_port}" - - # Test if the session is already in use. nxagent uses 6000+DISPLAY to open a port. Therefore this must be tested, too. - NX_PORT="$((X2GO_PORT + 6000))" - if "${ss}" -lxs 2>"/dev/null" | grep -E "(@|)/tmp/.X11-unix/X${X2GO_PORT}(|-lock) " >"/dev/null" || - grep -q "|${NX_PORT}|" <<< "${USED_PORTS}"; then - OUTPUT="XXX" - else SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" if [ "${COLORDEPTH}" != "" ]; then SESSION_NAME="${SESSION_NAME}_st${SESSION_TYPE}${X2GO_CMD}_dp${COLORDEPTH}" @@ -269,54 +230,55 @@ while [ "${OUTPUT}" != "inserted" ]; do # sanitize session name SESSION_NAME="$(perl -pe "s/[^a-zA-Z0-9\.\_\-\@]//g" <<< "${SESSION_NAME}")" - OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" - # Catching errors here would be nice, but the current layout doesn't allow this. - # Keep this in mind as a FIXME. - #if [[ "${?}" -ne "0" ]]; then - # typeset msg="Unable to insert new session into database; parameters: port (${X2GO_PORT}), hostname (${current_host_name}) and session name (${SESSION_NAME})." - # "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - # - # # Make x2goclient fail. - # echo "${msg}" >&2 - # exit "11" - #fi + output="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" + + if [[ "${output}" = "inserted" ]]; then + break + else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert display port into database. Retrying (run $((retry + 1)))." + fi + else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free display number available, cannot start new session. Retrying (run $((retry + 1)))." fi done +if [[ "${output}" != "inserted" ]]; then + typeset msg="Unable to find free display port or insert new session into database; parameters: port (${X2GO_PORT}), hostname (${current_host_name}) and session name (${SESSION_NAME})." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + + # Make x2goclient fail. + echo "${msg}" >&2 + exit "11" +fi while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do - OUTPUT="" - while [ "${OUTPUT}" != "inserted" ]; do - SSH_PORT="$((SSH_PORT + 1))" - - # Get all used in system ports from X2Go database and ss output - USED_PORTS="$( - "$X2GO_LIB_PATH/x2gogetports" "${current_host_name}"; - "${ss}" -nt -all | - awk '{ n=split($0,lines,"\n"); for(i=1;i<=n;i++){split (lines[i],words," ");delim=split(words[4],ports,":"); if(delim>1)printf ("|%s|\n",ports[delim])} }'; - )" - - # get free port - SSH_PORT=`echo "for(\\$i=$SSH_PORT;\\$br ne \"true\";\\$i++){ if(\"$USED_PORTS\" =~ m/\\|\\$i\\|/){\\$br=\"false\";}else{\\$br=\"true\";print \\$i;}}"|perl` - - # check if port in /etc/services - SERV="$(grep "${SSH_PORT}" "/etc/services")" - if [ "${SERV}" == "" ]; then - OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" - - # Catching errors here would be nice, but the current layout doesn't allow this. - # Keep this in mind as a FIXME. - #if [[ "${?}" -ne "0" ]]; then - # typeset msg="Unable to insert new port into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." - # "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - # - # # Make x2goclient fail. - # echo "${msg}" >&2 - # exit "12" - #fi + output='' + for ((retry = 0; retry < max_retry; ++retry)); do + free_port='0' + if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'lowlevel' "${SSH_PORT}")"; then + SSH_PORT="${free_port}" + + output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" + + if [[ "${output}" = "inserted" ]]; then + break + else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert port into database. Retrying (run $((retry + 1)))." + fi + else + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free port available, cannot start new session. Retrying (run $((retry + 1)))." fi done + if [[ "${output}" != "inserted" ]]; then + typeset msg="Unable to find free port or insert new session into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + + # Make x2goclient fail. + echo "${msg}" >&2 + exit "12" + fi + if [ -z "${GR_PORT}" ]; then GR_PORT="${SSH_PORT}" elif [ -z "${SOUND_PORT}" ]; then -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit fdd8a9df7d4fb69e89b638eee9d7c5d069bf910e Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 02:37:24 2018 +0100 x2goserver/bin/x2goresume-session: fix shellcheck warnings, use bash-style tests, more quotes, curly braces, wrap literal strings in single quotes, avoid useless constructs, fix whitespace errors and probably more. --- debian/changelog | 4 + x2goserver/bin/x2goresume-session | 319 ++++++++++++++++++-------------------- 2 files changed, 159 insertions(+), 164 deletions(-) diff --git a/debian/changelog b/debian/changelog index 6d58239..7e9bca9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -58,6 +58,10 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium resumption fail. - x2goserver/bin/x2gostartagent: fix hostname detection. Only error out if the hostname call actually failed, not the other way around. + - x2goserver/bin/x2goresume-session: fix shellcheck warnings, use + bash-style tests, more quotes, curly braces, wrap literal strings in + single quotes, avoid useless constructs, fix whitespace errors and + probably more. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 0d2d8ce..840dbae 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2007-2015 X2Go Project - http://wiki.x2go.org +# Copyright (C) 2007-2018 X2Go Project - http://wiki.x2go.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,29 +20,28 @@ # Copyright (C) 2007-2015 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> # Copyright (C) 2007-2015 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> -X2GO_LIB_PATH="$(x2gopath "libexec")" +X2GO_LIB_PATH="$(x2gopath 'libexec')" -if [ $# -lt 7 ] -then - msg="not enough command line arguments" - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -1 +if [[ "${#}" -lt '7' ]]; then + typeset msg='not enough command line arguments' + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '1' fi -SESSION_NAME="$1" -X2GO_GEOMETRY="$2" -X2GO_LINK="$3" -X2GO_PACK="$4" -X2GO_KBD_LAYOUT="$5" -X2GO_KBD_TYPE="$6" -X2GO_SET_KBD="$7" -X2GO_CLIPBOARD="$8" +SESSION_NAME="${1}" +X2GO_GEOMETRY="${2}" +X2GO_LINK="${3}" +X2GO_PACK="${4}" +#X2GO_KBD_LAYOUT="${5}" +X2GO_KBD_TYPE="${6}" +X2GO_SET_KBD="${7}" +X2GO_CLIPBOARD="${8}" -X2GO_AGENT_PID=`$X2GO_LIB_PATH/x2gogetagent "$SESSION_NAME"` +X2GO_AGENT_PID="$("${X2GO_LIB_PATH}/x2gogetagent" "${SESSION_NAME}")" X2GO_ROOT="${HOME}/.x2go" -X2GO_RESIZE=1 -X2GO_FULLSCREEN=0 +X2GO_RESIZE='1' +X2GO_FULLSCREEN='0' # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this # variable is not already set in the environment. @@ -55,138 +54,132 @@ X2GO_FULLSCREEN=0 # system host name. # # Workaround: use hostname. -typeset current_host_name="" -current_host_name="$(hostname)" +typeset current_host_name='' -if [[ "${?}" -ne "0" ]]; then +if ! current_host_name="$(hostname)"; then typeset msg="Unable to retrieve machine's hostname. This is required. Aborting session startup." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit 1 + exit '2' fi # refresh up ssh-agent-forwarding socket file symlink -X2GOSSH_AUTH_SOCK="$X2GO_ROOT/C-$SESSION_NAME/ssh-agent.PID" -if [ -L "$X2GOSSH_AUTH_SOCK" ]; then - rm -f "$X2GOSSH_AUTH_SOCK" +X2GOSSH_AUTH_SOCK="${X2GO_ROOT}/C-${SESSION_NAME}/ssh-agent.PID" +if [[ -L "${X2GOSSH_AUTH_SOCK}" ]]; then + rm -f -- "${X2GOSSH_AUTH_SOCK}" fi -if [ -S "$SSH_AUTH_SOCK" ]; then - ln -sf "$SSH_AUTH_SOCK" "$X2GOSSH_AUTH_SOCK" +if [[ -S "${SSH_AUTH_SOCK}" ]]; then + ln -sf -- "${SSH_AUTH_SOCK}" "${X2GOSSH_AUTH_SOCK}" fi -STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"` +STATE="$("${X2GO_LIB_PATH}/x2gogetagentstate" "${SESSION_NAME}")" # exit if session terminated -if [ "$STATE" == "TERMINATED" ] || [ "$STATE" == "TERMINATING" ] -then - msg="session $SESSION_NAME terminated" - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -1 +if [[ "${STATE}" = 'TERMINATED' ]] || [[ "${STATE}" = 'TERMINATING' ]]; then + typeset msg="session ${SESSION_NAME} terminated" + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '3' fi -i=0 +typeset -i i='0' # wait 15 sec. for starting session -while [ "$STATE" == "RESUMING" ] || [ "$STATE" == "STARTING" ] -do - sleep 1 - i=$(($i+1)) +while [[ "${STATE}" = 'RESUMING' ]] || [[ "${STATE}" = 'STARTING' ]]; do + sleep '1' + ((++i)) #if session still not started, try to suspend it - if [ $i -gt 15 ] - then - x2gosuspend-session "$SESSION_NAME" - sleep 2 - i=0 + if [[ "${i}" -gt '15' ]]; then + x2gosuspend-session "${SESSION_NAME}" + sleep '2' + i='0' fi - STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"` + STATE="$("${X2GO_LIB_PATH}/x2gogetagentstate" "${SESSION_NAME}")" done #suspend running session -if [ "$STATE" == "RUNNING" ] -then - x2gosuspend-session "$SESSION_NAME" - sleep 2 - STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"` +if [[ "${STATE}" = 'RUNNING' ]]; then + x2gosuspend-session "${SESSION_NAME}" + sleep '2' + STATE="$("${X2GO_LIB_PATH}/x2gogetagentstate" "${SESSION_NAME}")" fi -i=0 +i='0' # wait 45 sec., while session suspending -while [ "$STATE" == "SUSPENDING" ] -do - sleep 1 - i=$(($i+1)) - if [ $i -gt 45 ] - then - msg="it is taking too long to suspend the session-to-be-resumed; it is possible that the session is in a damaged state" - echo "$msg" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$msg" - exit -1; +while [[ "${STATE}" = 'SUSPENDING' ]]; do + sleep '1' + ((++i)) + if [[ "${i}" -gt '45' ]]; then + msg='it is taking too long to suspend the session-to-be-resumed; it is possible that the session is in a damaged state' + echo "${msg}" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '4' fi - STATE=`$X2GO_LIB_PATH/x2gogetagentstate "$SESSION_NAME"` + STATE="$("${X2GO_LIB_PATH}/x2gogetagentstate" "${SESSION_NAME}")" done -$X2GO_LIB_PATH/x2gormforward "$SESSION_NAME" +"${X2GO_LIB_PATH}/x2gormforward" "${SESSION_NAME}" -NX_XINERAMA_CONF="$X2GO_ROOT/C-$SESSION_NAME/xinerama.conf" -if [ -e "$NX_XINERAMA_CONF" ] -then - rm "$NX_XINERAMA_CONF" +NX_XINERAMA_CONF="${X2GO_ROOT}/C-${SESSION_NAME}/xinerama.conf" +if [[ -e "${NX_XINERAMA_CONF}" ]]; then + rm -- "${NX_XINERAMA_CONF}" fi -$X2GO_LIB_PATH/x2gosyslog "$0" "info" "$(basename $0) called with options: $@" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "$(basename "${0}") called with options: ${*}" # rootless sessions of geometry fullscreen are invalid -if [ "$X2GO_GEOMETRY" == "fullscreen" ] && [ "$SESSION_TYPE" == "R" ]; then - X2GO_GEOMETRY="" +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]] && [[ "${SESSION_TYPE}" = 'R' ]]; then + X2GO_GEOMETRY='' fi # no geometry for desktop sessions shall result in fullscreen desktop sessions -if [ "$X2GO_GEOMETRY" == "" ] && [ "$SESSION_TYPE" == "D" ]; then +if [[ -z "${X2GO_GEOMETRY}" ]] && [[ "${SESSION_TYPE}" = 'D' ]]; then X2GO_GEOMETRY="fullscreen" fi -if [ "$X2GO_GEOMETRY" == "fullscreen" ]; then - X2GO_FULLSCREEN=1 +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]]; then + X2GO_FULLSCREEN='1' fi -SESSIONINFO=`x2golistsessions | grep "${SESSION_NAME}" | sed "s/|/,/g"` +SESSIONINFO="$(x2golistsessions | grep "${SESSION_NAME}" | sed 's/|/,/g')" -GR_PORT=`echo "$SESSIONINFO" | awk -F, {'print $9'}` -SOUND_PORT=`echo "$SESSIONINFO" | awk -F, {'print $10'}` -FS_PORT=`echo "$SESSIONINFO" | awk -F, {'print $14'}` -SERVER=`echo "$SESSIONINFO" | awk -F, {'print $4'}` +GR_PORT="$(awk -F ',' '{print $9}' <<< "${SESSIONINFO}")" +SOUND_PORT="$(awk -F ',' '{print $10}' <<< "${SESSIONINFO}")" +FS_PORT="$(awk -F ',' '{print $14}' <<< "${SESSIONINFO}")" +#SERVER="$(awk -F ',' '{print $4}' <<< "${SESSIONINFO}")" -$X2GO_LIB_PATH/x2gosyslog "$0" "debug" "old ports: $GR_PORT, $SOUND_PORT, $FS_PORT" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "old ports: ${GR_PORT}, ${SOUND_PORT}, ${FS_PORT}" +### FIXME ### +### THIS NEVER WORKED CORRECTLY SINCE ${SYSTEM_PORTS} HAS BEEN REPLACED BY A ${USED_PORTS} COPY ### #check if saved in DB ports free -if grep -q "|${GR_PORT}|" <<<$SYSTEM_PORTS ; then - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port $GR_PORT is already in use" +if grep -q "|${GR_PORT}|" <<< "${SYSTEM_PORTS}"; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${GR_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${GR_PORT}" - GR_PORT="" + GR_PORT='' fi -if grep -q "|${SOUND_PORT}|" <<<$SYSTEM_PORTS ; then - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port $SOUND_PORT is already in use" +if grep -q "|${SOUND_PORT}|" <<< "${SYSTEM_PORTS}"; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${SOUND_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${SOUND_PORT}" - SOUND_PORT="" + SOUND_PORT='' fi -if grep -q "|${FS_PORT}|" <<<$SYSTEM_PORTS ; then - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port "$FS_PORT" is already in use" +if grep -q "|${FS_PORT}|" <<< "${SYSTEM_PORTS}"; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${FS_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${FS_PORT}" - FS_PORT="" + FS_PORT='' fi if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then typeset msg="Unable to get (pseudo-)randomized starting port value." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "1" + exit '5' fi # define the full path to the ss utility @@ -196,7 +189,7 @@ typeset -i retry='0' typeset -i max_retry='10' typeset -i free_port='0' typeset output='' -while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do +while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]]; do output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' @@ -205,28 +198,28 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" - if [[ "${output}" = "inserted" ]]; then + if [[ "${output}" = 'inserted' ]]; then break else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert port into database. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "unable to insert port into database. Retrying (run $((retry + 1)))." fi else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free port available, cannot start new session. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "no free port available, cannot start new session. Retrying (run $((retry + 1)))." fi done - if [[ "${output}" != "inserted" ]]; then + if [[ "${output}" != 'inserted' ]]; then typeset msg="Unable to find free port or insert new session into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "12" + exit '6' fi - if [ -z "${GR_PORT}" ]; then + if [[ -z "${GR_PORT}" ]]; then GR_PORT="${SSH_PORT}" - elif [ -z "${SOUND_PORT}" ]; then + elif [[ -z "${SOUND_PORT}" ]]; then SOUND_PORT="${SSH_PORT}" else FS_PORT="${SSH_PORT}" @@ -235,100 +228,98 @@ done SESSION_DIR="${X2GO_ROOT}/C-${SESSION_NAME}" -OPTIONS=`cat ${SESSION_DIR}/options` - -LSTR=`echo "$OPTIONS" | awk -F, {'print $2'}` -PSTR=`echo "$OPTIONS" | awk -F, {'print $3'}` -KTSTR=`echo "$OPTIONS" | awk -F, {'print $12'}` -GSTR=`echo "$OPTIONS" | awk -F, {'print $13'}` -test_GSTR=`echo $GSTR | sed s/geometry=.*//` -if [ -n "$test_GSTR" ]; then - GSTR="geometry=" - RSTR=`echo "$OPTIONS" | awk -F, {'print $13'}` - FSTR=`echo "$OPTIONS" | awk -F, {'print $14'}` - LISTSTR=`echo "$OPTIONS" | awk -F, {'print $16'}` - CLIPBOARD=`echo "$OPTIONS" | awk -F, {'print $17'}` +OPTIONS="$(< "${SESSION_DIR}/options")" + +LSTR="$(awk -F ',' '{print $2}' <<< "${OPTIONS}")" +PSTR="$(awk -F ',' '{print $3}' <<< "${OPTIONS}")" +KTSTR="$(awk -F ',' '{print $12}' <<< "${OPTIONS}")" +GSTR="$(awk -F ',' '{print $13}' <<< "${OPTIONS}")" +test_GSTR="$(sed 's/geometry=.*//' <<< "${GSTR}")" +if [[ -n "${test_GSTR}" ]]; then + GSTR='geometry=' + RSTR="$(awk -F ',' '{print $13}' <<< "${OPTIONS}")" + FSTR="$(awk -F ',' '{print $14}' <<< "${OPTIONS}")" + LISTSTR="$(awk -F ',' '{print $16}' <<< "${OPTIONS}")" + CLIPBOARD="$(awk -F ',' '{print $17}' <<< "${OPTIONS}")" else - RSTR=`echo "$OPTIONS" | awk -F, {'print $14'}` - FSTR=`echo "$OPTIONS" | awk -F, {'print $15'}` - LISTSTR=`echo "$OPTIONS" | awk -F, {'print $17'}` - CLIPBOARD=`echo "$OPTIONS" | awk -F, {'print $18'}` + RSTR="$(awk -F ',' '{print $14}' <<< "${OPTIONS}")" + FSTR="$(awk -F ',' '{print $15}' <<< "${OPTIONS}")" + LISTSTR="$(awk -F ',' '{print $17}' <<< "${OPTIONS}")" + CLIPBOARD="$(awk -F ',' '{print $18}' <<< "${OPTIONS}")" fi -KTSTR=`echo "$KTSTR" | sed "s/\//\\\\\\\\\//"` -X2GO_KBD_TYPE=`echo "$X2GO_KBD_TYPE" | sed "s/\//\\\\\\\\\//"` +KTSTR="$(sed -e 's#/#\\/#' <<< "${KTSTR}")" +X2GO_KBD_TYPE="$(sed -e 's#/#\\/#' <<< "${X2GO_KBD_TYPE}")" -if [ "$X2GO_SET_KBD" == "0" ] || [ "$X2GO_KBD_TYPE" == "auto" ]; then - keyboard_type="null\/null" +if [[ "${X2GO_SET_KBD}" = '0' ]] || [[ "${X2GO_KBD_TYPE}" = 'auto' ]]; then + keyboard_type='null\/null' else - keyboard_type="$X2GO_KBD_TYPE" + keyboard_type="${X2GO_KBD_TYPE}" fi -if [ -n "$X2GO_CLIPBOARD" ] && [ -z "`echo $X2GO_CLIPBOARD | sed -re 's/(0|none|client|server|both|1)//'`" ]; then - clipboard="clipboard=$X2GO_CLIPBOARD" +typeset tmp_regex='^(0|none|client|server|both|1)$' +if [[ -n "${X2GO_CLIPBOARD}" ]] && [[ "${X2GO_CLIPBOARD}" =~ ${tmp_regex} ]]; then + clipboard="clipboard=${X2GO_CLIPBOARD}" else - clipboard="clipboard=both" + clipboard='clipboard=both' fi -NEWOPTIONS=`echo "$OPTIONS" | sed -e "s/$LSTR/link=$X2GO_LINK/"\ - -e "s/$PSTR/pack=$X2GO_PACK/"\ - -e "s/$KTSTR/kbtype=$keyboard_type/"\ - -e "s/$GSTR/geometry=$X2GO_GEOMETRY/"\ - -e "s/$RSTR/resize=$X2GO_RESIZE/"\ - -e "s/$LISTSTR/listen=$GR_PORT/"\ - -e "s/$FSTR/fullscreen=$X2GO_FULLSCREEN/" \ - -e "s/$CLIPBOARD/$clipboard/" \ -` - -if [ -z "$X2GO_GEOMETRY" ] || [ "$X2GO_GEOMETRY" == "fullscreen" ]; then - NEWOPTIONS=`echo $NEWOPTIONS | sed -e "s/geometry=${X2GO_GEOMETRY},//"` +NEWOPTIONS="$(sed -e "s/${LSTR}/link=${X2GO_LINK}/" \ + -e "s/${PSTR}/pack=${X2GO_PACK}/" \ + -e "s/${KTSTR}/kbtype=${keyboard_type}/" \ + -e "s/${GSTR}/geometry=${X2GO_GEOMETRY}/" \ + -e "s/${RSTR}/resize=${X2GO_RESIZE}/" \ + -e "s/${LISTSTR}/listen=${GR_PORT}/" \ + -e "s/${FSTR}/fullscreen=${X2GO_FULLSCREEN}/" \ + -e "s/${CLIPBOARD}/${clipboard}/" <<< "${OPTIONS}")" + +if [[ -z "${X2GO_GEOMETRY}" ]] || [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]]; then + NEWOPTIONS="$(sed -e "s/geometry=${X2GO_GEOMETRY},//" <<< "${NEWOPTIONS}")" fi -X2GO_CLIENT=`echo "$SSH_CLIENT" | awk '{print $1}'` -if [ "$X2GO_CLIENT" == "" ] -then +X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CLIENT}")" +if [[ -z "${X2GO_CLIENT}" ]]; then X2GO_CLIENT="${current_host_name}" fi -echo "$NEWOPTIONS" >"${SESSION_DIR}/options" +echo "${NEWOPTIONS}" >"${SESSION_DIR}/options" # run x2goserver-extensions for pre-resume -x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" pre-resume || true +x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'pre-resume' || true # clear old keyboard file -rm -Rf $SESSION_DIR/keyboard - -if kill -HUP $X2GO_AGENT_PID &>/dev/null; then +rm -Rf "${SESSION_DIR}/keyboard" - $X2GO_LIB_PATH/x2goresume "$X2GO_CLIENT" "$SESSION_NAME" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" > /dev/null - $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "client $X2GO_CLIENT has successfully resumed session with ID $SESSION_NAME" +if kill -HUP "${X2GO_AGENT_PID}" &>'/dev/null'; then + "${X2GO_LIB_PATH}/x2goresume" "${X2GO_CLIENT}" "${SESSION_NAME}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" >'/dev/null' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'notice' "client ${X2GO_CLIENT} has successfully resumed session with ID ${SESSION_NAME}" # set client-side keyboard model, type, variant, etc. - if [ "$X2GO_SET_KBD" != "0" ] && [ "$X2GO_KBD_TYPE" == "auto" ]; then - X2GO_DISPLAY=$(echo $SESSION_NAME | cut -d"-" -f2) - export DISPLAY=:$X2GO_DISPLAY.0 - x2gosetkeyboard "$SESSION_NAME" >/dev/null 2>/dev/null & + if [[ "${X2GO_SET_KBD}" != '0' ]] && [[ "${X2GO_KBD_TYPE}" = 'auto' ]]; then + X2GO_DISPLAY="$(cut -d '-' -f '2' <<< "${SESSION_NAME}")" + export DISPLAY=":${X2GO_DISPLAY}.0" + x2gosetkeyboard "${SESSION_NAME}" &>'/dev/null' & fi # resume x2godesktopsharing, if it has been in use before the session got suspended - x2gofeature X2GO_DESKTOPSHARING &>/dev/null && x2goresume-desktopsharing "$SESSION_NAME" || true + x2gofeature 'X2GO_DESKTOPSHARING' &>'/dev/null' && x2goresume-desktopsharing "${SESSION_NAME}" || true # run x2goserver-extensions for post-resume - x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" post-resume || true - grep PPid /proc/$PPID/status > $X2GO_ROOT/C-$SESSION_NAME/sshd.pid + x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'post-resume' || true + grep 'PPid' "/proc/${PPID}/status" >"${X2GO_ROOT}/C-${SESSION_NAME}/sshd.pid" else - err_msg="ERROR: failed to resume session with ID $SESSION_NAME" - echo "$err_msg" 1>&2 - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "$err_msg" + err_msg="ERROR: failed to resume session with ID ${SESSION_NAME}" + echo "${err_msg}" 1>&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${err_msg}" - # If we reach here it means that the x2goagent process of the session has vanisshed + # If we reach here it means that the x2goagent process of the session has vanished # If this happens than we mark the session as finished... - $X2GO_LIB_PATH/x2gochangestatus 'F' "$SESSION_NAME" > /dev/null + "${X2GO_LIB_PATH}/x2gochangestatus" 'F' "${SESSION_NAME}" >'/dev/null' # run x2goserver-extensions for fail-resume - x2gofeature X2GO_RUN_EXTENSIONS &>/dev/null && x2goserver-run-extensions "$SESSION_NAME" fail-resume || true + x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'fail-resume' || true fi -echo "gr_port=$GR_PORT" -echo "sound_port=$SOUND_PORT" -echo "fs_port=$FS_PORT" +echo "gr_port=${GR_PORT}" +echo "sound_port=${SOUND_PORT}" +echo "fs_port=${FS_PORT}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit daa6a6a36e84edd79b0aa838b6e7eb5145e79298 Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 02:35:38 2018 +0100 x2goserver/bin/x2gostartagent: fix hostname detection. Only error out if the hostname call actually failed, not the other way around. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index f8582d4..6d58239 100644 --- a/debian/changelog +++ b/debian/changelog @@ -56,6 +56,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium rely on it returning a valid value and try at most 10 times to fetch a usable port value, then error out and make the session startup or resumption fail. + - x2goserver/bin/x2gostartagent: fix hostname detection. Only error out if + the hostname call actually failed, not the other way around. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index d11221a..cb37580 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -71,7 +71,7 @@ fi # Workaround: use hostname. typeset current_host_name="" -if current_host_name="$(hostname)"; then +if ! current_host_name="$(hostname)"; then typeset msg="Unable to retrieve machine's hostname. This is required. Aborting session startup." "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 2c18015e2915b24f7f97e64a27dcf3fd493ba1a1 Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 03:30:57 2018 +0100 x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. --- debian/changelog | 1 + x2goserver/lib/x2gogetfreeport | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1c1ebb1..2aad67f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -65,6 +65,7 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/bin/x2gostartagent: use single quotes for literal strings, bash-style checks, more curly braces, terminate options for commands that use outside input (variables), fix copyright notice. + - x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2gogetfreeport b/x2goserver/lib/x2gogetfreeport index 2f91297..bf109e7 100755 --- a/x2goserver/lib/x2gogetfreeport +++ b/x2goserver/lib/x2gogetfreeport @@ -28,25 +28,25 @@ # Prints the first free port value on success, or the initial start # port number on failure. # Returns 0 on success or non-0 on failure. -typeset ss="${1:-"ss"}" -typeset type="${2:-"lowlevel"}" -typeset start="${3:-"1"}" -typeset end="${4:-"65535"}" +typeset ss="${1:-'ss'}" +typeset type="${2:-'lowlevel'}" +typeset start="${3:-'1'}" +typeset end="${4:-'65535'}" # Check parameter sanity. typeset empty_regex='^[[:space:]]*$' if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then - exit "1" + exit '1' fi typeset -i start_i="${start}" typeset -i end_i="${end}" if [[ -z "${start}" ]] || [[ "${start}" != "${start_i}" ]] || [[ "${start}" -ne "${start_i}" ]]; then - exit "2" + exit '2' fi if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]]; then - exit "3" + exit '3' fi -[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit "4" +[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit '4' # Skip unnecessary work. @@ -66,7 +66,7 @@ if [[ "${type}" = 'display' ]]; then # Then, normal word splitting kicks in and the -a flag tells # read to put all words into elements of the provided array # variable. - IFS="${IFS}|" read -r -d '' -a used_displays_work < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") + IFS="${IFS}|" read -r -d '' -a 'used_displays_work' < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") # Filter out any empty or invalid values. typeset -i item_i='0' @@ -87,8 +87,8 @@ typeset -a used_ports typeset -a used_ports_work used_ports=() used_ports_work=() -IFS="${IFS}|" read -r -d '' -a used_ports_work < <("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; - "${ss}" -nt -all | awk ' +IFS="${IFS}|" read -r -d '' -a 'used_ports_work' < <("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; + "${ss}" -nt -all | awk ' { n = split ($0, lines, "\n"); for (i = 1; i <= n; ++i) { @@ -116,27 +116,27 @@ typeset -i stop_port='65535' [[ "${type}" = 'display' ]] && stop_port="$((stop_port - 6000))" # Find the next free port number. for ((work_port = start; i <= stop_port; ++work_port)); do - typeset -i i="0" - typeset -i value_found="0" + typeset -i i='0' + typeset -i value_found='0' if [[ "${type}" = 'display' ]]; then for ((i = 0; i < ${#used_displays[@]}; ++i)); do if [[ "${used_displays[i]}" = "${work_port}" ]]; then # We need to continue with the next port number, # this one is taken. - value_found="1" + value_found='1' break fi done # Check if such a socket is already in use system-wide. - if "${ss}" -lxs 2>"/dev/null" | grep -Eqs "(@|)/tmp/.X11-unix/X${work_port}(|-lock) " >"/dev/null"; then + if "${ss}" -lxs 2>'/dev/null' | grep -Eqs "(@|)/tmp/.X11-unix/X${work_port}(|-lock) " >'/dev/null'; then continue fi fi # Port number taken? Continue with the next one. - [[ "${value_found}" -ne "0" ]] && continue + [[ "${value_found}" -ne '0' ]] && continue # Check raw port number. Either to make sure that the corresponding # raw port for the DISPLAY port found is still free, or also in the @@ -145,16 +145,16 @@ for ((work_port = start; i <= stop_port; ++work_port)); do [[ "${type}" = 'display' ]] && map_port="$((map_port + 6000))" for ((i = 0; i < ${#used_ports[@]}; ++i)); do if [[ "${used_ports[i]}" = "${map_port}" ]]; then - value_found="1" + value_found='1' break fi done # Port number taken? Continue with the next one. - [[ "${value_found}" -ne "0" ]] && continue + [[ "${value_found}" -ne '0' ]] && continue # If the port is a well-known one, don't block it. - grep -qs "${work_port}" "/etc/services" &>"/dev/null" && continue + grep -qs "${work_port}" '/etc/services' &>'/dev/null' && continue # Searched the array and got nothing? Great, grab that port number! ret_port="${work_port}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 9de1883d8ee6b71e3d936a67eef651c8f761ba0b Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 03:11:27 2018 +0100 x2goserver/bin/x2gostartagent: use single quotes for literal strings, bash-style checks, more curly braces, terminate options for commands that use outside input (variables), fix copyright notice. --- debian/changelog | 3 + x2goserver/bin/x2gostartagent | 304 +++++++++++++++++++++--------------------- 2 files changed, 155 insertions(+), 152 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7e9bca9..1c1ebb1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -62,6 +62,9 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium bash-style tests, more quotes, curly braces, wrap literal strings in single quotes, avoid useless constructs, fix whitespace errors and probably more. + - x2goserver/bin/x2gostartagent: use single quotes for literal strings, + bash-style checks, more curly braces, terminate options for commands + that use outside input (variables), fix copyright notice. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index cb37580..be4a27b 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2007-20157 X2Go Project - http://wiki.x2go.org +# Copyright (C) 2007-2018 X2Go Project - http://wiki.x2go.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,42 +20,42 @@ # Copyright (C) 2007-2017 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> # Copyright (C) 2007-2017 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> -X2GO_LIB_PATH="$(x2gopath "libexec")" +X2GO_LIB_PATH="$(x2gopath 'libexec')" -"${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "$(basename "${0}") called with options: ${*}" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "$(basename "${0}") called with options: ${*}" if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then - typeset msg="Unable to get (pseudo-)randomized starting port value." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + typeset msg='Unable to get (pseudo-)randomized starting port value.' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "1" + exit '1' fi -X2GO_PORT="50" +X2GO_PORT='50' # some sanity checks before session startup... -if grep -E "^backend[ ]*=[ ]*postgres" "/etc/x2go/x2gosql/sql" 1>"/dev/null" 2>"/dev/null" && [ "x${USER}" = "xroot" ]; then - msg="The super-user \"root\" is not allowed to launch X2Go sessions." +if grep -E -- '^backend[ ]*=[ ]*postgres' '/etc/x2go/x2gosql/sql' &>'/dev/null' && [[ "${USER}" = 'root' ]]; then + msg='The super-user "root" is not allowed to launch X2Go sessions.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "2" -elif [ -z "${USER}" ]; then - msg="The \$USER environment variable is not set. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '2' +elif [[ -z "${USER}" ]]; then + msg='The $USER environment variable is not set. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "3" -elif [ -z "${HOME}" ]; then - msg="The \$HOME environment variable is not set. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '3' +elif [[ -z "${HOME}" ]]; then + msg='The $HOME environment variable is not set. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "4" -elif ! iconv -f ASCII -t ASCII &>"/dev/null" <<< "${HOME}"; then - msg="Your home directory path contains non-ASCII characters. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '4' +elif ! iconv -f 'ASCII' -t 'ASCII' &>'/dev/null' <<< "${HOME}"; then + msg='Your home directory path contains non-ASCII characters. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "5" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '5' fi # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this @@ -69,47 +69,47 @@ fi # system host name. # # Workaround: use hostname. -typeset current_host_name="" +typeset current_host_name='' if ! current_host_name="$(hostname)"; then - typeset msg="Unable to retrieve machine's hostname. This is required. Aborting session startup." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + typeset msg='Unable to retrieve machine'"'"'s hostname. This is required. Aborting session startup.' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "6" + exit '6' fi X2GO_ROOT="${HOME}/.x2go" export NX_ROOT="${X2GO_ROOT}" -X2GO_NXAGENT_DEFAULT_OPTIONS="-extension GLX -nolisten tcp" +X2GO_NXAGENT_DEFAULT_OPTIONS='-extension GLX -nolisten tcp' -if [ -r "/etc/x2go/x2goagent.options" ]; then - source "/etc/x2go/x2goagent.options" +if [[ -r '/etc/x2go/x2goagent.options' ]]; then + source '/etc/x2go/x2goagent.options' fi -if [ -z "${X2GO_NXAGENT_OPTIONS}" ]; then +if [[ -z "${X2GO_NXAGENT_OPTIONS}" ]]; then X2GO_NXAGENT_OPTIONS="${X2GO_NXAGENT_DEFAULT_OPTIONS}" fi -REMOTE="localhost" +REMOTE='localhost' # shadow sessions (via x2godesktopsharing) set the X2GO_CLIENT var in the process environment # so either it is already set or we obtain it from SSH_CLIENT/SSH_CONNECTION -if [ -z "${X2GO_CLIENT}" ] && [ -n "${SSH_CLIENT}" ]; then +if [[ -z "${X2GO_CLIENT}" ]] && [[ -n "${SSH_CLIENT}" ]]; then X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CLIENT}")" -elif [ -z "${X2GO_CLIENT}" ] && [ -n "${SSH_CONNECTION}" ]; then +elif [[ -z "${X2GO_CLIENT}" ]] && [[ -n "${SSH_CONNECTION}" ]]; then X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CONNECTION}")" fi -if [ -z "${X2GO_CLIENT}" ]; then - msg="The \$X2GO_CLIENT environment variable is not set. Possible reasons: \$SSH_CLIENT not set or \$SSH_CONNECTION not set. Or \$X2GO_CLIENT not set by ,,X2Go Desktop Sharing'' applet. Aborting session startup." +if [[ -z "${X2GO_CLIENT}" ]]; then + msg='The $X2GO_CLIENT environment variable is not set. Possible reasons: $SSH_CLIENT not set or $SSH_CONNECTION not set. Or $X2GO_CLIENT not set by the "X2Go Desktop Sharing" applet. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "7" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '7' fi -"${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "client announced itself as ,,${X2GO_CLIENT}''" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "client announced itself as "'"'"${X2GO_CLIENT}"'"' X2GO_GEOMETRY="${1}"; shift X2GO_LINK="${1}"; shift @@ -120,53 +120,53 @@ X2GO_KBD_TYPE="${1}"; shift X2GO_SET_KBD="${1}"; shift X2GO_STYPE="${1}"; shift X2GO_CMD="${1}"; shift -X2GO_RESIZE="1" -X2GO_FULLSCREEN="0" +X2GO_RESIZE='1' +X2GO_FULLSCREEN='0' -X2GO_CLIPBOARD="" +X2GO_CLIPBOARD='' : "${XAUTHORITY:="${HOME}/.Xauthority"}" -if [ "${X2GO_STYPE}" == "S" ]; then +if [[ "${X2GO_STYPE}" = 'S' ]]; then SHADOW_MODE="$(awk '{split($0,a,"XSHAD"); print a[1]}' <<< "${X2GO_CMD}")" SHADOW_USER="$(awk '{split($0,a,"XSHAD"); print a[2]}' <<< "${X2GO_CMD}")" SHADOW_DESKTOP="$(awk '{split($0,a,"XSHAD"); print a[3]}' <<< "${X2GO_CMD}")" - if [ -z "${1}" ]; then + if [[ -z "${1}" ]]; then # can this line be removed? #echo "suser ${SHADOW_USER} user ${USER} " >>"/tmp/uagent" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "shadow session requested: mode ${SHADOW_MODE}, user: ${SHADOW_USER}, desktop: ${SHADOW_DESKTOP}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "shadow session requested: mode ${SHADOW_MODE}, user: ${SHADOW_USER}, desktop: ${SHADOW_DESKTOP}" else SHADREQ_USER="${1}"; shift - "${X2GO_LIB_PATH}/x2gosyslog" "$0" "debug" "preparing shadow session request for user ${SHADREQ_USER}, agent starts for user ${USER}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "preparing shadow session request for user ${SHADREQ_USER}, agent starts for user ${USER}" fi - if [ "${SHADOW_USER}" != "${USER}" ]; then + if [[ "${SHADOW_USER}" != "${USER}" ]]; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "user ,,${USER}'' requests desktop sharing from user ,,${SHADOW_USER}'' for desktop ,,${SHADOW_DESKTOP}''" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "executing command: x2godesktopsharing client ${X2GO_CLIENT} ${X2GO_GEOMETRY} ${X2GO_LINK} ${X2GO_PACK} ${X2GO_TYPE} ${X2GO_KBD_LAYOUT} ${X2GO_KBD_TYPE} ${X2GO_SET_KBD} ${X2GO_STYPE} ${X2GO_CMD} ${USER}" - OUTPUT="$(x2godesktopsharing "client" "${X2GO_CLIENT}" "${X2GO_GEOMETRY}" "${X2GO_LINK}" "${X2GO_PACK}" "${X2GO_TYPE}" "${X2GO_KBD_LAYOUT}" "${X2GO_KBD_TYPE}" "${X2GO_SET_KBD}" "${X2GO_STYPE}" "${X2GO_CMD}" "${USER}")" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "command result is: ${OUTPUT}" - if [ "${OUTPUT:0:4}" == "DENY" ]; then - echo "ACCESS DENIED" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'notice' "user "'"'"${USER}"'"'" requests desktop sharing from user "'"'"${SHADOW_USER}"'"'" for desktop "'"'"${SHADOW_DESKTOP}"'"' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "executing command: x2godesktopsharing client ${X2GO_CLIENT} ${X2GO_GEOMETRY} ${X2GO_LINK} ${X2GO_PACK} ${X2GO_TYPE} ${X2GO_KBD_LAYOUT} ${X2GO_KBD_TYPE} ${X2GO_SET_KBD} ${X2GO_STYPE} ${X2GO_CMD} ${USER}" + OUTPUT="$(x2godesktopsharing 'client' "${X2GO_CLIENT}" "${X2GO_GEOMETRY}" "${X2GO_LINK}" "${X2GO_PACK}" "${X2GO_TYPE}" "${X2GO_KBD_LAYOUT}" "${X2GO_KBD_TYPE}" "${X2GO_SET_KBD}" "${X2GO_STYPE}" "${X2GO_CMD}" "${USER}")" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "command result is: ${OUTPUT}" + if [[ "${OUTPUT:0:4}" = 'DENY' ]]; then + echo 'ACCESS DENIED' >&2 DENIAL_REASON="${OUTPUT:5}" - if [ -z "${DENIAL_REASON}" ]; then - DENIAL_REASON="the user ,,${SHADOW_USER}'' does not seem to have desktop sharing activated" + if [[ -z "${DENIAL_REASON}" ]]; then + DENIAL_REASON="the user "'"'"${SHADOW_USER}"'"'" does not seem to have desktop sharing activated" fi - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: user ${SHADOW_USER} denied desktop sharing session" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" - exit "8" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "ERROR: user ${SHADOW_USER} denied desktop sharing session" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" + exit '8' fi X2GO_COOKIE="$(awk '{print $2}' <<< "${OUTPUT}")" X2GO_PORT="$(awk '{print $1}' <<< "${OUTPUT}")" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "received shadow session information: cookie: ${X2GO_COOKIE}, port: ${X2GO_PORT}" - xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" - xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "received shadow session information: cookie: ${X2GO_COOKIE}, port: ${X2GO_PORT}" + xauth -f "${XAUTHORITY}" 'add' "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" + xauth -f "${XAUTHORITY}" 'add' "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" echo "${X2GO_PORT}" echo "${X2GO_COOKIE}" @@ -175,7 +175,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "0" + exit '0' else X2GO_CLIPBOARD="${1}"; shift fi @@ -184,29 +184,29 @@ fi LIMIT="$(x2gosessionlimit)" LWORD="$(awk '{print $1}' <<< "${LIMIT}")" -if [ "${LWORD}" == "LIMIT" ]; then +if [[ "${LWORD}" = 'LIMIT' ]]; then echo "${LIMIT}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "session limit has been reached for user ,,${USER}'', cannot start new session" - exit "10" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "session limit has been reached for user "'"'"${USER}"'"'", cannot start new session" + exit '10' fi export NX_CLIENT="${X2GO_LIB_PATH}/x2gosuspend-agent" COLORDEPTH="$(awk '{split($0,a,"-depth_"); print a[2]}' <<< "${X2GO_TYPE}")" -SESSION_TYPE="D" -NOEXITPARAM="" +SESSION_TYPE='D' +NOEXITPARAM='' -if [ "${X2GO_STYPE}" == "R" ]; then - SESSION_TYPE="R" -elif [ "${X2GO_STYPE}" == "P" ]; then - SESSION_TYPE="R" - NOEXITPARAM="-norootlessexit" -elif [ "${X2GO_STYPE}" == "S" ]; then - SESSION_TYPE="S" +if [[ "${X2GO_STYPE}" = 'R' ]]; then + SESSION_TYPE='R' +elif [[ "${X2GO_STYPE}" = 'P' ]]; then + SESSION_TYPE='R' + NOEXITPARAM='-norootlessexit' +elif [[ "${X2GO_STYPE}" = 'S' ]]; then + SESSION_TYPE='S' fi -if [ -z "${X2GO_CLIENT}" ]; then +if [[ -z "${X2GO_CLIENT}" ]]; then X2GO_CLIENT="${current_host_name}" fi @@ -221,37 +221,37 @@ for ((retry = 0; retry < max_retry; ++retry)); do if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'display' "${X2GO_PORT}")"; then X2GO_PORT="${free_port}" - SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" - if [ "${COLORDEPTH}" != "" ]; then + SESSION_NAME="${USER}-${X2GO_PORT}-$(date '+%s')" + if [[ -n "${COLORDEPTH}" ]]; then SESSION_NAME="${SESSION_NAME}_st${SESSION_TYPE}${X2GO_CMD}_dp${COLORDEPTH}" SESSION_NAME="${SESSION_NAME//:/PP}" fi # sanitize session name - SESSION_NAME="$(perl -pe "s/[^a-zA-Z0-9\.\_\-\@]//g" <<< "${SESSION_NAME}")" + SESSION_NAME="$(perl -pe 's/[^a-zA-Z0-9\.\_\-\@]//g' <<< "${SESSION_NAME}")" output="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" - if [[ "${output}" = "inserted" ]]; then + if [[ "${output}" = 'inserted' ]]; then break else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert display port into database. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "unable to insert display port into database. Retrying (run $((retry + 1)))." fi else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free display number available, cannot start new session. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "no free display number available, cannot start new session. Retrying (run $((retry + 1)))." fi done -if [[ "${output}" != "inserted" ]]; then +if [[ "${output}" != 'inserted' ]]; then typeset msg="Unable to find free display port or insert new session into database; parameters: port (${X2GO_PORT}), hostname (${current_host_name}) and session name (${SESSION_NAME})." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "11" + exit '11' fi -while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do +while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]]; do output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' @@ -260,28 +260,28 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" - if [[ "${output}" = "inserted" ]]; then + if [[ "${output}" = 'inserted' ]]; then break else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert port into database. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "unable to insert port into database. Retrying (run $((retry + 1)))." fi else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free port available, cannot start new session. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "no free port available, cannot start new session. Retrying (run $((retry + 1)))." fi done - if [[ "${output}" != "inserted" ]]; then + if [[ "${output}" != 'inserted' ]]; then typeset msg="Unable to find free port or insert new session into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "12" + exit '12' fi - if [ -z "${GR_PORT}" ]; then + if [[ -z "${GR_PORT}" ]]; then GR_PORT="${SSH_PORT}" - elif [ -z "${SOUND_PORT}" ]; then + elif [[ -z "${SOUND_PORT}" ]]; then SOUND_PORT="${SSH_PORT}" else FS_PORT="${SSH_PORT}" @@ -289,33 +289,33 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do done # rootless sessions of geometry fullscreen are invalid -if [ "${X2GO_GEOMETRY}" == "fullscreen" ] && [ "${SESSION_TYPE}" == "R" ]; then - X2GO_GEOMETRY="" +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]] && [[ "${SESSION_TYPE}" = 'R' ]]; then + X2GO_GEOMETRY='' fi # no geometry for desktop sessions shall result in fullscreen desktop sessions -if [ "${X2GO_GEOMETRY}" == "" ] && [ "${SESSION_TYPE}" == "D" ]; then - X2GO_GEOMETRY="fullscreen" +if [[ "${X2GO_GEOMETRY}" = '' ]] && [[ "${SESSION_TYPE}" = 'D' ]]; then + X2GO_GEOMETRY='fullscreen' fi -if [ "${X2GO_GEOMETRY}" == "fullscreen" ]; then - X2GO_FULLSCREEN="1" +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]]; then + X2GO_FULLSCREEN='1' fi # shadow sessions are never fullscreen session and adopt the original session's geometry -if [ "${X2GO_STYPE}" == "S" ]; then - X2GO_GEOMETRY="$(DISPLAY="${SHADOW_DESKTOP}" xwininfo -root | grep geometry)" - X2GO_GEOMETRY="$(sed -e "s/ //g" <<< "${X2GO_GEOMETRY}")" - X2GO_GEOMETRY="$(sed -e "s/-geometry//" <<< "${X2GO_GEOMETRY}")" +if [[ "${X2GO_STYPE}" = 'S' ]]; then + X2GO_GEOMETRY="$(DISPLAY="${SHADOW_DESKTOP}" xwininfo -root | grep 'geometry')" + X2GO_GEOMETRY="$(sed -e 's/ //g' <<< "${X2GO_GEOMETRY}")" + X2GO_GEOMETRY="$(sed -e 's/-geometry//' <<< "${X2GO_GEOMETRY}")" fi -if [ ! -d "${X2GO_ROOT}" ]; then - mkdir "${X2GO_ROOT}" +if [[ ! -d "${X2GO_ROOT}" ]]; then + mkdir -- "${X2GO_ROOT}" fi X2GO_TMP_ROOT="/tmp/.x2go-${USER}" -if [ ! -d "${X2GO_TMP_ROOT}" ]; then - mkdir "${X2GO_TMP_ROOT}" +if [[ ! -d "${X2GO_TMP_ROOT}" ]]; then + mkdir -- "${X2GO_TMP_ROOT}" fi SESSION_DIR="${X2GO_TMP_ROOT}/C-${SESSION_NAME}" @@ -323,48 +323,48 @@ STATE_FILE="${X2GO_ROOT}/C-${SESSION_NAME}/state" # do not use $TMP or $TEMP here, the session.log file location has to be accessible by root SESSION_LOG="${SESSION_DIR}/session.log" -mkdir -p "${SESSION_DIR}" -if [ "x${X2GO_STYPE}" = "xS" ]; then - chmod -f "0710" "${SESSION_DIR}" - if groups "${USER}" | grep "x2godesktopsharing" &>"/dev/null"; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "user ,,${USER}'' grants access to ${SESSION_DIR} for group ,,x2godesktopsharing''" - chown ":x2godesktopsharing" "${SESSION_DIR}" +mkdir -p -- "${SESSION_DIR}" +if [[ "${X2GO_STYPE}" = 'S' ]]; then + chmod -f '0710' -- "${SESSION_DIR}" + if groups "${USER}" | grep 'x2godesktopsharing' &>'/dev/null'; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "user "'"'"${USER}"'"'" grants access to ${SESSION_DIR} for group "'"'"x2godesktopsharing"'"' + chown -- ':x2godesktopsharing' "${SESSION_DIR}" fi else - chmod -f "0700" "${SESSION_DIR}" + chmod -f '0700' -- "${SESSION_DIR}" fi touch "${SESSION_LOG}" -chmod -f "0600" "${SESSION_LOG}" +chmod -f '0600' -- "${SESSION_LOG}" -if [ ! -d "${X2GO_ROOT}/ssh" ]; then - mkdir "${X2GO_ROOT}/ssh" +if [[ ! -d "${X2GO_ROOT}/ssh" ]]; then + mkdir -- "${X2GO_ROOT}/ssh" fi -grep "PPid" "/proc/${PPID}/status" >"${SESSION_DIR}/sshd.pid" +grep 'PPid' "/proc/${PPID}/status" >"${SESSION_DIR}/sshd.pid" X2GO_COOKIE="$(mcookie)" -xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" -xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" +xauth -f "${XAUTHORITY}" 'add' "${current_host_name}/unix:${X2GO_PORT}" 'MIT-MAGIC-COOKIE-1' "${X2GO_COOKIE}" +xauth -f "${XAUTHORITY}" 'add' "${current_host_name}:${X2GO_PORT}" 'MIT-MAGIC-COOKIE-1' "${X2GO_COOKIE}" -typeset option_geometry="" -if [ -n "${X2GO_GEOMETRY}" ] && [ "${X2GO_GEOMETRY}" != "fullscreen" ]; then +typeset option_geometry='' +if [[ -n "${X2GO_GEOMETRY}" ]] && [[ "${X2GO_GEOMETRY}" != 'fullscreen' ]]; then option_geometry="geometry=${X2GO_GEOMETRY}," fi typeset tmp_regex='^(0|none|client|server|both|1)$' -if [ -n "${X2GO_CLIPBOARD}" ] && [[ "${X2GO_CLIPBOARD}" =~ ${tmp_regex} ]]; then +if [[ -n "${X2GO_CLIPBOARD}" ]] && [[ "${X2GO_CLIPBOARD}" =~ ${tmp_regex} ]]; then clipboard=",clipboard=${X2GO_CLIPBOARD}" else clipboard=",clipboard=both" fi -if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" == "auto" ]; then +if [[ "${X2GO_SET_KBD}" = '0' ]] || [[ "${X2GO_KBD_TYPE}" = 'auto' ]]; then X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=${X2GO_COOKIE},errors=${SESSION_LOG},kbtype=null/null,${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" else X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=${X2GO_COOKIE},errors=${SESSION_LOG},kbtype=${X2GO_KBD_TYPE},${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" @@ -383,73 +383,73 @@ DISPLAY="nx/nx,options=${SESSION_DIR}/options:${X2GO_PORT}" export DISPLAY -if [ "${X2GODPI}" == "" ]; then - X2GODPIOPTION_="" +if [[ -z "${X2GODPI}" ]]; then + X2GODPIOPTION_='' else X2GODPIOPTION_="-dpi ${X2GODPI}" fi -NOLISTOPT="" -if [ "${X2GOXDMCP}" == "" ] ;then - XDMCPOPT="" - if [ "x${X2GO_NXAGENT_OPTIONS}" != "x${X2GO_NXAGENT_OPTIONS/ -nolisten tcp/}" ]; then - NOLISTOPT="-nolisten tcp" +NOLISTOPT='' +if [[ -z "${X2GOXDMCP}" ]] ;then + XDMCPOPT='' + if [[ "${X2GO_NXAGENT_OPTIONS}" != "${X2GO_NXAGENT_OPTIONS/ -nolisten tcp/}" ]]; then + NOLISTOPT='-nolisten tcp' fi else XDMCPOPT="-query ${X2GOXDMCP}" fi # run x2goserver-extensions for pre-start -x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "pre-start" || true +x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'pre-start' || true SESSION_WINDOW_TITLE="X2GO-${SESSION_NAME}" -agent_geometry="" -if [ -n "${X2GO_GEOMETRY}" ] && [ "${X2GO_GEOMETRY}" != "fullscreen" ]; then +agent_geometry='' +if [[ -n "${X2GO_GEOMETRY}" ]] && [[ "${X2GO_GEOMETRY}" != 'fullscreen' ]]; then agent_geometry="-geometry ${X2GO_GEOMETRY}" fi # systemd is prone to kill remaining sessions on user logouts. # That sort of makes sense to clean up stray processes, # but gets in the way of our persistent session scheme. -loginctl "enable-linger" &>"/dev/null" || : +loginctl 'enable-linger' &>'/dev/null' || : -X2GO_AGENT_PID="0" -if [ "${X2GO_STYPE}" == "S" ]; then +X2GO_AGENT_PID='0' +if [[ "${X2GO_STYPE}" = 'S' ]]; then # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') -SESSION_TYPE ('-${SESSION_TYPE}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') -shadow SHADOW_DESKTOP ('${SHADOW_DESKTOP}') -shadowmode SHADOW_MODE ('${SHADOW_MODE}') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGEN [...] - NX_TEMP="/tmp" x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ -$SESSION_TYPE -auth "$XAUTHORITY" -shadow $SHADOW_DESKTOP -shadowmode $SHADOW_MODE $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') -SESSION_TYPE ('-${SESSION_TYPE}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') -shadow SHADOW_DESKTOP ('${SHADOW_DESKTOP}') -shadowmode SHADOW_MODE ('${SHADOW_MODE}') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGEN [...] + NX_TEMP='/tmp' x2goagent ${X2GO_NXAGENT_OPTIONS} ${NOLISTOPT} ${X2GODPIOPTION_} -${SESSION_TYPE} -auth "${XAUTHORITY}" -shadow ${SHADOW_DESKTOP} -shadowmode ${SHADOW_MODE} ${agent_geometry} -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & else # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') XDMCPPOPT ('${XDMCPOPT}') -SESSION_TYPE ('-${SESSION_TYPE}') NOEXITPARAM ('${NOEXITPARAM}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGENT}\"') 2>\"SESSION_LOG\" ('\"${ [...] - NX_TEMP="/tmp" x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ $XDMCPOPT -$SESSION_TYPE $NOEXITPARAM -auth "$XAUTHORITY" $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') XDMCPPOPT ('${XDMCPOPT}') -SESSION_TYPE ('-${SESSION_TYPE}') NOEXITPARAM ('${NOEXITPARAM}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGENT}\"') 2>\"SESSION_LOG\" ('\"${ [...] + NX_TEMP='/tmp' x2goagent ${X2GO_NXAGENT_OPTIONS} ${NOLISTOPT} ${X2GODPIOPTION_} ${XDMCPOPT} -${SESSION_TYPE} ${NOEXITPARAM} -auth "${XAUTHORITY}" ${agent_geometry} -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & fi -ln -s "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" +ln -s -- "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" X2GO_AGENT_PID="${!}" -if ps -p "${X2GO_AGENT_PID}" &>"/dev/null"; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "successfully started X2Go Agent session with ID ${SESSION_NAME}" +if ps -p "${X2GO_AGENT_PID}" &>'/dev/null'; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'notice' "successfully started X2Go Agent session with ID ${SESSION_NAME}" # run x2goserver-extensions for post-start - x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "post-start" || true + x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'post-start' || true else typeset msg="Failed to start X2Go Agent session with ID ${SESSION_NAME}. X2Go Agent terminated unexpectedly. Aborting session startup." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 # run x2goserver-extensions for fail-start - x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "fail-start" || true + x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'fail-start' || true - exit "13" + exit '13' fi -"${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >"/dev/null" +"${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >'/dev/null' -if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" != "auto" ]; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "blocking creation of agent's keyboard file ${SESSION_DIR}/keyboard as requested by session startup command" - mkdir -p "${SESSION_DIR}/keyboard" +if [[ "${X2GO_SET_KBD}" = '0' ]] || [[ "${X2GO_KBD_TYPE}" != 'auto' ]]; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "blocking creation of agent's keyboard file ${SESSION_DIR}/keyboard as requested by session startup command" + mkdir -p -- "${SESSION_DIR}/keyboard" fi echo "${X2GO_PORT}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 0b5bae4c99bbade7628ef0c79ec61a21fdc3a567 Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 03:54:28 2018 +0100 x2goserver/lib/x2gogetfreeport: use error code 1 for general failure, shift parameter sanitization failure codes up. --- debian/changelog | 2 ++ x2goserver/lib/x2gogetfreeport | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 2aad67f..7c49142 100644 --- a/debian/changelog +++ b/debian/changelog @@ -66,6 +66,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium bash-style checks, more curly braces, terminate options for commands that use outside input (variables), fix copyright notice. - x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. + - x2goserver/lib/x2gogetfreeport: use error code 1 for general failure, + shift parameter sanitization failure codes up. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2gogetfreeport b/x2goserver/lib/x2gogetfreeport index bf109e7..705ac61 100755 --- a/x2goserver/lib/x2gogetfreeport +++ b/x2goserver/lib/x2gogetfreeport @@ -36,17 +36,17 @@ typeset end="${4:-'65535'}" # Check parameter sanity. typeset empty_regex='^[[:space:]]*$' if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then - exit '1' + exit '2' fi typeset -i start_i="${start}" typeset -i end_i="${end}" if [[ -z "${start}" ]] || [[ "${start}" != "${start_i}" ]] || [[ "${start}" -ne "${start_i}" ]]; then - exit '2' + exit '3' fi if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]]; then - exit '3' + exit '4' fi -[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit '4' +[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit '5' # Skip unnecessary work. -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 3748fe5e76fd0cccf4fad524612c396fc93d86a6 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 8 04:55:59 2018 +0100 x2goserver/lib: new script x2gocheckport, containing common functionality for port checking. Duplicated code will be deleted next. --- debian/changelog | 2 + x2goserver/lib/x2gocheckport | 280 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 282 insertions(+) diff --git a/debian/changelog b/debian/changelog index 7c49142..7aa2289 100644 --- a/debian/changelog +++ b/debian/changelog @@ -68,6 +68,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. - x2goserver/lib/x2gogetfreeport: use error code 1 for general failure, shift parameter sanitization failure codes up. + - x2goserver/lib: new script x2gocheckport, containing common + functionality for port checking. Duplicated code will be deleted next. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2gocheckport b/x2goserver/lib/x2gocheckport new file mode 100644 index 0000000..110766c --- /dev/null +++ b/x2goserver/lib/x2gocheckport @@ -0,0 +1,280 @@ +#!/bin/bash + +# Copyright (C) 2017-2018 X2Go Project - https://wiki.x2go.org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +[[ -z "${X2GO_INTERNAL_SOURCE}" ]] && exit '2' + +# Variables used for caching. +# We do not want to fetch the whole list for every +# single port check. +typeset -a used_x2go_ports +typeset -a used_system_ports +typeset -a used_display_ports +used_x2go_ports=() +used_system_ports=() +used_display_ports=() + +# Initializes used_x2go_ports array. +# Internal use only. +# Takes the current hostname as a parameter. +# Returns 0 on success or non-0 on failure. +initialize_x2go_ports() { + typeset current_host_name="${1}" + + typeset empty_regex='^[[:space:]]*$' + if [[ -z "${current_host_name}" ]] || [[ "${current_host_name}" =~ ${empty_regex} ]] || [[ "${current_host_name}" = '(none)' ]] || [[ "${current_host_name}" = 'localhost' ]]; then + return '1' + fi + + # Get all used ports from the X2Go database + # What this does is very unobvious, so here's how that works: + # The -d parameter with an empty string as its argument makes + # the read utility process a "line" until the first such delimiter + # is found. Since an empty string in C is terminated by a NULL + # character, the delimiter will be set to this NULL character. + # Hence, assuming that the input string does not contain any + # NULL characters, the whole input string will be treated as + # one big line. + # Then, normal word splitting kicks in and the -a flag tells + # read to put all words into elements of the provided array + # variable. + typeset -a used_x2go_ports_work + used_x2go_ports_work=() + IFS="${IFS}|" read -r -d '' -a 'used_x2go_ports_work' < <("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}") + + # Filter out any empty or invalid values. + typeset -i item_i='0' + typeset item='' + for item in "${used_x2go_ports_work[@]}"; do + item_i="${item}" + + [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_x2go_ports+=( "${item}" ) + done + + return '0' +} + +# Initializes used_system_ports array. +# Internal use only. +# Takes a command for ss as a parameter. +# If an ss command is not given, a default of "ss" is assumed. +# Returns 0 on success or non-0 on failure. +initialize_system_ports() { + typeset ss="${1:-'ss'}" + + typeset empty_regex='^[[:space:]]*$' + if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then + return '1' + fi + + typeset -a used_system_ports_work + used_system_ports_work=() + IFS="${IFS}|" read -r -d '' -a 'used_system_ports_work' < <("${ss}" -nt -all | awk ' + { + n = split ($0, lines, "\n"); + for (i = 1; i <= n; ++i) { + split (lines[i], words, " "); + delim = split (words[4], ports, ":"); + if (delim > 1) { + printf ("\n%d\n", ports[delim]) + } + } + }') + + # Filter out any empty or invalid values. + typeset -i item_i='0' + typeset item='' + for item in "${used_system_ports_work[@]}"; do + item_i="${item}" + + [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_system_ports+=( "${item}" ) + done + + return '0' +} + +# Initializes used_display_ports array. +# Internal use only. +# Takes the current hostname as a parameter. +# Returns 0 on success or non-0 on failure. +initialize_display_ports() { + typeset current_host_name="${1}" + + typeset empty_regex='^[[:space:]]*$' + if [[ -z "${current_host_name}" ]] || [[ "${current_host_name}" =~ ${empty_regex} ]] || [[ "${current_host_name}" = '(none)' ]] || [[ "${current_host_name}" = 'localhost' ]]; then + return '1' + fi + + typeset -a used_display_ports_work + used_display_ports_work=() + IFS="${IFS}|" read -r -d '' -a 'used_display_ports_work' < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") + + # Filter out any empty or invalid values. + typeset -i item_i='0' + typeset item='' + for item in "${used_display_ports_work[@]}"; do + item_i="${item}" + + [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_display_ports+=( "${item}" ) + done + + return '0' +} + +# Checks if a port is registered as in use by X2Go. +# Takes the current hostname and a port value as parameters. +# Returns 0 if the port is free, or non-0 if it already +# in use or on failure. +check_x2go_port() { + typeset current_host_name="${1}" + typeset port="${2}" + + typeset empty_regex='^[[:space:]]*$' + if [[ -z "${current_host_name}" ]] || [[ "${current_host_name}" =~ ${empty_regex} ]] || [[ "${current_host_name}" = '(none)' ]] || [[ "${current_host_name}" = 'localhost' ]]; then + return '2' + fi + + typeset -i port_i="${port}" + if [[ -z "${port}" ]] || [[ "${port}" != "${port_i}" ]] || [[ "${port}" -ne "${port_i}" ]] || [[ "${port_i}" -lt '1' ]] || [[ "${port_i}" -gt '65535' ]]; then + return '3' + fi + + typeset -i ret='0' + + # If cache is empty, initialize it. + if [[ "${#used_x2go_ports[@]}" -eq '0' ]]; then + initialize_x2go_ports "${current_host_name}" || ret='4' + fi + + if [[ "${ret}" -eq '0' ]]; then + typeset -i i='0' + for ((i = 0; i < ${#used_x2go_ports[@]}; ++i)); do + if [[ "${used_x2go_ports[i]}" = "${port}" ]]; then + ret='1' + break + fi + done + fi + + return "${ret}" +} + +# Checks if a port is registered as in use by the system. +# Takes a command for ss and a port value as parameters. +# If an ss command is not given, a default of "ss" is assumed. +# Returns 0 if the port is free, or non-0 if it already +# in use or on failure. +check_system_port() { + typeset ss="${1:-'ss'}" + typeset port="${2}" + + typeset empty_regex='^[[:space:]]*$' + if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then + return '2' + fi + + typeset -i port_i="${port}" + if [[ -z "${port}" ]] || [[ "${port}" != "${port_i}" ]] || [[ "${port}" -ne "${port_i}" ]] || [[ "${port_i}" -lt '1' ]] || [[ "${port_i}" -gt '65535' ]]; then + return '3' + fi + + typeset -i ret='0' + + # If the port is a well-known one, don't block it. + grep -qs "[[:space:]]\+${port}/" '/etc/services' &>'/dev/null' && ret='1' + + if [[ "${ret}" -eq '0' ]]; then + # If cache is empty, initialize it. + if [[ "${#used_system_ports[@]}" -eq '0' ]]; then + initialize_system_ports "${ss}" || ret='4' + fi + fi + + if [[ "${ret}" -eq '0' ]]; then + typeset -i i='0' + for ((i = 0; i < ${#used_system_ports[@]}; ++i)); do + if [[ "${used_system_ports[i]}" = "${port}" ]]; then + ret='1' + break + fi + done + fi + + return "${ret}" +} + +# Checks if a port is registered as in use by the system. +# Takes the current host name, a command for ss and a port value as parameters. +# If an ss command is not given, a default of "ss" is assumed. +# Returns 0 if the port is free, or non-0 if it already +# in use or on failure. +check_display_port() { + typeset current_host_name="${1}" + typeset ss="${2:-'ss'}" + typeset port="${3}" + + typeset empty_regex='^[[:space:]]*$' + if [[ -z "${current_host_name}" ]] || [[ "${current_host_name}" =~ ${empty_regex} ]] || [[ "${current_host_name}" = '(none)' ]] || [[ "${current_host_name}" = 'localhost' ]]; then + return '2' + fi + + if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then + return '3' + fi + + typeset -i port_i="${port}" + if [[ -z "${port}" ]] || [[ "${port}" != "${port_i}" ]] || [[ "${port}" -ne "${port_i}" ]] || [[ "${port_i}" -lt '0' ]] || [[ "${port_i}" -gt '59535' ]]; then + return '4' + fi + + typeset -i ret='0' + + # If cache is empty, initialize it. + if [[ "${#used_display_ports[@]}" -eq '0' ]]; then + initialize_display_ports "${current_host_name}" || ret='5' + fi + + if [[ "${ret}" -eq '0' ]]; then + typeset -i i='0' + for ((i = 0; i < ${#used_display_ports[@]}; ++i)); do + if [[ "${used_display_ports[i]}" = "${port}" ]]; then + ret='1' + break + fi + done + fi + + if [[ "${ret}" -eq '0' ]]; then + # Looks free, check system sockets. + if "${ss}" -lxs 2>'/dev/null' | grep -Eqs "(@|)/tmp/.X11-unix/X${port}(|-lock) " >'/dev/null'; then + ret='1' + fi + fi + + if [[ "${ret}" -eq '0' ]]; then + # Still looks free, check X2Go database. + check_x2go_port "${current_host_name}" "$((port + 6000))" || ret='1' + fi + + if [[ "${ret}" -eq '0' ]]; then + # Still looks free, check system state. + check_system_port "${ss}" "$((port + 6000))" || ret='1' + fi + + return "${ret}" +} -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit a8376852e8ba53e0b6ae0cc6ac8017b35c9583cf Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 8 06:46:19 2018 +0100 x2goserver/lib/x2gogetfreeport: use the check_*_port functions, require current host name as a parameter and adapt x2gogetfreeport usages accordingly. --- debian/changelog | 3 + x2goserver/bin/x2goresume-session | 2 +- x2goserver/bin/x2gostartagent | 4 +- x2goserver/lib/x2gogetfreeport | 125 ++++++++------------------------------ 4 files changed, 33 insertions(+), 101 deletions(-) diff --git a/debian/changelog b/debian/changelog index e8bcc61..40e89e1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -72,6 +72,9 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium functionality for port checking. Duplicated code will be deleted next. - x2goserver/lib/x2gogetfreeport: check start and end paramters in a stricter fashion. + - x2goserver/lib/x2gogetfreeport: use the check_*_port functions, require + current host name as a parameter and adapt x2gogetfreeport usages + accordingly. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 840dbae..a9a9e70 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -193,7 +193,7 @@ while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' - if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'lowlevel' "${SSH_PORT}")"; then + if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${current_host_name}" "${ss}" 'lowlevel' "${SSH_PORT}")"; then SSH_PORT="${free_port}" output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index be4a27b..c4f05a8 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -218,7 +218,7 @@ typeset -i max_retry='10' typeset -i output='' for ((retry = 0; retry < max_retry; ++retry)); do typeset -i free_port="${X2GO_PORT}" - if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'display' "${X2GO_PORT}")"; then + if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${current_host_name}" "${ss}" 'display' "${X2GO_PORT}")"; then X2GO_PORT="${free_port}" SESSION_NAME="${USER}-${X2GO_PORT}-$(date '+%s')" @@ -255,7 +255,7 @@ while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' - if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'lowlevel' "${SSH_PORT}")"; then + if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${current_host_name}" "${ss}" 'lowlevel' "${SSH_PORT}")"; then SSH_PORT="${free_port}" output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" diff --git a/x2goserver/lib/x2gogetfreeport b/x2goserver/lib/x2gogetfreeport index 1a80c73..d657fda 100755 --- a/x2goserver/lib/x2gogetfreeport +++ b/x2goserver/lib/x2gogetfreeport @@ -18,8 +18,8 @@ # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # Get first free port. -# Takes a command for ss, the port type, a start andan end port -# as parameters. +# Takes the current host name, a command for ss, the port type, +# a start and an end port as parameters. # If an ss command is not given, a default of "ss" is assumed. # If the port type is not given, a default of "lowlevel" is assumed. # If the start port is not given, a default of 1 is assumed. @@ -28,86 +28,39 @@ # Prints the first free port value on success, or the initial start # port number on failure. # Returns 0 on success or non-0 on failure. -typeset ss="${1:-'ss'}" -typeset type="${2:-'lowlevel'}" -typeset start="${3:-'1'}" -typeset end="${4:-'65535'}" +typeset current_host_name="${1}" +typeset ss="${2:-'ss'}" +typeset type="${3:-'lowlevel'}" +typeset start="${4:-'1'}" +typeset end="${5:-'65535'}" # Check parameter sanity. typeset empty_regex='^[[:space:]]*$' -if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then +if [[ -z "${current_host_name}" ]] || [[ "${current_host_name}" =~ ${empty_regex} ]] || [[ "${current_host_name}" = '(none)' ]] || [[ "${current_host_name}" = 'localhost' ]]; then exit '2' fi + +if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then + exit '3' +fi typeset -i start_i="${start}" typeset -i end_i="${end}" if [[ -z "${start}" ]] || [[ "${start}" != "${start_i}" ]] || [[ "${start}" -ne "${start_i}" ]] || [[ "${start_i}" -lt '0' ]] || [[ "${start_i}" -gt '65535' ]]; then - exit '3' -fi -if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]] || [[ "${end_i}" -lt "${start_i}" ]] || [[ "${end_i}" -gt '65535' ]]; then exit '4' fi -[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit '5' - - -# Skip unnecessary work. -if [[ "${type}" = 'display' ]]; then - typeset -a used_displays - typeset -a used_displays_work - used_displays=() - used_displays_work=() - # What this does is very unobvious, so here's how that works: - # The -d parameter with an empty string as its argument makes - # the read utility process a "line" until the first such delimiter - # is found. Since an empty string in C is terminated by a NULL - # character, the delimiter will be set to this NULL character. - # Hence, assuming that the input string does not contain any - # NULL characters, the whole input string will be treated as - # one big line. - # Then, normal word splitting kicks in and the -a flag tells - # read to put all words into elements of the provided array - # variable. - IFS="${IFS}|" read -r -d '' -a 'used_displays_work' < <("${X2GO_LIB_PATH}/x2gogetdisplays" "${current_host_name}") - - # Filter out any empty or invalid values. - typeset -i item_i='0' - typeset item='' - for item in "${used_displays_work[@]}"; do - item_i="${item}" - - [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_displays+=( "${item}" ) - done +if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]] || [[ "${end_i}" -lt "${start_i}" ]] || [[ "${end_i}" -gt '65535' ]]; then + exit '5' fi +[[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit '6' -# Same algorithm again for the system ports in use, but we cannot really -# use a function to duplicate code less since arrays and functions don't -# mix well in bash. -# Get all used in system ports from X2Go database and ss output -typeset -a used_ports -typeset -a used_ports_work -used_ports=() -used_ports_work=() -IFS="${IFS}|" read -r -d '' -a 'used_ports_work' < <("${X2GO_LIB_PATH}/x2gogetports" "${current_host_name}"; - "${ss}" -nt -all | awk ' - { - n = split ($0, lines, "\n"); - for (i = 1; i <= n; ++i) { - split (lines[i], words, " "); - delim = split (words[4], ports, ":"); - if (delim > 1) { - printf ("\n%d\n", ports[delim]) - } - } - }') +typeset x2go_lib_path="$(x2gopath 'libexec')" +typeset X2GO_INTERNAL_SOURCE='1' +# Make shellcheck happy. +: "${X2GO_INTERNAL_SOURCE}" +. "${x2go_lib_path}/x2gocheckport" +unset X2GO_INTERNAL_SOURCE -# Filter out any empty or invalid values. -item_i='0' -item='' -for item in "${used_ports_work[@]}"; do - item_i="${item}" - - [[ -n "${item}" ]] && [[ "${item}" -eq "${item_i}" ]] && [[ "${item}" = "${item_i}" ]] && used_ports+=( "${item}" ) -done typeset -i ret_port="${start}" typeset -i ret='1' @@ -120,43 +73,19 @@ for ((work_port = start; i <= stop_port; ++work_port)); do typeset -i value_found='0' if [[ "${type}" = 'display' ]]; then - for ((i = 0; i < ${#used_displays[@]}; ++i)); do - if [[ "${used_displays[i]}" = "${work_port}" ]]; then - # We need to continue with the next port number, - # this one is taken. - value_found='1' - break - fi - done + check_display_port "${current_host_name}" "${ss}" "${work_port}" || value_found='1' + else + check_x2go_port "${current_host_name}" "${work_port}" || value_found='1' - # Check if such a socket is already in use system-wide. - if "${ss}" -lxs 2>'/dev/null' | grep -Eqs "(@|)/tmp/.X11-unix/X${work_port}(|-lock) " >'/dev/null'; then - continue + if [[ "${value_found}" -eq '0' ]]; then + check_system_port "${ss}" "${work_port}" || value_found='1' fi fi # Port number taken? Continue with the next one. [[ "${value_found}" -ne '0' ]] && continue - # Check raw port number. Either to make sure that the corresponding - # raw port for the DISPLAY port found is still free, or also in the - # general case. - typeset -i map_port="${work_port}" - [[ "${type}" = 'display' ]] && map_port="$((map_port + 6000))" - for ((i = 0; i < ${#used_ports[@]}; ++i)); do - if [[ "${used_ports[i]}" = "${map_port}" ]]; then - value_found='1' - break - fi - done - - # Port number taken? Continue with the next one. - [[ "${value_found}" -ne '0' ]] && continue - - # If the port is a well-known one, don't block it. - grep -qs "${work_port}" '/etc/services' &>'/dev/null' && continue - - # Searched the array and got nothing? Great, grab that port number! + # Searched and got nothing? Great, grab that port number! ret_port="${work_port}" ret='0' break -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 1ec6d633b3cdcac3e31bacbe59072065b58be518 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 8 06:13:20 2018 +0100 x2goserver/lib/x2gogetfreeport: check start and end paramters in a stricter fashion. --- debian/changelog | 2 ++ x2goserver/lib/x2gogetfreeport | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7aa2289..e8bcc61 100644 --- a/debian/changelog +++ b/debian/changelog @@ -70,6 +70,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium shift parameter sanitization failure codes up. - x2goserver/lib: new script x2gocheckport, containing common functionality for port checking. Duplicated code will be deleted next. + - x2goserver/lib/x2gogetfreeport: check start and end paramters in a + stricter fashion. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2gogetfreeport b/x2goserver/lib/x2gogetfreeport index 705ac61..1a80c73 100755 --- a/x2goserver/lib/x2gogetfreeport +++ b/x2goserver/lib/x2gogetfreeport @@ -40,10 +40,10 @@ if [[ -z "${ss}" ]] || [[ "${ss}" =~ ${empty_regex} ]]; then fi typeset -i start_i="${start}" typeset -i end_i="${end}" -if [[ -z "${start}" ]] || [[ "${start}" != "${start_i}" ]] || [[ "${start}" -ne "${start_i}" ]]; then +if [[ -z "${start}" ]] || [[ "${start}" != "${start_i}" ]] || [[ "${start}" -ne "${start_i}" ]] || [[ "${start_i}" -lt '0' ]] || [[ "${start_i}" -gt '65535' ]]; then exit '3' fi -if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]]; then +if [[ -z "${end}" ]] || [[ "${end}" != "${end_i}" ]] || [[ "${end}" -ne "${end_i}" ]] || [[ "${end_i}" -lt "${start_i}" ]] || [[ "${end_i}" -gt '65535' ]]; then exit '4' fi [[ "${type}" != 'lowlevel' ]] && [[ "${type}" != 'display' ]] && exit '5' -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 4da317ded579ddf512b40ac09d1d4f950c5af1c7 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 8 07:34:21 2018 +0100 x2goserver/bin/x2goresume-session: actually check if the old port values have been refurbished within the system and reassign them. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 40e89e1..d7e999e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -75,6 +75,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/lib/x2gogetfreeport: use the check_*_port functions, require current host name as a parameter and adapt x2gogetfreeport usages accordingly. + - x2goserver/bin/x2goresume-session: actually check if the old port values + have been refurbished within the system and reassign them. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index a9a9e70..2d4b041 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -153,21 +153,27 @@ FS_PORT="$(awk -F ',' '{print $14}' <<< "${SESSIONINFO}")" "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "old ports: ${GR_PORT}, ${SOUND_PORT}, ${FS_PORT}" -### FIXME ### -### THIS NEVER WORKED CORRECTLY SINCE ${SYSTEM_PORTS} HAS BEEN REPLACED BY A ${USED_PORTS} COPY ### +typeset X2GO_INTERNAL_SOURCE='1' +# Make shellcheck happy. +: "${X2GO_INTERNAL_SOURCE}" +. "${X2GO_LIB_PATH}/x2gocheckport" +unset X2GO_INTERNAL_SOURCE + +# define the full path to the ss utility +typeset ss="$(PATH="${PATH}:/usr/sbin:/sbin" type -P 'ss')" #check if saved in DB ports free -if grep -q "|${GR_PORT}|" <<< "${SYSTEM_PORTS}"; then +if ! check_system_port "${ss}" "${GR_PORT}"; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${GR_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${GR_PORT}" GR_PORT='' fi -if grep -q "|${SOUND_PORT}|" <<< "${SYSTEM_PORTS}"; then +if ! check_system_port "${ss}" "${SOUND_PORT}"; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${SOUND_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${SOUND_PORT}" SOUND_PORT='' fi -if grep -q "|${FS_PORT}|" <<< "${SYSTEM_PORTS}"; then +if ! check_system_port "${ss}" "${FS_PORT}"; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${FS_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${FS_PORT}" FS_PORT='' @@ -182,9 +188,6 @@ if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then exit '5' fi -# define the full path to the ss utility -typeset ss="$(PATH="${PATH}:/usr/sbin:/sbin" type -P 'ss')" - typeset -i retry='0' typeset -i max_retry='10' typeset -i free_port='0' -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 6fe6d68136f1c53b70e5a2555c68273a30e94d38 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 9 03:21:41 2018 +0100 x2goserver/bin/x2goresume-ression: whitespace fix only. --- debian/changelog | 1 + x2goserver/bin/x2goresume-session | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index d7e999e..342c7b6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -77,6 +77,7 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium accordingly. - x2goserver/bin/x2goresume-session: actually check if the old port values have been refurbished within the system and reassign them. + - x2goserver/bin/x2goresume-ression: whitespace fix only. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 2d4b041..b3eaff8 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -294,7 +294,7 @@ x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${ rm -Rf "${SESSION_DIR}/keyboard" if kill -HUP "${X2GO_AGENT_PID}" &>'/dev/null'; then - "${X2GO_LIB_PATH}/x2goresume" "${X2GO_CLIENT}" "${SESSION_NAME}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" >'/dev/null' + "${X2GO_LIB_PATH}/x2goresume" "${X2GO_CLIENT}" "${SESSION_NAME}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" >'/dev/null' "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'notice' "client ${X2GO_CLIENT} has successfully resumed session with ID ${SESSION_NAME}" # set client-side keyboard model, type, variant, etc. -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git
This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 9cb67acff073728cbd2f57491c0ee04b7f6b5cad Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 9 05:56:51 2018 +0100 x2goserver/bin/x2gostartagent: check and adapt exit codes. --- debian/changelog | 1 + x2goserver/bin/x2gostartagent | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 342c7b6..60289a3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -78,6 +78,7 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/bin/x2goresume-session: actually check if the old port values have been refurbished within the system and reassign them. - x2goserver/bin/x2goresume-ression: whitespace fix only. + - x2goserver/bin/x2gostartagent: check and adapt exit codes. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index c4f05a8..5c6cf23 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -187,7 +187,7 @@ LWORD="$(awk '{print $1}' <<< "${LIMIT}")" if [[ "${LWORD}" = 'LIMIT' ]]; then echo "${LIMIT}" >&2 "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "session limit has been reached for user "'"'"${USER}"'"'", cannot start new session" - exit '10' + exit '9' fi export NX_CLIENT="${X2GO_LIB_PATH}/x2gosuspend-agent" @@ -248,7 +248,7 @@ if [[ "${output}" != 'inserted' ]]; then # Make x2goclient fail. echo "${msg}" >&2 - exit '11' + exit '10' fi while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]]; do @@ -276,7 +276,7 @@ while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] # Make x2goclient fail. echo "${msg}" >&2 - exit '12' + exit '11' fi if [[ -z "${GR_PORT}" ]]; then @@ -442,7 +442,7 @@ else # run x2goserver-extensions for fail-start x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'fail-start' || true - exit '13' + exit '12' fi "${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >'/dev/null' -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git