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 <[email protected]>
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
_______________________________________________
x2go-commits mailing list
[email protected]
https://lists.x2go.org/listinfo/x2go-commits

Reply via email to