This is an automated email from the git hooks/post-receive script. x2go pushed a change to branch master in repository x2goserver. from ee5fbc5 debian/control: dip into cold water and depend solely upon x2goserver-x2goagent in a versioned fashion. new dfa3f08 x2goserver/lib: new wrapper script x2goqueryconfig to fetch a config value out of the global x2goserver.conf file. new bb0e88d x2goserver-common/etc/x2goserver.conf: add x2goagent.port_randomization configuration option. new fe049eb x2goserver/bin/x2gostartagent: use x2goagent.port_randomization configuration value. new 8282d9f x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. new ebe55fd x2goserver/bin/x2gostartagent: update copyright notice. new 2e42f1b x2goserver/bin/x2gostartagent: fix most shellcheck warnings, whitespace errors, use more quotes and curly braces. new a1548a6 x2goserver/bin/x2gostartagent: drop obsolete X2GO_BIN environment variable usage. new 0ba0752 x2goserver/bin/x2gostartagent: make shellcheck happy by referencing "${SAVED_DISPLAY}" once. new 97c9988 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 254fd54 x2goserver/bin/x2gostartagent: replace perl call with bash pattern substitution. new 70d15b3 x2goserver/bin/x2gostartagent: some shells do not handle quotes in pattern substitutions gracefully. new ab86050 x2goserver/lib: new script x2gogetfreeport, consists of duplicated functionality in x2gostartagent. new d3bd8b5 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 245b1b9 x2goserver/bin/x2gostartagent: remove spurious semicolon and add quotes on the lib path line. new 3c19aa0 x2goserver/bin/x2gostartagent: start using x2gogetrandomport, delete now-duplicate code. new 930f6dd x2goserver/bin/x2gostartagent: fix return code that should have been zero, indicating success. new bb50a7e x2goserver/bin/x2goresume-session: remove spurious semicolon and add quotes on the lib path line. new 727b253 x2goserver/bin/x2goresume-session: properly randomize first port, just like in x2gostartagent. new 6cb9bb1 x2goserver/bin/x2go{startagent,resume-session}: use x2gogetfreeport instead of duplicating the same code everywhere. Fixes: #1230. new c59ec73 x2goserver/bin/x2gostartagent: fix hostname detection. new d2e9f36 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 9b4b1ce 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 941b333 x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. new 3d3b756 x2goserver/lib/x2gogetfreeport: use error code 1 for general failure, shift parameter sanitization failure codes up. new eef6425 x2goserver/lib: new script x2gocheckport, containing common functionality for port checking. new bc08472 x2goserver/lib/x2gogetfreeport: check start and end paramters in a stricter fashion. new 98b8b4a x2goserver/lib/x2gogetfreeport: use the check_*_port functions, require current host name as a parameter and adapt x2gogetfreeport usages accordingly. new dbbddb9 x2goserver/bin/x2goresume-session: actually check if the old port values have been refurbished within the system and reassign them. new 592e702 x2goserver/bin/x2goresume-ression: whitespace fix only. new c2e2bad x2goserver/bin/x2gostartagent: fix most other shellcheck warnings, more quotes, curly braces et. al. new c72c704 x2goserver/bin/x2gostartagent: check and adapt exit codes. new 8c19448 Fix resizing when resuming sessions. new f8ee1e3 x2goserver/bin/x2goresume-session: fix most other shellcheck warnings, more quotes, curly braces et. al. The 33 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 | 79 +++ x2goserver-common/etc/x2goserver.conf | 17 + x2goserver/bin/x2goresume-session | 432 +++++++------- x2goserver/bin/x2gostartagent | 705 ++++++++++------------- x2goserver/lib/x2gocheckport | 280 +++++++++ x2goserver/lib/x2gogetfreeport | 98 ++++ x2goserver/lib/x2gogetrandomport | 120 ++++ x2goserver/lib/{x2gogetagent => x2goqueryconfig} | 36 +- 8 files changed, 1130 insertions(+), 637 deletions(-) create mode 100644 x2goserver/lib/x2gocheckport create mode 100755 x2goserver/lib/x2gogetfreeport create mode 100755 x2goserver/lib/x2gogetrandomport copy x2goserver/lib/{x2gogetagent => x2goqueryconfig} (61%) -- 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 master in repository x2goserver. commit dfa3f084921473606501869cc7ceb9907107c9c8 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 05:09:36 2018 +0100 x2goserver/lib: new wrapper script x2goqueryconfig to fetch a config value out of the global x2goserver.conf file. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/lib/x2goqueryconfig | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/debian/changelog b/debian/changelog index cca63be..1a41d48 100644 --- a/debian/changelog +++ b/debian/changelog @@ -263,6 +263,8 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium * New upstream version (4.0.1.23): - x2goserver/bin/x2gostartagent: reenable XFIXES extension. The initial problem that required this workaround has been fixed a long time ago. + - x2goserver/lib: new wrapper script x2goqueryconfig to fetch a config + value out of the global x2goserver.conf file. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/lib/x2goqueryconfig b/x2goserver/lib/x2goqueryconfig new file mode 100755 index 0000000..7d0fa9d --- /dev/null +++ b/x2goserver/lib/x2goqueryconfig @@ -0,0 +1,45 @@ +#!/usr/bin/perl + +# 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. + +use strict; + +use X2Go::Config qw (get_config); + +my $section = shift or die "Missing section argument"; +my $key = shift or die "Missing key argument"; + +if (!(length ($section))) { + die "Invalid (empty) section argument"; +} + +if (!(length ($key))) { + die "Invalid (empty) key argument"; +} + +my $Config = get_config (); + +my $val = $Config->param("$section.$key"); + +if (defined ($val)) { + print "$val\n"; + exit 0; +} +else { + exit 1; +} -- 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 master in repository x2goserver. commit bb0e88d8a129bce0678afd6c327c8fcf5372a770 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 06:02:37 2018 +0100 x2goserver-common/etc/x2goserver.conf: add x2goagent.port_randomization configuration option. Can be set to either "host-based" or "pure-random". Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 3 +++ x2goserver-common/etc/x2goserver.conf | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/debian/changelog b/debian/changelog index 1a41d48..1cee1e3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -265,6 +265,9 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium problem that required this workaround has been fixed a long time ago. - x2goserver/lib: new wrapper script x2goqueryconfig to fetch a config value out of the global x2goserver.conf file. + - x2goserver/etc/x2goserver.conf: add x2goagent.port_randomization + configuration option. Can be set to either "host-based" or + "pure-random". * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver-common/etc/x2goserver.conf b/x2goserver-common/etc/x2goserver.conf index 51e4704..fe20cf0 100644 --- a/x2goserver-common/etc/x2goserver.conf +++ b/x2goserver-common/etc/x2goserver.conf @@ -30,6 +30,23 @@ enable=no # and X2Go Server enable=no +[x2goagent] +# Value can be either "host-based" or "pure-random". +# This is currently a workaround for a bug in X2Go Client, that uses a 1:1 +# mapping of source to destination ports for SSH tunnels. +# This leads to problems if opening two (or more) instances of X2Go Client +# and connecting to two machines that use the same tunneling ports. +# Such a scenario is easy to trigger: make sure that both machines have run +# no active sessions, than spawn one session on each machine. +# Connecting to both at the same time will not be possible without a means +# of randomization. +# The randomization can either be "host-based", in which case the port will +# be set to 30000 + (128 * last octet of IPv4 address) and does the job if +# the last octet of the machine's IPv4 address is known to be unique, or +# "pure-random" which uses the (not so truly random) bash ${RANDOM} +# variable to fully randomize the port, i.e., 30000 + random(0..32767). +port_randomization="pure-random" + [log] # possible levels are: emerg, alert, crit, err, warning, notice, info, debug loglevel=notice -- 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 master in repository x2goserver. commit fe049eb4772a4c2a840838e56c5ca00e662f795a Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 06:04:30 2018 +0100 x2goserver/bin/x2gostartagent: use x2goagent.port_randomization 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 4 ++++ x2goserver/bin/x2gostartagent | 18 +++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1cee1e3..9d6da9a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -268,6 +268,10 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium - x2goserver/etc/x2goserver.conf: add x2goagent.port_randomization configuration option. Can be set to either "host-based" or "pure-random". + - x2goserver/bin/x2gostartagent: use x2goagent.port_randomization + 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.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 3816b56..d5ec931 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -68,20 +68,20 @@ X2GO_LIB_PATH="$(x2gopath libexec)"; $X2GO_LIB_PATH/x2gosyslog "$0" "info" "$(basename $0) called with options: $@" -# FIXME: this should be configurable option in x2goserver.conf. -# If you use hosts on a /24 network, you should probably set "0" here, -# as the addresses are unique. -# Each hosts SSH_PORT will be set to 30.000 + (128 * last octet of IP address) -# This results in no collisions on a /24 network with at least 128 ports -# for each host available for different sessions. -# If you select "1" here, the SSH_PORT will be set to 30000 + random(0..32767) +# 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" "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" "IP-based SSH port initialization requested." + ${X2GO_LIB_PATH}/x2gosyslog "$0" "debug" "host-based SSH port initialization requested." typeset ip_address="$(get_server_ip_address)" if [ "$?" = "0" ]; 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 master in repository x2goserver. commit 8282d9f34e3de17ec2e9809c8746a24e54292e41 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 20:08:21 2018 +0100 x2goserver/bin/x2gostartagent: fix shellcheck warning related to arrays. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 1 + x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 9d6da9a..1f30be4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -272,6 +272,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 d5ec931..33175c6 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 master in repository x2goserver. commit ebe55fd3a91ec7dd0d563a7c1488538206a6eba1 Author: Mihai Moldovan <ionic@ionic.de> Date: Mon Jan 1 20:11:58 2018 +0100 x2goserver/bin/x2gostartagent: update copyright notice. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 1 + x2goserver/bin/x2gostartagent | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1f30be4..50754fc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -273,6 +273,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 33175c6..ee25453 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 master in repository x2goserver. commit 2e42f1ba5f2db384bd5a241fc378529094a2e984 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 + x2goserver/bin/x2gostartagent | 464 +++++++++++++++++++++--------------------- 2 files changed, 233 insertions(+), 233 deletions(-) diff --git a/debian/changelog b/debian/changelog index 50754fc..2afc7b9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -274,6 +274,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 ee25453..2bf2dc4 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,165 +131,165 @@ 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_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config = get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` 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 -fi -$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 + 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_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"` - OUTPUT=`echo $OUTPUT | sed -e 's/#012/ /g'` - $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}")" + OUTPUT="$(sed -e 's/#012/ /g' <<< "${OUTPUT}")" + "${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" fi else X2GO_CLIPBOARD="$1"; shift 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" @@ -312,33 +312,34 @@ 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 - if [ -n "$SHADREQ_USER" ]; then - SESSION_NAME="${SHADREQ_USER}-${X2GO_PORT}-`date +\"%s\"`" + if [ -n "${SHADREQ_USER}" ]; then + SESSION_NAME="${SHADREQ_USER}-${X2GO_PORT}-$(date "+%s")" else - SESSION_NAME="${USER}-${X2GO_PORT}-`date +\"%s\"`" + SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" fi - if [ "$COLORDEPTH" != "" ]; then + 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}")" - if [ -n "$SHADREQ_USER" ]; then - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "initializing new shadow session with ID $SESSION_NAME" - OUTPUT=`$X2GO_LIB_PATH/x2goinsertshadowsession "$X2GO_PORT" "${current_host_name}" "$SESSION_NAME" "$SHADREQ_USER"` + if [ -n "${SHADREQ_USER}" ]; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "initializing new shadow session with ID ${SESSION_NAME}" + OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertshadowsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}" "${SHADREQ_USER}")" # Catching errors here would be nice, but the current layout doesn't allow this. # Keep this in mind as a FIXME. @@ -351,8 +352,8 @@ while [ "$OUTPUT" != "inserted" ]; do # exit 1 #fi else - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "initializing new session with ID $SESSION_NAME" - OUTPUT=`$X2GO_LIB_PATH/x2goinsertsession "$X2GO_PORT" "${current_host_name}" "$SESSION_NAME"` + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "initializing new session with ID ${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. @@ -374,25 +375,25 @@ if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ] || [ "x$X2GO_STYPE" = "xS" ] || ! ty X2GO_TELEKINESIS_ENABLED="0" fi -while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ] || [ "$TEKICTRL_PORT" == "" ] || [ "$TEKIDATA_PORT" == "" ]; do +while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ] || [ -z "${TEKICTRL_PORT}" ] || [ -z "${TEKIDATA_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. @@ -402,51 +403,51 @@ while [ "$GR_PORT" == "" ] || [ "$SOUND_PORT" == "" ] || [ "$FS_PORT" == "" ] || # # # 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" - elif [ "$FS_PORT" == "" ]; then - FS_PORT="$SSH_PORT" - elif [ "$TEKICTRL_PORT" == "" ]; then - TEKICTRL_PORT=$SSH_PORT - elif [ "$TEKIDATA_PORT" == "" ]; then - TEKIDATA_PORT=$SSH_PORT + if [ -z "${GR_PORT}" ]; then + GR_PORT="${SSH_PORT}" + elif [ -z "${SOUND_PORT}" ]; then + SOUND_PORT="${SSH_PORT}" + elif [ -z "${FS_PORT}" ]; then + FS_PORT="${SSH_PORT}" + elif [ -z "${TEKICTRL_PORT}" ]; then + TEKICTRL_PORT="${SSH_PORT}" + elif [ -z "${TEKIDATA_PORT}" ]; then + TEKIDATA_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}" @@ -459,145 +460,142 @@ STATE_FILE="${SESSION_DIR}/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 # unset LD_LIBRARY_PATH for the case when x2gostartagent started from x2godesktopsharing unset LD_LIBRARY_PATH # 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=$? - -X2GO_SND_PORT=1024 +X2GO_AGENT_PID="${!}" +X2GO_AGENT_RETVAL="${?}" -if [ -n "$SHADREQ_USER" ]; then - $X2GO_LIB_PATH/x2gosyslog "$0" "info" "creating new shadow session: $SESSION_NAME $X2GO_COOKIE $X2GO_AGENT_PID $X2GO_CLIENT $GR_PORT $SOUND_PORT $FS_PORT $SHADREQ_USER" - $X2GO_LIB_PATH/x2gocreateshadowsession "$SESSION_NAME" "$X2GO_COOKIE" "$X2GO_AGENT_PID" "$X2GO_CLIENT" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$SHADREQ_USER" > /dev/null +if [[ -n "${SHADREQ_USER}" ]]; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "creating new shadow session: ${SESSION_NAME} ${X2GO_COOKIE} ${X2GO_AGENT_PID} ${X2GO_CLIENT} ${GR_PORT} ${SOUND_PORT} ${FS_PORT} ${SHADREQ_USER}" + "${X2GO_LIB_PATH}/x2gocreateshadowsession" "${SESSION_NAME}" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SHADREQ_USER}" >'/dev/null' else - $X2GO_LIB_PATH/x2gosyslog "$0" "info" "creating new session: $SESSION_NAME $X2GO_COOKIE $X2GO_AGENT_PID $X2GO_CLIENT $GR_PORT $SOUND_PORT $FS_PORT $TEKICTRL_PORT $TEKIDATA_PORT" - $X2GO_LIB_PATH/x2gocreatesession "$SESSION_NAME" "$X2GO_COOKIE" "$X2GO_AGENT_PID" "$X2GO_CLIENT" "$GR_PORT" "$SOUND_PORT" "$FS_PORT" "$TEKICTRL_PORT" "$TEKIDATA_PORT" > /dev/null + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "creating new session: ${SESSION_NAME} ${X2GO_COOKIE} ${X2GO_AGENT_PID} ${X2GO_CLIENT} ${GR_PORT} ${SOUND_PORT} ${FS_PORT} ${TEKICTRL_PORT} ${TEKIDATA_PORT}" + "${X2GO_LIB_PATH}/x2gocreatesession" "${SESSION_NAME}" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${TEKICTRL_PORT}" "${TEKIDATA_PORT}" >'/dev/null' fi -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 -test $X2GO_AGENT_RETVAL && { - $X2GO_LIB_PATH/x2gosyslog "$0" "notice" "successfully started X2Go agent session with ID $SESSION_NAME" +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 - -} + x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "fail-start" || true +fi -echo $X2GO_PORT -echo $X2GO_COOKIE -echo $X2GO_AGENT_PID -echo $SESSION_NAME -echo $GR_PORT -echo $SOUND_PORT -echo $FS_PORT -if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then - echo $TEKICTRL_PORT - echo $TEKIDATA_PORT +echo "${X2GO_PORT}" +echo "${X2GO_COOKIE}" +echo "${X2GO_AGENT_PID}" +echo "${SESSION_NAME}" +echo "${GR_PORT}" +echo "${SOUND_PORT}" +echo "${FS_PORT}" +if [ "x${X2GO_TELEKINESIS_ENABLED}" == "x1" ]; then + echo "${TEKICTRL_PORT}" + echo "${TEKIDATA_PORT}" 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 master in repository x2goserver. commit a1548a60c6a6c647a38ac92b2a5d7b99e8f171a2 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 2afc7b9..2051d17 100644 --- a/debian/changelog +++ b/debian/changelog @@ -276,6 +276,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 2bf2dc4..864ecf6 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -481,9 +481,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 master in repository x2goserver. commit 97c9988516e91ac519ce44b71fc093649918a24a 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 11 +++++++++++ x2goserver/bin/x2gostartagent | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 80d0a06..115dee0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -280,6 +280,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 8205cd1..e603939 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -547,6 +547,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 # unset LD_LIBRARY_PATH for the case when x2gostartagent started from x2godesktopsharing unset LD_LIBRARY_PATH @@ -562,7 +563,6 @@ fi ln -s "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" X2GO_AGENT_PID="${!}" -X2GO_AGENT_RETVAL="${?}" if [[ -n "${SHADREQ_USER}" ]]; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "creating new shadow session: ${SESSION_NAME} ${X2GO_COOKIE} ${X2GO_AGENT_PID} ${X2GO_CLIENT} ${GR_PORT} ${SOUND_PORT} ${FS_PORT} ${SHADREQ_USER}" @@ -577,16 +577,22 @@ if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" != "auto" ]; then mkdir -p "${SESSION_DIR}/keyboard" fi -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 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 master in repository x2goserver. commit 0ba07529fe93057bd85b903fd5b6b95630489930 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 2051d17..80d0a06 100644 --- a/debian/changelog +++ b/debian/changelog @@ -278,6 +278,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 864ecf6..8205cd1 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -509,6 +509,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 master in repository x2goserver. commit 70d15b3e8ab7ff4cfc70766502e3156c1977931e 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index b0770d8..2a280e2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -293,6 +293,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 8e6542b..d980975 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -526,7 +526,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 master in repository x2goserver. commit 254fd5411e318161cbc80cfdfd5d381a2decc622 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 115dee0..b0770d8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -291,6 +291,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 e603939..8e6542b 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -331,7 +331,7 @@ while [ "${OUTPUT}" != "inserted" ]; do fi 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 master in repository x2goserver. commit ab860507f6c2062b9864ebac05bd83079cf36671 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 + x2goserver/lib/x2gogetfreeport | 169 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) diff --git a/debian/changelog b/debian/changelog index 2a280e2..bf9de4c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -295,6 +295,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 master in repository x2goserver. commit d3bd8b5dc3c16dc644c4ac639829ae1e2a8a1794 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 3 + x2goserver/lib/x2gogetrandomport | 120 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/debian/changelog b/debian/changelog index bf9de4c..a0a4bf8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -297,6 +297,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 master in repository x2goserver. commit 245b1b93f679e7c6a3434ff6addc527fdf3a6dcc 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index a0a4bf8..0db31ea 100644 --- a/debian/changelog +++ b/debian/changelog @@ -300,6 +300,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 d980975..9f67e74 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 master in repository x2goserver. commit 3c19aa062111cae194c4d8358346150b28f222a2 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 + x2goserver/bin/x2gostartagent | 91 +++++++------------------------------------ 2 files changed, 17 insertions(+), 76 deletions(-) diff --git a/debian/changelog b/debian/changelog index 0db31ea..fe39b73 100644 --- a/debian/changelog +++ b/debian/changelog @@ -302,6 +302,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 9f67e74..b8bea57 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_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config = get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` @@ -169,7 +108,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}''" @@ -223,7 +162,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}")" @@ -239,7 +178,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "8" + exit "9" fi else X2GO_CLIPBOARD="$1"; shift @@ -251,7 +190,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 master in repository x2goserver. commit bb50a7ec6bdbf49abde992ddaf38db0f0acebe11 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index bbd98e6..47d49c8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -306,6 +306,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 e959052..e692140 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 master in repository x2goserver. commit 930f6ddbf39b35244137bafae480e1216f8ab9da 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index fe39b73..bbd98e6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -304,6 +304,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 b8bea57..bf9bf41 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -178,7 +178,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "9" + exit "0" fi else X2GO_CLIPBOARD="$1"; shift -- 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 master in repository x2goserver. commit 727b253f111535d5e06388a12241272a966d0359 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 47d49c8..f247d8e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -308,6 +308,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 e692140..5cac4e1 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -214,7 +214,14 @@ else TEKIDATA_PORT="0" 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 master in repository x2goserver. commit 6cb9bb10b8d476572a7d47dc5e1b0987c49aaea8 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 5 ++ x2goserver/bin/x2goresume-session | 85 ++++++++++----------- x2goserver/bin/x2gostartagent | 151 +++++++++++++------------------------- 3 files changed, 99 insertions(+), 142 deletions(-) diff --git a/debian/changelog b/debian/changelog index f247d8e..55854d1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -310,6 +310,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 5cac4e1..b624c97 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -170,12 +170,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 @@ -223,44 +217,51 @@ 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" == "" ] || [ "$TEKICTRL_PORT" == "" ] || [ "$TEKIDATA_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}" ] || [ -z "${TEKICTRL_PORT}" ] || [ -z "${TEKIDATA_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" - elif [ "$FS_PORT" == "" ]; then - FS_PORT="$SSH_PORT" - elif [ "$TEKICTRL_PORT" == "" ]; then - TEKICTRL_PORT="$SSH_PORT" - elif [ "$TEKIDATA_PORT" == "" ]; then - TEKIDATA_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}" + elif [ -z "${FS_PORT}" ]; then + FS_PORT="${SSH_PORT}" + elif [ -z "${TEKICTRL_PORT}" ]; then + TEKICTRL_PORT="${SSH_PORT}" + elif [ -z "${TEKIDATA_PORT}" ]; then + TEKIDATA_PORT="${SSH_PORT}" fi done diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index bf9bf41..c209044 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 @@ -216,53 +216,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 if [ -n "${SHADREQ_USER}" ]; then SESSION_NAME="${SHADREQ_USER}-${X2GO_PORT}-$(date "+%s")" else @@ -278,36 +239,31 @@ while [ "${OUTPUT}" != "inserted" ]; do if [ -n "${SHADREQ_USER}" ]; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "initializing new shadow session with ID ${SESSION_NAME}" - OUTPUT="$("${X2GO_LIB_PATH}/x2goinsertshadowsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}" "${SHADREQ_USER}")" - - # 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}), session name (${SESSION_NAME}) and user requesting desktop sharing permissions (${SHADREQ_USER})." - # "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - # - # # Make x2goclient fail. - # echo "${msg}" >&2 - # exit 1 - #fi + output="$("${X2GO_LIB_PATH}/x2goinsertshadowsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}" "${SHADREQ_USER}")" else "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "initializing new session with ID ${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 1 - #fi + output="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" + fi + + 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 + if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ] || [ "x$X2GO_STYPE" = "xS" ] || ! type -p telekinesis-server 1>/dev/null; then TEKICTRL_PORT="-1" TEKIDATA_PORT="-1" @@ -315,38 +271,33 @@ if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ] || [ "x$X2GO_STYPE" = "xS" ] || ! ty fi while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ] || [ -z "${TEKICTRL_PORT}" ] || [ -z "${TEKIDATA_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 master in repository x2goserver. commit d2e9f369cc2e5f5af7627fb70d196a17ff5bd2f2 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 4 + x2goserver/bin/x2goresume-session | 323 ++++++++++++++++++-------------------- 2 files changed, 161 insertions(+), 166 deletions(-) diff --git a/debian/changelog b/debian/changelog index 47d8724..79adc6f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -317,6 +317,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 b624c97..7755db4 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,30 +20,29 @@ # 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=0 -X2GO_FULLSCREEN=0 +X2GO_RESIZE='0' +X2GO_FULLSCREEN='0' # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this # variable is not already set in the environment. @@ -56,90 +55,82 @@ 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: ${*}" -X2GO_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config= get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` +X2GO_TELEKINESIS_ENABLED="$(perl -e 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config= get_config(); print is_true($Config->param("telekinesis.enable"));')" # rootless sessions require to be resizable if [ "$SESSION_TYPE" == "R" ]; then @@ -147,45 +138,47 @@ if [ "$SESSION_TYPE" == "R" ]; then fi # 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_RESIZE=1 - X2GO_FULLSCREEN=1 +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]]; then + X2GO_RESIZE='1' + 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 [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then @@ -210,11 +203,11 @@ 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 @@ -224,7 +217,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}" ] || [ -z "${TEKICTRL_PORT}" ] || [ -z "${TEKIDATA_PORT}" ]; do +while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] || [[ -z "${TEKICTRL_PORT}" ]] || [[ -z "${TEKIDATA_PORT}" ]]; do output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' @@ -233,28 +226,28 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ] || [ 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}" elif [ -z "${FS_PORT}" ]; then FS_PORT="${SSH_PORT}" @@ -267,103 +260,101 @@ 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" "$TEKICTRL_PORT" "$TEKIDATA_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}" if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then echo "tekictrl_port=$TEKICTRL_PORT" echo "tekidata_port=$TEKIDATA_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 master in repository x2goserver. commit c59ec73b573c0cc1677c7257060716654c5a2d7f 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 55854d1..47d8724 100644 --- a/debian/changelog +++ b/debian/changelog @@ -315,6 +315,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 c209044..5263fb7 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 master in repository x2goserver. commit 9b4b1ce41d43e2672518ed4ee48fb99b53f39946 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 3 + x2goserver/bin/x2gostartagent | 304 +++++++++++++++++++++--------------------- 2 files changed, 155 insertions(+), 152 deletions(-) diff --git a/debian/changelog b/debian/changelog index 79adc6f..bfdb2e6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -321,6 +321,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 5263fb7..cf526ed 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,15 +69,15 @@ 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_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config = get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` @@ -85,33 +85,33 @@ X2GO_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Uti 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 @@ -122,54 +122,54 @@ 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}" '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}")" OUTPUT="$(sed -e 's/#012/ /g' <<< "${OUTPUT}")" - "${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}" '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}" @@ -178,7 +178,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "0" + exit '0' fi else X2GO_CLIPBOARD="$1"; shift @@ -187,29 +187,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 @@ -225,17 +225,17 @@ for ((retry = 0; retry < max_retry; ++retry)); do X2GO_PORT="${free_port}" if [ -n "${SHADREQ_USER}" ]; then - SESSION_NAME="${SHADREQ_USER}-${X2GO_PORT}-$(date "+%s")" + SESSION_NAME="${SHADREQ_USER}-${X2GO_PORT}-$(date '+%s')" else - SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" + SESSION_NAME="${USER}-${X2GO_PORT}-$(date '+%s')" fi - if [ "${COLORDEPTH}" != "" ]; then + 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}")" if [ -n "${SHADREQ_USER}" ]; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "initializing new shadow session with ID ${SESSION_NAME}" @@ -245,23 +245,23 @@ for ((retry = 0; retry < max_retry; ++retry)); do output="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" fi - 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 if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ] || [ "x$X2GO_STYPE" = "xS" ] || ! type -p telekinesis-server 1>/dev/null; then @@ -270,7 +270,7 @@ if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ] || [ "x$X2GO_STYPE" = "xS" ] || ! ty X2GO_TELEKINESIS_ENABLED="0" fi -while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ] || [ -z "${TEKICTRL_PORT}" ] || [ -z "${TEKIDATA_PORT}" ]; do +while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] || [[ -z "${TEKICTRL_PORT}" ]] || [[ -z "${TEKIDATA_PORT}" ]]; do output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' @@ -279,28 +279,28 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ] || [ 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}" elif [ -z "${FS_PORT}" ]; then FS_PORT="${SSH_PORT}" @@ -312,32 +312,32 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ] || [ 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}" @@ -349,46 +349,46 @@ STATE_FILE="${SESSION_DIR}/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}" @@ -407,50 +407,50 @@ 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 # unset LD_LIBRARY_PATH for the case when x2gostartagent started from x2godesktopsharing unset LD_LIBRARY_PATH # 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="${!}" @@ -462,27 +462,27 @@ else "${X2GO_LIB_PATH}/x2gocreatesession" "${SESSION_NAME}" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${TEKICTRL_PORT}" "${TEKIDATA_PORT}" >'/dev/null' fi -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 -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 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 master in repository x2goserver. commit 941b333bfd431903c681d5e6540c4a66ca0ec72f Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 03:30:57 2018 +0100 x2goserver/lib/x2gogetfreeport: use single quotes for literal strings. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 1 + x2goserver/lib/x2gogetfreeport | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/debian/changelog b/debian/changelog index bfdb2e6..d0802ec 100644 --- a/debian/changelog +++ b/debian/changelog @@ -324,6 +324,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 master in repository x2goserver. commit 3d3b7566f3c4ccad43c74d9d24be3ab080f5b6bf 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/lib/x2gogetfreeport | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index d0802ec..8bad925 100644 --- a/debian/changelog +++ b/debian/changelog @@ -325,6 +325,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 master in repository x2goserver. commit eef6425c59110df81d2134dcf30f1649154ac6d3 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 + x2goserver/lib/x2gocheckport | 280 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 282 insertions(+) diff --git a/debian/changelog b/debian/changelog index 8bad925..7efec84 100644 --- a/debian/changelog +++ b/debian/changelog @@ -327,6 +327,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 master in repository x2goserver. commit 98b8b4a86d63c42d8a377233a15f1a04e1409ef4 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. Cherry-picked from release/4.0.1.x branch. --- 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 2fab631..52b4507 100644 --- a/debian/changelog +++ b/debian/changelog @@ -331,6 +331,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 7755db4..4ae76b0 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -221,7 +221,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 cf526ed..e9e89f4 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -221,7 +221,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}" if [ -n "${SHADREQ_USER}" ]; then @@ -274,7 +274,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 master in repository x2goserver. commit bc08472f6a43df25ad5d39798681a0653d1f0b24 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/lib/x2gogetfreeport | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7efec84..2fab631 100644 --- a/debian/changelog +++ b/debian/changelog @@ -329,6 +329,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 master in repository x2goserver. commit 592e7026d60c0f7b6f7c5ee761606ba598eb20a0 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 9 03:21:41 2018 +0100 x2goserver/bin/x2goresume-ression: whitespace fix only. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 1 + x2goserver/bin/x2goresume-session | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 272a9b5..553078a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -336,6 +336,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 b48c472..57a8914 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -326,7 +326,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 master in repository x2goserver. commit dbbddb91329b91148d08f17d1eaa13c603e203b4 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. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 52b4507..272a9b5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -334,6 +334,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 4ae76b0..b48c472 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -161,21 +161,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='' @@ -210,9 +216,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 master in repository x2goserver. commit c2e2bad6703d6a333ea0fc7fcdc7c463bfa36f69 Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 9 03:56:12 2018 +0100 x2goserver/bin/x2gostartagent: fix most other shellcheck warnings, more quotes, curly braces et. al. --- debian/changelog | 2 ++ x2goserver/bin/x2gostartagent | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/debian/changelog b/debian/changelog index 553078a..1d3ab00 100644 --- a/debian/changelog +++ b/debian/changelog @@ -197,6 +197,8 @@ x2goserver (4.1.0.0-0x2go1.2) UNRELEASED; urgency=low - X2Go/Server/DB/SQLite3.pm: fix command name in error messages. - X2Go/Utils.pm: backport user name regex changes. - x2goserver-x2goagent/etc/x2goagent.options: reenable XFIXES extension. + - x2goserver/bin/x2gostartagent: fix most other shellcheck warnings, more + quotes, curly braces et. al. * x2goserver.spec: - Only create session DB in x2goserver's post install script. Do use proper Requires(post) statements to make sure perl-X2Go-Server-DB and diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index e9e89f4..bcf38be 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -80,7 +80,7 @@ if ! current_host_name="$(hostname)"; then exit '6' fi -X2GO_TELEKINESIS_ENABLED=`echo 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config = get_config(); print is_true($Config->param("telekinesis.enable"));' | perl` +X2GO_TELEKINESIS_ENABLED="$(perl -e 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config = get_config(); print is_true($Config->param("telekinesis.enable"));')" X2GO_ROOT="${HOME}/.x2go" export NX_ROOT="${X2GO_ROOT}" @@ -181,7 +181,7 @@ if [[ "${X2GO_STYPE}" = 'S' ]]; then exit '0' fi else - X2GO_CLIPBOARD="$1"; shift + X2GO_CLIPBOARD="${1}"; shift fi LIMIT="$(x2gosessionlimit)" @@ -224,7 +224,7 @@ for ((retry = 0; retry < max_retry; ++retry)); do if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${current_host_name}" "${ss}" 'display' "${X2GO_PORT}")"; then X2GO_PORT="${free_port}" - if [ -n "${SHADREQ_USER}" ]; then + if [[ -n "${SHADREQ_USER}" ]]; then SESSION_NAME="${SHADREQ_USER}-${X2GO_PORT}-$(date '+%s')" else SESSION_NAME="${USER}-${X2GO_PORT}-$(date '+%s')" @@ -237,7 +237,7 @@ for ((retry = 0; retry < max_retry; ++retry)); do # sanitize session name SESSION_NAME="$(perl -pe 's/[^a-zA-Z0-9\.\_\-\@]//g' <<< "${SESSION_NAME}")" - if [ -n "${SHADREQ_USER}" ]; then + if [[ -n "${SHADREQ_USER}" ]]; then "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "initializing new shadow session with ID ${SESSION_NAME}" output="$("${X2GO_LIB_PATH}/x2goinsertshadowsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}" "${SHADREQ_USER}")" else @@ -264,10 +264,10 @@ if [[ "${output}" != 'inserted' ]]; then exit '11' fi -if [ "x$X2GO_TELEKINESIS_ENABLED" == "x0" ] || [ "x$X2GO_STYPE" = "xS" ] || ! type -p telekinesis-server 1>/dev/null; then - TEKICTRL_PORT="-1" - TEKIDATA_PORT="-1" - X2GO_TELEKINESIS_ENABLED="0" +if [[ "${X2GO_TELEKINESIS_ENABLED}" = '0' ]] || [[ "${X2GO_STYPE}" = 'S' ]] || ! type -p 'telekinesis-server' 1>'/dev/null'; then + TEKICTRL_PORT='-1' + TEKIDATA_PORT='-1' + X2GO_TELEKINESIS_ENABLED='0' fi while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] || [[ -z "${TEKICTRL_PORT}" ]] || [[ -z "${TEKIDATA_PORT}" ]]; do @@ -302,11 +302,11 @@ while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] GR_PORT="${SSH_PORT}" elif [[ -z "${SOUND_PORT}" ]]; then SOUND_PORT="${SSH_PORT}" - elif [ -z "${FS_PORT}" ]; then + elif [[ -z "${FS_PORT}" ]]; then FS_PORT="${SSH_PORT}" - elif [ -z "${TEKICTRL_PORT}" ]; then + elif [[ -z "${TEKICTRL_PORT}" ]]; then TEKICTRL_PORT="${SSH_PORT}" - elif [ -z "${TEKIDATA_PORT}" ]; then + elif [[ -z "${TEKIDATA_PORT}" ]]; then TEKIDATA_PORT="${SSH_PORT}" fi done @@ -341,8 +341,8 @@ if [[ ! -d "${X2GO_TMP_ROOT}" ]]; then fi SESSION_DIR="${X2GO_TMP_ROOT}/C-${SESSION_NAME}" -if [ "x$X2GO_TELEKINESIS_ENABLED" != "x0" ] && [ "x$X2GO_STYPE" != "xS" ]; then - mkdir -p "${SESSION_DIR}/telekinesis/remote/" +if [[ "${X2GO_TELEKINESIS_ENABLED}" != '0' ]] && [[ "${X2GO_STYPE}" != 'S' ]]; then + mkdir -p -- "${SESSION_DIR}/telekinesis/remote/" fi STATE_FILE="${SESSION_DIR}/state" @@ -492,7 +492,7 @@ echo "${SESSION_NAME}" echo "${GR_PORT}" echo "${SOUND_PORT}" echo "${FS_PORT}" -if [ "x${X2GO_TELEKINESIS_ENABLED}" == "x1" ]; then +if [[ "${X2GO_TELEKINESIS_ENABLED}" = '1' ]]; then echo "${TEKICTRL_PORT}" echo "${TEKIDATA_PORT}" 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 master in repository x2goserver. commit c72c70412d8e362f94e773a1f756e078319b3dfb Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 9 05:56:51 2018 +0100 x2goserver/bin/x2gostartagent: check and adapt exit codes. Cherry-picked from release/4.0.1.x branch. --- debian/changelog | 1 + x2goserver/bin/x2gostartagent | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index 1d3ab00..3ecc274 100644 --- a/debian/changelog +++ b/debian/changelog @@ -339,6 +339,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 bcf38be..9e659a1 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -190,7 +190,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" @@ -261,7 +261,7 @@ if [[ "${output}" != 'inserted' ]]; then # Make x2goclient fail. echo "${msg}" >&2 - exit '11' + exit '10' fi if [[ "${X2GO_TELEKINESIS_ENABLED}" = '0' ]] || [[ "${X2GO_STYPE}" = 'S' ]] || ! type -p 'telekinesis-server' 1>'/dev/null'; then @@ -295,7 +295,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 @@ -482,7 +482,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 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 master in repository x2goserver. commit f8ee1e3e59836d72a56737fa2733dba8d7d0d29b Author: Mihai Moldovan <ionic@ionic.de> Date: Tue Jan 9 06:37:07 2018 +0100 x2goserver/bin/x2goresume-session: fix most other shellcheck warnings, more quotes, curly braces et. al. --- debian/changelog | 2 ++ x2goserver/bin/x2goresume-session | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/debian/changelog b/debian/changelog index 3ecc274..8e6e35d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -199,6 +199,8 @@ x2goserver (4.1.0.0-0x2go1.2) UNRELEASED; urgency=low - x2goserver-x2goagent/etc/x2goagent.options: reenable XFIXES extension. - x2goserver/bin/x2gostartagent: fix most other shellcheck warnings, more quotes, curly braces et. al. + - x2goserver/bin/x2goresume-session: fix most other shellcheck warnings, + more quotes, curly braces et. al. * x2goserver.spec: - Only create session DB in x2goserver's post install script. Do use proper Requires(post) statements to make sure perl-X2Go-Server-DB and diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 2a3258b..97a7dbb 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -181,24 +181,24 @@ if ! check_system_port "${ss}" "${FS_PORT}"; then FS_PORT='' fi -if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then - TEKICTRL_PORT=`echo "$SESSIONINFO" | awk -F, {'print $15'}` - TEKIDATA_PORT=`echo "$SESSIONINFO" | awk -F, {'print $16'}` - if grep -q "|${TEKICTRL_PORT}|" <<<$SYSTEM_PORTS ; then - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port "$TEKICTRL_PORT" is already in use" +if [[ "${X2GO_TELEKINESIS_ENABLED}" = '1' ]]; then + TEKICTRL_PORT="$(awk -F ',' '{print $15}' <<< "${SESSIONINFO}")" + TEKIDATA_PORT="$(awk -F ',' '{print $16}' <<< "${SESSIONINFO}")" + if ! check_system_port "${ss}" "${TEKICTRL_PORT}"; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${TEKICTRL_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${TEKICTRL_PORT}" - TEKICTRL_PORT="" + TEKICTRL_PORT='' fi - if grep -q "|${TEKIDATA_PORT}|" <<<$SYSTEM_PORTS ; then - $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "port "$TEKIDATA_PORT" is already in use" + if ! check_system_port "${ss}" "${TEKIDATA_PORT}"; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "port ${TEKIDATA_PORT} is already in use" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${TEKIDATA_PORT}" - TEKIDATA_PORT="" + TEKIDATA_PORT='' fi else "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${TEKICTRL_PORT}" "${X2GO_LIB_PATH}/x2gormport" "${current_host_name}" "${SESSION_NAME}" "${TEKIDATA_PORT}" - TEKICTRL_PORT="0" - TEKIDATA_PORT="0" + TEKICTRL_PORT='0' + TEKIDATA_PORT='0' fi if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then @@ -246,11 +246,11 @@ while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]] GR_PORT="${SSH_PORT}" elif [[ -z "${SOUND_PORT}" ]]; then SOUND_PORT="${SSH_PORT}" - elif [ -z "${FS_PORT}" ]; then + elif [[ -z "${FS_PORT}" ]]; then FS_PORT="${SSH_PORT}" - elif [ -z "${TEKICTRL_PORT}" ]; then + elif [[ -z "${TEKICTRL_PORT}" ]]; then TEKICTRL_PORT="${SSH_PORT}" - elif [ -z "${TEKIDATA_PORT}" ]; then + elif [[ -z "${TEKIDATA_PORT}" ]]; then TEKIDATA_PORT="${SSH_PORT}" fi done @@ -352,7 +352,7 @@ fi echo "gr_port=${GR_PORT}" echo "sound_port=${SOUND_PORT}" echo "fs_port=${FS_PORT}" -if [ "x$X2GO_TELEKINESIS_ENABLED" == "x1" ]; then - echo "tekictrl_port=$TEKICTRL_PORT" - echo "tekidata_port=$TEKIDATA_PORT" +if [[ "${X2GO_TELEKINESIS_ENABLED}" = '1' ]]; then + echo "tekictrl_port=${TEKICTRL_PORT}" + echo "tekidata_port=${TEKIDATA_PORT}" 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 master in repository x2goserver. commit 8c194489c0511a5a531ca61398b3ce928f34062c Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Fri Nov 22 22:14:46 2013 +0100 Fix resizing when resuming sessions. Cherry-picked from release/4.0.1.x branch. --- x2goserver/bin/x2goresume-session | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/x2goserver/bin/x2goresume-session b/x2goserver/bin/x2goresume-session index 57a8914..2a3258b 100755 --- a/x2goserver/bin/x2goresume-session +++ b/x2goserver/bin/x2goresume-session @@ -41,7 +41,7 @@ X2GO_CLIPBOARD="${8}" X2GO_AGENT_PID="$("${X2GO_LIB_PATH}/x2gogetagent" "${SESSION_NAME}")" X2GO_ROOT="${HOME}/.x2go" -X2GO_RESIZE='0' +X2GO_RESIZE='1' X2GO_FULLSCREEN='0' # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this @@ -132,11 +132,6 @@ fi X2GO_TELEKINESIS_ENABLED="$(perl -e 'use X2Go::Config qw( get_config ); use X2Go::Utils qw( is_true ); my $Config= get_config(); print is_true($Config->param("telekinesis.enable"));')" -# rootless sessions require to be resizable -if [ "$SESSION_TYPE" == "R" ]; then - X2GO_RESIZE=1 -fi - # rootless sessions of geometry fullscreen are invalid if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]] && [[ "${SESSION_TYPE}" = 'R' ]]; then X2GO_GEOMETRY='' @@ -147,7 +142,6 @@ if [[ -z "${X2GO_GEOMETRY}" ]] && [[ "${SESSION_TYPE}" = 'D' ]]; then X2GO_GEOMETRY="fullscreen" fi if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]]; then - X2GO_RESIZE='1' X2GO_FULLSCREEN='1' fi -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git