This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit 9de1883d8ee6b71e3d936a67eef651c8f761ba0b Author: Mihai Moldovan <ionic@ionic.de> Date: Sun Jan 7 03:11:27 2018 +0100 x2goserver/bin/x2gostartagent: use single quotes for literal strings, bash-style checks, more curly braces, terminate options for commands that use outside input (variables), fix copyright notice. --- debian/changelog | 3 + x2goserver/bin/x2gostartagent | 304 +++++++++++++++++++++--------------------- 2 files changed, 155 insertions(+), 152 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7e9bca9..1c1ebb1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -62,6 +62,9 @@ x2goserver (4.0.1.23-0x2go1) UNRELEASED; urgency=medium bash-style tests, more quotes, curly braces, wrap literal strings in single quotes, avoid useless constructs, fix whitespace errors and probably more. + - x2goserver/bin/x2gostartagent: use single quotes for literal strings, + bash-style checks, more curly braces, terminate options for commands + that use outside input (variables), fix copyright notice. * x2goserver.spec: - RPMify x2goserver-xsession description. - Remove qt4 stuff, we're not using the framework here. diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index cb37580..be4a27b 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2007-20157 X2Go Project - http://wiki.x2go.org +# Copyright (C) 2007-2018 X2Go Project - http://wiki.x2go.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,42 +20,42 @@ # Copyright (C) 2007-2017 Oleksandr Shneyder <oleksandr.shneyder@obviously-nice.de> # Copyright (C) 2007-2017 Heinz-Markus Graesing <heinz-m.graesing@obviously-nice.de> -X2GO_LIB_PATH="$(x2gopath "libexec")" +X2GO_LIB_PATH="$(x2gopath 'libexec')" -"${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "$(basename "${0}") called with options: ${*}" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "$(basename "${0}") called with options: ${*}" if ! SSH_PORT="$("${X2GO_LIB_PATH}/x2gogetrandomport")"; then - typeset msg="Unable to get (pseudo-)randomized starting port value." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + typeset msg='Unable to get (pseudo-)randomized starting port value.' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "1" + exit '1' fi -X2GO_PORT="50" +X2GO_PORT='50' # some sanity checks before session startup... -if grep -E "^backend[ ]*=[ ]*postgres" "/etc/x2go/x2gosql/sql" 1>"/dev/null" 2>"/dev/null" && [ "x${USER}" = "xroot" ]; then - msg="The super-user \"root\" is not allowed to launch X2Go sessions." +if grep -E -- '^backend[ ]*=[ ]*postgres' '/etc/x2go/x2gosql/sql' &>'/dev/null' && [[ "${USER}" = 'root' ]]; then + msg='The super-user "root" is not allowed to launch X2Go sessions.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "2" -elif [ -z "${USER}" ]; then - msg="The \$USER environment variable is not set. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '2' +elif [[ -z "${USER}" ]]; then + msg='The $USER environment variable is not set. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "3" -elif [ -z "${HOME}" ]; then - msg="The \$HOME environment variable is not set. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '3' +elif [[ -z "${HOME}" ]]; then + msg='The $HOME environment variable is not set. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "4" -elif ! iconv -f ASCII -t ASCII &>"/dev/null" <<< "${HOME}"; then - msg="Your home directory path contains non-ASCII characters. Aborting session startup." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '4' +elif ! iconv -f 'ASCII' -t 'ASCII' &>'/dev/null' <<< "${HOME}"; then + msg='Your home directory path contains non-ASCII characters. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "5" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '5' fi # ${HOSTNAME} should be automatically set by bash via gethostname(2), IFF this @@ -69,47 +69,47 @@ fi # system host name. # # Workaround: use hostname. -typeset current_host_name="" +typeset current_host_name='' if ! current_host_name="$(hostname)"; then - typeset msg="Unable to retrieve machine's hostname. This is required. Aborting session startup." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + typeset msg='Unable to retrieve machine'"'"'s hostname. This is required. Aborting session startup.' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "6" + exit '6' fi X2GO_ROOT="${HOME}/.x2go" export NX_ROOT="${X2GO_ROOT}" -X2GO_NXAGENT_DEFAULT_OPTIONS="-extension GLX -nolisten tcp" +X2GO_NXAGENT_DEFAULT_OPTIONS='-extension GLX -nolisten tcp' -if [ -r "/etc/x2go/x2goagent.options" ]; then - source "/etc/x2go/x2goagent.options" +if [[ -r '/etc/x2go/x2goagent.options' ]]; then + source '/etc/x2go/x2goagent.options' fi -if [ -z "${X2GO_NXAGENT_OPTIONS}" ]; then +if [[ -z "${X2GO_NXAGENT_OPTIONS}" ]]; then X2GO_NXAGENT_OPTIONS="${X2GO_NXAGENT_DEFAULT_OPTIONS}" fi -REMOTE="localhost" +REMOTE='localhost' # shadow sessions (via x2godesktopsharing) set the X2GO_CLIENT var in the process environment # so either it is already set or we obtain it from SSH_CLIENT/SSH_CONNECTION -if [ -z "${X2GO_CLIENT}" ] && [ -n "${SSH_CLIENT}" ]; then +if [[ -z "${X2GO_CLIENT}" ]] && [[ -n "${SSH_CLIENT}" ]]; then X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CLIENT}")" -elif [ -z "${X2GO_CLIENT}" ] && [ -n "${SSH_CONNECTION}" ]; then +elif [[ -z "${X2GO_CLIENT}" ]] && [[ -n "${SSH_CONNECTION}" ]]; then X2GO_CLIENT="$(awk '{print $1}' <<< "${SSH_CONNECTION}")" fi -if [ -z "${X2GO_CLIENT}" ]; then - msg="The \$X2GO_CLIENT environment variable is not set. Possible reasons: \$SSH_CLIENT not set or \$SSH_CONNECTION not set. Or \$X2GO_CLIENT not set by ,,X2Go Desktop Sharing'' applet. Aborting session startup." +if [[ -z "${X2GO_CLIENT}" ]]; then + msg='The $X2GO_CLIENT environment variable is not set. Possible reasons: $SSH_CLIENT not set or $SSH_CONNECTION not set. Or $X2GO_CLIENT not set by the "X2Go Desktop Sharing" applet. Aborting session startup.' echo "${msg}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" - exit "7" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" + exit '7' fi -"${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "client announced itself as ,,${X2GO_CLIENT}''" +"${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "client announced itself as "'"'"${X2GO_CLIENT}"'"' X2GO_GEOMETRY="${1}"; shift X2GO_LINK="${1}"; shift @@ -120,53 +120,53 @@ X2GO_KBD_TYPE="${1}"; shift X2GO_SET_KBD="${1}"; shift X2GO_STYPE="${1}"; shift X2GO_CMD="${1}"; shift -X2GO_RESIZE="1" -X2GO_FULLSCREEN="0" +X2GO_RESIZE='1' +X2GO_FULLSCREEN='0' -X2GO_CLIPBOARD="" +X2GO_CLIPBOARD='' : "${XAUTHORITY:="${HOME}/.Xauthority"}" -if [ "${X2GO_STYPE}" == "S" ]; then +if [[ "${X2GO_STYPE}" = 'S' ]]; then SHADOW_MODE="$(awk '{split($0,a,"XSHAD"); print a[1]}' <<< "${X2GO_CMD}")" SHADOW_USER="$(awk '{split($0,a,"XSHAD"); print a[2]}' <<< "${X2GO_CMD}")" SHADOW_DESKTOP="$(awk '{split($0,a,"XSHAD"); print a[3]}' <<< "${X2GO_CMD}")" - if [ -z "${1}" ]; then + if [[ -z "${1}" ]]; then # can this line be removed? #echo "suser ${SHADOW_USER} user ${USER} " >>"/tmp/uagent" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "shadow session requested: mode ${SHADOW_MODE}, user: ${SHADOW_USER}, desktop: ${SHADOW_DESKTOP}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "shadow session requested: mode ${SHADOW_MODE}, user: ${SHADOW_USER}, desktop: ${SHADOW_DESKTOP}" else SHADREQ_USER="${1}"; shift - "${X2GO_LIB_PATH}/x2gosyslog" "$0" "debug" "preparing shadow session request for user ${SHADREQ_USER}, agent starts for user ${USER}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "preparing shadow session request for user ${SHADREQ_USER}, agent starts for user ${USER}" fi - if [ "${SHADOW_USER}" != "${USER}" ]; then + if [[ "${SHADOW_USER}" != "${USER}" ]]; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "user ,,${USER}'' requests desktop sharing from user ,,${SHADOW_USER}'' for desktop ,,${SHADOW_DESKTOP}''" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "executing command: x2godesktopsharing client ${X2GO_CLIENT} ${X2GO_GEOMETRY} ${X2GO_LINK} ${X2GO_PACK} ${X2GO_TYPE} ${X2GO_KBD_LAYOUT} ${X2GO_KBD_TYPE} ${X2GO_SET_KBD} ${X2GO_STYPE} ${X2GO_CMD} ${USER}" - OUTPUT="$(x2godesktopsharing "client" "${X2GO_CLIENT}" "${X2GO_GEOMETRY}" "${X2GO_LINK}" "${X2GO_PACK}" "${X2GO_TYPE}" "${X2GO_KBD_LAYOUT}" "${X2GO_KBD_TYPE}" "${X2GO_SET_KBD}" "${X2GO_STYPE}" "${X2GO_CMD}" "${USER}")" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "command result is: ${OUTPUT}" - if [ "${OUTPUT:0:4}" == "DENY" ]; then - echo "ACCESS DENIED" >&2 + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'notice' "user "'"'"${USER}"'"'" requests desktop sharing from user "'"'"${SHADOW_USER}"'"'" for desktop "'"'"${SHADOW_DESKTOP}"'"' + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "executing command: x2godesktopsharing client ${X2GO_CLIENT} ${X2GO_GEOMETRY} ${X2GO_LINK} ${X2GO_PACK} ${X2GO_TYPE} ${X2GO_KBD_LAYOUT} ${X2GO_KBD_TYPE} ${X2GO_SET_KBD} ${X2GO_STYPE} ${X2GO_CMD} ${USER}" + OUTPUT="$(x2godesktopsharing 'client' "${X2GO_CLIENT}" "${X2GO_GEOMETRY}" "${X2GO_LINK}" "${X2GO_PACK}" "${X2GO_TYPE}" "${X2GO_KBD_LAYOUT}" "${X2GO_KBD_TYPE}" "${X2GO_SET_KBD}" "${X2GO_STYPE}" "${X2GO_CMD}" "${USER}")" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "command result is: ${OUTPUT}" + if [[ "${OUTPUT:0:4}" = 'DENY' ]]; then + echo 'ACCESS DENIED' >&2 DENIAL_REASON="${OUTPUT:5}" - if [ -z "${DENIAL_REASON}" ]; then - DENIAL_REASON="the user ,,${SHADOW_USER}'' does not seem to have desktop sharing activated" + if [[ -z "${DENIAL_REASON}" ]]; then + DENIAL_REASON="the user "'"'"${SHADOW_USER}"'"'" does not seem to have desktop sharing activated" fi - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: user ${SHADOW_USER} denied desktop sharing session" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" - exit "8" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "ERROR: user ${SHADOW_USER} denied desktop sharing session" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" + exit '8' fi X2GO_COOKIE="$(awk '{print $2}' <<< "${OUTPUT}")" X2GO_PORT="$(awk '{print $1}' <<< "${OUTPUT}")" - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "received shadow session information: cookie: ${X2GO_COOKIE}, port: ${X2GO_PORT}" - xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" - xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "received shadow session information: cookie: ${X2GO_COOKIE}, port: ${X2GO_PORT}" + xauth -f "${XAUTHORITY}" 'add' "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" + xauth -f "${XAUTHORITY}" 'add' "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" echo "${X2GO_PORT}" echo "${X2GO_COOKIE}" @@ -175,7 +175,7 @@ if [ "${X2GO_STYPE}" == "S" ]; then awk '{print $5}' <<< "${OUTPUT}" awk '{print $6}' <<< "${OUTPUT}" awk '{print $7}' <<< "${OUTPUT}" - exit "0" + exit '0' else X2GO_CLIPBOARD="${1}"; shift fi @@ -184,29 +184,29 @@ fi LIMIT="$(x2gosessionlimit)" LWORD="$(awk '{print $1}' <<< "${LIMIT}")" -if [ "${LWORD}" == "LIMIT" ]; then +if [[ "${LWORD}" = 'LIMIT' ]]; then echo "${LIMIT}" >&2 - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "session limit has been reached for user ,,${USER}'', cannot start new session" - exit "10" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "session limit has been reached for user "'"'"${USER}"'"'", cannot start new session" + exit '10' fi export NX_CLIENT="${X2GO_LIB_PATH}/x2gosuspend-agent" COLORDEPTH="$(awk '{split($0,a,"-depth_"); print a[2]}' <<< "${X2GO_TYPE}")" -SESSION_TYPE="D" -NOEXITPARAM="" +SESSION_TYPE='D' +NOEXITPARAM='' -if [ "${X2GO_STYPE}" == "R" ]; then - SESSION_TYPE="R" -elif [ "${X2GO_STYPE}" == "P" ]; then - SESSION_TYPE="R" - NOEXITPARAM="-norootlessexit" -elif [ "${X2GO_STYPE}" == "S" ]; then - SESSION_TYPE="S" +if [[ "${X2GO_STYPE}" = 'R' ]]; then + SESSION_TYPE='R' +elif [[ "${X2GO_STYPE}" = 'P' ]]; then + SESSION_TYPE='R' + NOEXITPARAM='-norootlessexit' +elif [[ "${X2GO_STYPE}" = 'S' ]]; then + SESSION_TYPE='S' fi -if [ -z "${X2GO_CLIENT}" ]; then +if [[ -z "${X2GO_CLIENT}" ]]; then X2GO_CLIENT="${current_host_name}" fi @@ -221,37 +221,37 @@ for ((retry = 0; retry < max_retry; ++retry)); do if free_port="$("${X2GO_LIB_PATH}/x2gogetfreeport" "${ss}" 'display' "${X2GO_PORT}")"; then X2GO_PORT="${free_port}" - SESSION_NAME="${USER}-${X2GO_PORT}-$(date "+%s")" - if [ "${COLORDEPTH}" != "" ]; then + SESSION_NAME="${USER}-${X2GO_PORT}-$(date '+%s')" + if [[ -n "${COLORDEPTH}" ]]; then SESSION_NAME="${SESSION_NAME}_st${SESSION_TYPE}${X2GO_CMD}_dp${COLORDEPTH}" SESSION_NAME="${SESSION_NAME//:/PP}" fi # sanitize session name - SESSION_NAME="$(perl -pe "s/[^a-zA-Z0-9\.\_\-\@]//g" <<< "${SESSION_NAME}")" + SESSION_NAME="$(perl -pe 's/[^a-zA-Z0-9\.\_\-\@]//g' <<< "${SESSION_NAME}")" output="$("${X2GO_LIB_PATH}/x2goinsertsession" "${X2GO_PORT}" "${current_host_name}" "${SESSION_NAME}")" - if [[ "${output}" = "inserted" ]]; then + if [[ "${output}" = 'inserted' ]]; then break else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert display port into database. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "unable to insert display port into database. Retrying (run $((retry + 1)))." fi else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free display number available, cannot start new session. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "no free display number available, cannot start new session. Retrying (run $((retry + 1)))." fi done -if [[ "${output}" != "inserted" ]]; then +if [[ "${output}" != 'inserted' ]]; then typeset msg="Unable to find free display port or insert new session into database; parameters: port (${X2GO_PORT}), hostname (${current_host_name}) and session name (${SESSION_NAME})." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "11" + exit '11' fi -while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do +while [[ -z "${GR_PORT}" ]] || [[ -z "${SOUND_PORT}" ]] || [[ -z "${FS_PORT}" ]]; do output='' for ((retry = 0; retry < max_retry; ++retry)); do free_port='0' @@ -260,28 +260,28 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do output="$("${X2GO_LIB_PATH}/x2goinsertport" "${current_host_name}" "${SESSION_NAME}" "${SSH_PORT}")" - if [[ "${output}" = "inserted" ]]; then + if [[ "${output}" = 'inserted' ]]; then break else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "unable to insert port into database. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "unable to insert port into database. Retrying (run $((retry + 1)))." fi else - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "warning" "no free port available, cannot start new session. Retrying (run $((retry + 1)))." + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'warning' "no free port available, cannot start new session. Retrying (run $((retry + 1)))." fi done - if [[ "${output}" != "inserted" ]]; then + if [[ "${output}" != 'inserted' ]]; then typeset msg="Unable to find free port or insert new session into database; parameters: hostname (${current_host_name}), session name (${SESSION_NAME}) and port (${SSH_PORT})." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 - exit "12" + exit '12' fi - if [ -z "${GR_PORT}" ]; then + if [[ -z "${GR_PORT}" ]]; then GR_PORT="${SSH_PORT}" - elif [ -z "${SOUND_PORT}" ]; then + elif [[ -z "${SOUND_PORT}" ]]; then SOUND_PORT="${SSH_PORT}" else FS_PORT="${SSH_PORT}" @@ -289,33 +289,33 @@ while [ -z "${GR_PORT}" ] || [ -z "${SOUND_PORT}" ] || [ -z "${FS_PORT}" ]; do done # rootless sessions of geometry fullscreen are invalid -if [ "${X2GO_GEOMETRY}" == "fullscreen" ] && [ "${SESSION_TYPE}" == "R" ]; then - X2GO_GEOMETRY="" +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]] && [[ "${SESSION_TYPE}" = 'R' ]]; then + X2GO_GEOMETRY='' fi # no geometry for desktop sessions shall result in fullscreen desktop sessions -if [ "${X2GO_GEOMETRY}" == "" ] && [ "${SESSION_TYPE}" == "D" ]; then - X2GO_GEOMETRY="fullscreen" +if [[ "${X2GO_GEOMETRY}" = '' ]] && [[ "${SESSION_TYPE}" = 'D' ]]; then + X2GO_GEOMETRY='fullscreen' fi -if [ "${X2GO_GEOMETRY}" == "fullscreen" ]; then - X2GO_FULLSCREEN="1" +if [[ "${X2GO_GEOMETRY}" = 'fullscreen' ]]; then + X2GO_FULLSCREEN='1' fi # shadow sessions are never fullscreen session and adopt the original session's geometry -if [ "${X2GO_STYPE}" == "S" ]; then - X2GO_GEOMETRY="$(DISPLAY="${SHADOW_DESKTOP}" xwininfo -root | grep geometry)" - X2GO_GEOMETRY="$(sed -e "s/ //g" <<< "${X2GO_GEOMETRY}")" - X2GO_GEOMETRY="$(sed -e "s/-geometry//" <<< "${X2GO_GEOMETRY}")" +if [[ "${X2GO_STYPE}" = 'S' ]]; then + X2GO_GEOMETRY="$(DISPLAY="${SHADOW_DESKTOP}" xwininfo -root | grep 'geometry')" + X2GO_GEOMETRY="$(sed -e 's/ //g' <<< "${X2GO_GEOMETRY}")" + X2GO_GEOMETRY="$(sed -e 's/-geometry//' <<< "${X2GO_GEOMETRY}")" fi -if [ ! -d "${X2GO_ROOT}" ]; then - mkdir "${X2GO_ROOT}" +if [[ ! -d "${X2GO_ROOT}" ]]; then + mkdir -- "${X2GO_ROOT}" fi X2GO_TMP_ROOT="/tmp/.x2go-${USER}" -if [ ! -d "${X2GO_TMP_ROOT}" ]; then - mkdir "${X2GO_TMP_ROOT}" +if [[ ! -d "${X2GO_TMP_ROOT}" ]]; then + mkdir -- "${X2GO_TMP_ROOT}" fi SESSION_DIR="${X2GO_TMP_ROOT}/C-${SESSION_NAME}" @@ -323,48 +323,48 @@ STATE_FILE="${X2GO_ROOT}/C-${SESSION_NAME}/state" # do not use $TMP or $TEMP here, the session.log file location has to be accessible by root SESSION_LOG="${SESSION_DIR}/session.log" -mkdir -p "${SESSION_DIR}" -if [ "x${X2GO_STYPE}" = "xS" ]; then - chmod -f "0710" "${SESSION_DIR}" - if groups "${USER}" | grep "x2godesktopsharing" &>"/dev/null"; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "user ,,${USER}'' grants access to ${SESSION_DIR} for group ,,x2godesktopsharing''" - chown ":x2godesktopsharing" "${SESSION_DIR}" +mkdir -p -- "${SESSION_DIR}" +if [[ "${X2GO_STYPE}" = 'S' ]]; then + chmod -f '0710' -- "${SESSION_DIR}" + if groups "${USER}" | grep 'x2godesktopsharing' &>'/dev/null'; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "user "'"'"${USER}"'"'" grants access to ${SESSION_DIR} for group "'"'"x2godesktopsharing"'"' + chown -- ':x2godesktopsharing' "${SESSION_DIR}" fi else - chmod -f "0700" "${SESSION_DIR}" + chmod -f '0700' -- "${SESSION_DIR}" fi touch "${SESSION_LOG}" -chmod -f "0600" "${SESSION_LOG}" +chmod -f '0600' -- "${SESSION_LOG}" -if [ ! -d "${X2GO_ROOT}/ssh" ]; then - mkdir "${X2GO_ROOT}/ssh" +if [[ ! -d "${X2GO_ROOT}/ssh" ]]; then + mkdir -- "${X2GO_ROOT}/ssh" fi -grep "PPid" "/proc/${PPID}/status" >"${SESSION_DIR}/sshd.pid" +grep 'PPid' "/proc/${PPID}/status" >"${SESSION_DIR}/sshd.pid" X2GO_COOKIE="$(mcookie)" -xauth -f "${XAUTHORITY}" "add" "${current_host_name}/unix:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" -xauth -f "${XAUTHORITY}" "add" "${current_host_name}:${X2GO_PORT}" "MIT-MAGIC-COOKIE-1" "${X2GO_COOKIE}" +xauth -f "${XAUTHORITY}" 'add' "${current_host_name}/unix:${X2GO_PORT}" 'MIT-MAGIC-COOKIE-1' "${X2GO_COOKIE}" +xauth -f "${XAUTHORITY}" 'add' "${current_host_name}:${X2GO_PORT}" 'MIT-MAGIC-COOKIE-1' "${X2GO_COOKIE}" -typeset option_geometry="" -if [ -n "${X2GO_GEOMETRY}" ] && [ "${X2GO_GEOMETRY}" != "fullscreen" ]; then +typeset option_geometry='' +if [[ -n "${X2GO_GEOMETRY}" ]] && [[ "${X2GO_GEOMETRY}" != 'fullscreen' ]]; then option_geometry="geometry=${X2GO_GEOMETRY}," fi typeset tmp_regex='^(0|none|client|server|both|1)$' -if [ -n "${X2GO_CLIPBOARD}" ] && [[ "${X2GO_CLIPBOARD}" =~ ${tmp_regex} ]]; then +if [[ -n "${X2GO_CLIPBOARD}" ]] && [[ "${X2GO_CLIPBOARD}" =~ ${tmp_regex} ]]; then clipboard=",clipboard=${X2GO_CLIPBOARD}" else clipboard=",clipboard=both" fi -if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" == "auto" ]; then +if [[ "${X2GO_SET_KBD}" = '0' ]] || [[ "${X2GO_KBD_TYPE}" = 'auto' ]]; then X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=${X2GO_COOKIE},errors=${SESSION_LOG},kbtype=null/null,${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" else X2GO_HOST="nx/nx,link=${X2GO_LINK},pack=${X2GO_PACK},limit=0,root=${SESSION_DIR},cache=8M,images=32M,type=${X2GO_TYPE},id=${SESSION_NAME},cookie=${X2GO_COOKIE},errors=${SESSION_LOG},kbtype=${X2GO_KBD_TYPE},${option_geometry}resize=${X2GO_RESIZE},fullscreen=${X2GO_FULLSCREEN},accept=${REMOTE},listen=${GR_PORT}${clipboard},client=linux,menu=0,state=${STATE_FILE}" @@ -383,73 +383,73 @@ DISPLAY="nx/nx,options=${SESSION_DIR}/options:${X2GO_PORT}" export DISPLAY -if [ "${X2GODPI}" == "" ]; then - X2GODPIOPTION_="" +if [[ -z "${X2GODPI}" ]]; then + X2GODPIOPTION_='' else X2GODPIOPTION_="-dpi ${X2GODPI}" fi -NOLISTOPT="" -if [ "${X2GOXDMCP}" == "" ] ;then - XDMCPOPT="" - if [ "x${X2GO_NXAGENT_OPTIONS}" != "x${X2GO_NXAGENT_OPTIONS/ -nolisten tcp/}" ]; then - NOLISTOPT="-nolisten tcp" +NOLISTOPT='' +if [[ -z "${X2GOXDMCP}" ]] ;then + XDMCPOPT='' + if [[ "${X2GO_NXAGENT_OPTIONS}" != "${X2GO_NXAGENT_OPTIONS/ -nolisten tcp/}" ]]; then + NOLISTOPT='-nolisten tcp' fi else XDMCPOPT="-query ${X2GOXDMCP}" fi # run x2goserver-extensions for pre-start -x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "pre-start" || true +x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'pre-start' || true SESSION_WINDOW_TITLE="X2GO-${SESSION_NAME}" -agent_geometry="" -if [ -n "${X2GO_GEOMETRY}" ] && [ "${X2GO_GEOMETRY}" != "fullscreen" ]; then +agent_geometry='' +if [[ -n "${X2GO_GEOMETRY}" ]] && [[ "${X2GO_GEOMETRY}" != 'fullscreen' ]]; then agent_geometry="-geometry ${X2GO_GEOMETRY}" fi # systemd is prone to kill remaining sessions on user logouts. # That sort of makes sense to clean up stray processes, # but gets in the way of our persistent session scheme. -loginctl "enable-linger" &>"/dev/null" || : +loginctl 'enable-linger' &>'/dev/null' || : -X2GO_AGENT_PID="0" -if [ "${X2GO_STYPE}" == "S" ]; then +X2GO_AGENT_PID='0' +if [[ "${X2GO_STYPE}" = 'S' ]]; then # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') -SESSION_TYPE ('-${SESSION_TYPE}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') -shadow SHADOW_DESKTOP ('${SHADOW_DESKTOP}') -shadowmode SHADOW_MODE ('${SHADOW_MODE}') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGEN [...] - NX_TEMP="/tmp" x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ -$SESSION_TYPE -auth "$XAUTHORITY" -shadow $SHADOW_DESKTOP -shadowmode $SHADOW_MODE $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') -SESSION_TYPE ('-${SESSION_TYPE}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') -shadow SHADOW_DESKTOP ('${SHADOW_DESKTOP}') -shadowmode SHADOW_MODE ('${SHADOW_MODE}') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGEN [...] + NX_TEMP='/tmp' x2goagent ${X2GO_NXAGENT_OPTIONS} ${NOLISTOPT} ${X2GODPIOPTION_} -${SESSION_TYPE} -auth "${XAUTHORITY}" -shadow ${SHADOW_DESKTOP} -shadowmode ${SHADOW_MODE} ${agent_geometry} -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & else # set NX_TEMP to /tmp, make sure x2goagent starts when pam_tmpdir.so is in use - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "debug" "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') XDMCPPOPT ('${XDMCPOPT}') -SESSION_TYPE ('-${SESSION_TYPE}') NOEXITPARAM ('${NOEXITPARAM}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGENT}\"') 2>\"SESSION_LOG\" ('\"${ [...] - NX_TEMP="/tmp" x2goagent $X2GO_NXAGENT_OPTIONS $NOLISTOPT $X2GODPIOPTION_ $XDMCPOPT -$SESSION_TYPE $NOEXITPARAM -auth "$XAUTHORITY" $agent_geometry -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'debug' "started nxagent: NX_TEMP=/tmp x2goagent X2GO_NXAGENT_OPTIONS ('${X2GO_NXAGENT_OPTIONS}') NOLISTOPT ('${NOLISTOPT}') X2GODPIOPTION_ ('${X2GODPIOPTION_}') XDMCPPOPT ('${XDMCPOPT}') -SESSION_TYPE ('-${SESSION_TYPE}') NOEXITPARAM ('${NOEXITPARAM}') -auth \"XAUTHORITY\" ('\"${XAUTHORITY}\"') agent_geometry ('${agent_geometry}') -name \"SESSION_WINDOW_TITLE\" ('\"${SESSION_WINDOW_TITLE}\"') \"NX_AGENT\" ('\"${NX_AGENT}\"') 2>\"SESSION_LOG\" ('\"${ [...] + NX_TEMP='/tmp' x2goagent ${X2GO_NXAGENT_OPTIONS} ${NOLISTOPT} ${X2GODPIOPTION_} ${XDMCPOPT} -${SESSION_TYPE} ${NOEXITPARAM} -auth "${XAUTHORITY}" ${agent_geometry} -name "${SESSION_WINDOW_TITLE}" "${NX_AGENT}" 2>"${SESSION_LOG}" & fi -ln -s "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" +ln -s -- "${SESSION_DIR}" "${X2GO_ROOT}/C-${SESSION_NAME}" X2GO_AGENT_PID="${!}" -if ps -p "${X2GO_AGENT_PID}" &>"/dev/null"; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "notice" "successfully started X2Go Agent session with ID ${SESSION_NAME}" +if ps -p "${X2GO_AGENT_PID}" &>'/dev/null'; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'notice' "successfully started X2Go Agent session with ID ${SESSION_NAME}" # run x2goserver-extensions for post-start - x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "post-start" || true + x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'post-start' || true else typeset msg="Failed to start X2Go Agent session with ID ${SESSION_NAME}. X2Go Agent terminated unexpectedly. Aborting session startup." - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "err" "${msg}" + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'err' "${msg}" # Make x2goclient fail. echo "${msg}" >&2 # run x2goserver-extensions for fail-start - x2gofeature "X2GO_RUN_EXTENSIONS" &>"/dev/null" && x2goserver-run-extensions "${SESSION_NAME}" "fail-start" || true + x2gofeature 'X2GO_RUN_EXTENSIONS' &>'/dev/null' && x2goserver-run-extensions "${SESSION_NAME}" 'fail-start' || true - exit "13" + exit '13' fi -"${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >"/dev/null" +"${X2GO_LIB_PATH}/x2gocreatesession" "${X2GO_COOKIE}" "${X2GO_AGENT_PID}" "${X2GO_CLIENT}" "${GR_PORT}" "${SOUND_PORT}" "${FS_PORT}" "${SESSION_NAME}" >'/dev/null' -if [ "${X2GO_SET_KBD}" == "0" ] || [ "${X2GO_KBD_TYPE}" != "auto" ]; then - "${X2GO_LIB_PATH}/x2gosyslog" "${0}" "info" "blocking creation of agent's keyboard file ${SESSION_DIR}/keyboard as requested by session startup command" - mkdir -p "${SESSION_DIR}/keyboard" +if [[ "${X2GO_SET_KBD}" = '0' ]] || [[ "${X2GO_KBD_TYPE}" != 'auto' ]]; then + "${X2GO_LIB_PATH}/x2gosyslog" "${0}" 'info' "blocking creation of agent's keyboard file ${SESSION_DIR}/keyboard as requested by session startup command" + mkdir -p -- "${SESSION_DIR}/keyboard" fi echo "${X2GO_PORT}" -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git