xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #2989: startup_proxy.sh

File startup_proxy.sh, 11.1 KB (added by louis-mulder, 4 months ago)

bash startup script xpra proxyand freeipa client

Line 
1#!/bin/bash
2#
3# startup Xpra proxy-server(s)
4#
5# Louis Mulder SUE BV Augustus 2020
6#
7# Argument 1 is general script and will be called
8# as script-name_PORT-NUMBER. Therefor it will
9# be copied from ${XPRA_TOPDIR_INT}/bin/XXXX to
10# /var/scripts/XXXX_PORT-NUMBER
11# Proxy server will use this script by using the
12# added module (Python) pamexec_auth 
13#
14
15EXEC_TIMEOUT=${XPRA_TIMEOUT_SOCKET:-180}
16EXECW="${1}" 
17export EXECW EXEC_TIMEOUT
18shift
19#
20PROXY_PORT="${SRC_PORT}"
21export PROXY_PORTS
22#
23XPRA_TOPDIR_INT=${XPRA_TOPDIR_INT:-/srv} ; export XPRA_TOPDIR_INT
24HOSTNAME=`hostname -s` ; export HOSTNAME
25[ ! -d /var/log/. ] && mkdir -p /var/log/.
26#
27if [ -d ${XPRA_TOPDIR_INT}/log/. ]
28then
29  if [ -d ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/. ]
30  then
31    :
32  else
33    mkdir -p ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/.
34    cd ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/.
35    [ -f /var/xpra/var.tar ] && tar xf /var/xpra/var.tar
36  fi
37  mv /var/log /var/NOT-USED
38  cd /var
39  ln -s ../${XPRA_TOPDIR_INT}/log/${HOSTNAME} log
40fi
41
42exec 2>> /var/log/xpra_stderr.log
43exec 1>> /var/log/xpra_stdout.log
44
45echo "Startup Proxyserver(s) at `date`"
46echo "#################################"
47#
48# do some bind mounts
49#
50for dir in `exec 2> /dev/null; ls -A ${XPRA_TOPDIR_INT}/etc/skel/.`
51do
52     mkdir -p /etc/skel/${dir}
53     mount -o bind,bg ${XPRA_TOPDIR_INT}/etc/skel/${dir} /etc/skel/${dir}
54done
55#
56#
57if [ "${SRC_PORT}" = '' ]
58then
59 echo "Missing proxy tcp-port"
60 exit 1
61fi
62EMPTY=/tmp/empty${$} ;export EMPTY
63mkdir -p ${EMPTY}
64
65startup_rc () {
66for exe in ${XPRA_TOPDIR_INT}/etc/rc1.d/S*.sh
67do
68  [ -x ${exe} ] && ${exe}
69done
70}
71#
72shutdown_rc () {
73for exe in ${XPRA_TOPDIR_INT}/etc/rc1.d/K*.sh
74do
75  [ -x ${exe} ] && ${exe}
76done
77}
78#
79trap "[ -d ${EMPTY} ] && rm -rf ${EMPTY};[ -f /run/xpra/Xpra_*.pid] && kill -SIGTERM `cat /run/xpra/Xpra_*.pid`" 2 3 15
80# Link (sym) the secrets to the directory ${SSL_CERT}
81    SSL_CERT=${SSL_CERT:-"/etc/xpra/ssl/server.crt"}
82    SUBDIR=`IFS=\. ; set -- ${SSL_CERT}; shift \`expr ${#} - 1 \`; echo ${1}`
83
84    certfile=`basename ${SSL_CERT}`
85    cd `dirname ${SSL_CERT}`
86
87    if [ -f ${SUBDIR}/${certfile} ]
88    then
89      LINKNAME=`basename ${SSL_CERT}`
90      [ "${LINKNAME}" != '' -a ! -h "${LINKNAME}" ] && ln -s ${SUBDIR}/${certfile} "${LINKNAME}"
91    fi
92
93    SSL_KEY=${SSL_KEY:="/etc/xpra/ssl/server.key"}
94    SUBDIR=`IFS=\. ; set -- ${SSL_KEY}; shift \`expr ${#} - 1 \`; echo ${1}`
95    keyfile=`basename ${SSL_KEY}`
96    cd `dirname ${SSL_KEY}`
97
98    if [ -f ${SUBDIR}/${keyfile} ]
99    then
100      LINKNAME=`basename ${SSL_KEY}`
101      [ "${LINKNAME}" != '' -a ! -h "${LINKNAME}" ] && ln -s ${SUBDIR}/${keyfile} "${LINKNAME}"
102    fi
103#
104#
105#XPRA_KB=`echo "$XPRA_LOCAL" | awk -F"_" '{print $1}'`
106XPRA_RES=${XPRA_RES:-'5760x3240'}
107ERR=0
108SSL_OPTIONS='' ;export SSL_OPTIONS
109#
110XPRA_SOCKET_TIMEOUT=${XPRA_SOCKET_TIMEOUT:-180} ; export XPRA_SOCKET_TIMEOUT
111XPRA_PING_TIMEOUT=${XPRA_PING_TIMEOUT:-120} ; export XPRA_PING_TIMEOUT
112#
113cd /etc
114rm -f localtime
115ln -s ../usr/share/zoneinfo/Europe/Amsterdam localtime
116[ ! -d /etc/pam.d/. ] && mkdir -p /etc/pam.d
117cp ${XPRA_TOPDIR_INT}/etc/pam.d/xpra /etc/pam.d/.
118ln -s ..${XPRA_TOPDIR_INT}/etc/xpra-vars.sh .
119cp ${XPRA_TOPDIR_INT}/bin/check_oath /bin/.
120chmod 755 /bin/check_oath
121cp ${XPRA_TOPDIR_INT}/bin/pre-auth.sh /bin/.
122chmod 755 /bin/pre-auth.sh
123if [ -d ${XPRA_TOPDIR_INT}/etc/ssh/. ]
124then
125   (cd ${XPRA_TOPDIR_INT}/etc/ssh/.; tar cf - ssh_host* ) | \
126          ( [ ! -d /etc/ssh/. ] && mkdir -p /etc/ssh/. ; cd /etc/ssh/. ; tar xf -
127            cd /etc/ssh
128            [ -f sshd_config ] && chmod 600 sshd_config
129              for f in ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
130              do
131                [ -f ${f} ] && chmod 640 ${f}
132              done
133            GRP=`getent group ssh_keys | sed -e 's/:.*$//'`
134            if [ "${GRP}" != '' ]
135            then
136              for f in ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
137              do
138                [ -f ${f} ] && chgrp ${GRP} ${f}
139              done
140            fi
141          )
142fi
143if [ -d ${XPRA_TOPDIR_INT}/etc/iptables/. ]
144then
145   (cd ${XPRA_TOPDIR_INT}/etc/iptables/.; tar cf - . ) | \
146          ( [ ! -d /etc/iptables/. ] && mkdir -p /etc/iptables/. ; cd /etc/iptables/. ; tar xf -)
147fi
148cd
149#
150if [ "${SSL}" != '' -a "`echo "${SSL}" | sed 's/./\U&/g'`" = 'ON' ]
151then
152    if [ "${SSL_CERT}" != '' -a -f ${SSL_CERT} ]
153    then
154        :
155    else
156        ERR=1
157    fi
158    if [ "${SSL_KEY}" != '' -a -f ${SSL_KEY} ]
159    then
160        :
161    else
162        ERR=`expr ${ERR} + 2`
163    fi
164
165    if [ "${ERR}" != 0 ]
166    then
167           case ${ERR} in
168           #(
169           1 ) echo SSL_CERT ${SSL_CERT:-Not in environment} ${SSL_CERT:+${SSL_CERT} file is missing}
170           ;;
171           #(
172           2 ) echo SSL_KEY ${SSL_KEY:-Not in environment} ${SSL_KEY:+${SSL_KEY} file is missing}
173           ;;
174           #(
175           3 ) echo "SSL_CERT ${SSL_CERT:-Not in environment} ${SSL_CERT:+${SSL_CERT} file is missing}"
176               echo "SSL_KEY ${SSL_KEY:-Not in environment} ${SSL_KEY:+${SSL_KEY} file is missing}"
177               echo "Variable SSL is on you must also provide de cert and key file"
178           ;;
179           esac
180           exit ${ERR}
181    else
182     SSL_OPTIONS="--ssl=on --ssl-cert=${SSL_CERT} --ssl-key=${SSL_KEY}"
183    fi
184fi
185
186startup_rc
187
188cd ${CPWD}
189
190mkdir -p /run/user/0/xpra
191mkdir -p /run/xpra
192
193[ -d ${EMPTY}/. ] && rmdir ${EMPTY}
194
195unset CPWD
196#
197
198modificate_xpra_distribution () {
199#
200# Determine the Xpra version
201#
202
203
204eval `xpra --version | sed -e 's/-r.*//' -e 's/.* v//' -e 's/\([0-9][0-9]*\).\([0-9][0-9]*\)\(.*\)/MAJOR=\1;MINOR=\2;XPRA_VERSION=\1.\2;export XPRA_VERSION/'`
205
206
207PYTHON_LIST=''
208export PYTHON_LIST
209PYTHON_LIST_DONE=''
210export PYTHON_LIST_DONE
211
212for pth in `IFS=':' ; echo ${PATH}`
213do
214   if cd ${pth}
215   then
216   for i in python*
217   do
218    if [[ ! "${i}" =~ '-qr' ]]
219    then
220        if [ -x ${i} ]
221        then
222          PYTHON_LIST_DONE="${PYTHON_LIST_DONE:+${PYTHON_LIST_DONE} ${i}}"
223          PYTHON_LIST_DONE="${PYTHON_LIST_DONE:-${i}}"
224          if [ -h ${i} ]
225          then
226            EXEC=`basename \`readlink ${i}\``
227            T_PYTHON_LIST=${i}
228             for pyth in ${PYTHON_LIST}
229             do
230               if [ "${EXEC}" != "${pyth}" ]
231                then
232                   T_PYTHON_LIST="${T_PYTHON_LIST:+${T_PYTHON_LIST} ${pyth}}"
233                   T_PYTHON_LIST="${T_PYTHON_LIST:-${pyth}}"
234                 fi
235              done
236            PYTHON_LIST="${T_PYTHON_LIST}"
237           else
238            if [[ ! "${PYTHON_LIST_DONE}" =~ "${i}" ]]
239            then
240              PYTHON_LIST=${PYTHON_LIST:+${PYTHON_LIST} ${i}}
241              PYTHON_LIST=${PYTHON_LIST:-${i}}
242            fi
243           fi
244         fi
245   fi
246   done
247   cd - 1> /dev/null 2>&1
248   fi
249done
250
251LIST="${PYTHON_LIST}"
252PYTHON_LIST=`for i in ${PYTHON_LIST}
253do
254  echo ${i}
255done | sort -u`
256
257if [ "${MAJOR}" -le 3 ] || [ "${MAJOR}" = 4 -a "${MINOR}" = 0  ]
258then
259
260XPRA_PATH_LIST=`for py in ${PYTHON_LIST}
261do
262${py} <<EOB 2> /dev/null
263import os.path
264import site
265for d in site.getsitepackages():
266   if os.path.isdir( d + "/xpra" ):
267      print ( d + "/xpra")
268EOB
269done | sort -u`
270
271for py_file in `find ${XPRA_PATH_LIST} -type f -name server_core.py -print |sort -u`
272do
273   if grep -i  'global capabilities' < ${py_file}
274   then
275      :
276   else
277      sed -i -e '/def _process_hello/a\' -e '        global capabilities'  ${py_file}
278   fi
279done
280#
281for py in ${PYTHON_LIST}
282do
283${py} --version
284${py} <<EOB 2> /dev/null
285import os.path
286import site
287for d in site.getsitepackages():
288   if os.path.isdir( d + "/xpra" ):
289      print ( d + "/xpra")
290EOB
291done | while read txt
292do
293   case ${txt} in
294   #(
295   *[Pp][Yy][Tt][Hh][Oo][Nn]*\ 2* ) PYTHON_VERSION=2
296   ;;
297   #(
298   *[Pp][Yy][Tt][Hh][Oo][Nn]*\ 3* )  PYTHON_VERSION=3
299   ;;
300   #(
301   */xpra* )
302       for dest_distribution in `find ${txt}/server -type d -name auth`
303       do
304         cp ${XPRA_TOPDIR_INT}/xpra-addon/python${PYTHON_VERSION:-2}/* ${dest_distribution}/.
305       done
306   ;;
307   esac
308done
309
310else
311#
312# Xpra version 4.1 and up
313#
314for py in ${PYTHON_LIST}
315do
316${py} <<EOB 2> /dev/null
317import os.path
318import site
319for d in site.getsitepackages():
320   if os.path.isdir( d + "/xpra" ):
321      print ( d + "/xpra")
322EOB
323done | while read txt
324do
325       for dest_distribution in `find ${txt}/server -type d -name auth`
326       do
327         cp ${XPRA_TOPDIR_INT}/xpra-addon/python3-xpra-4.1/* ${dest_distribution}/.
328       done
329done
330fi
331}
332#
333#
334
335PID='' ; export PID
336
337modificate_xpra_distribution
338
339rm -rf /run/xpra/Xpra_*.pid 2> /dev/null
340
341mkdir -p /var/scripts 2> /dev/null
342
343if [ "${XPRA_DEMO_USERS}" != '' ]
344then
345   XPRA_DEMO_USERS=`echo "${XPRA_DEMO_USERS}" | sed -e 's/./\u&/g'`
346   if [ -f ${XPRA_TOPDIR_INT}/etc/demousers-passwd -a "${XPRA_DEMO_USERS}" = 'Y' -a  -f ${XPRA_TOPDIR_INT}/etc/demousers-shadow ]
347   then
348     cat ${XPRA_TOPDIR_INT}/etc/demousers-passwd >> /etc/passwd
349     cat ${XPRA_TOPDIR_INT}/etc/demousers-shadow >> /etc/shadow
350     cat ${XPRA_TOPDIR_INT}/etc/demousers-group >> /etc/group
351     sed -i -e '/^$/d' /etc/passwd
352     sed -i -e '/^$/d' /etc/shadow
353     pwconv
354   fi
355fi
356#
357SRC_DIR=`dirname ${EXECW}`
358EXECUTABLE=`basename ${EXECW} .sh`
359cp ${EXECW} /var/scripts/${EXECUTABLE}
360chmod 755 /var/scripts/${EXECUTABLE}
361
362      cp ${EXECW} /var/scripts/${EXECUTABLE}
363      chmod 755 /var/scripts/${EXECUTABLE}
364      #exec 2> ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/xpra_stderr_0.log
365      #exec 1> ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/xpra_stdout_0.log
366      XPRA_SOCKET_DIR=${XPRA_SOCKET_DIR:-/tmp}
367      XPRA_STATUS_DIR="${XPRA_STATUS_DIR:-/var/xpra}"
368      export XPRA_STATUS_DIR XPRA_SOCKET_DIR
369      xpra proxy :0 --html=on --bind-tcp=0.0.0.0:${SRC_PORT} \
370              --socket-dir="${XPRA_SOCKET_DIR}" \
371              --ssl-cert=${SSL_CERT} --ssl-key=${SSL_KEY} --ssl=on  \
372              --challenge-handler=prompt --daemon=yes  \
373              --clipboard=no -d all \
374              `case ${XPRA_VERSION} in
375               #(
376               4.[1-9]* )
377                     #echo "--${1}-auth=${2}" "--${1}-auth=${2}"
378                     echo --tcp-auth=pam:service=login --tcp-auth=execwargs:command=/srv/bin/start_pod.sh:timeout=900
379               ;;
380               #(
381               *)
382                  IFS=','
383                  set -- ${XPRA_AUTH_METHOD:-'pamexec:service=xpra:command=/srv/bin/start_pod.sh:timeout=900'}
384                  if [ "${2}" != '' ]
385                  then
386                     echo "--${1}-auth=${2}"
387                  fi
388               ;;
389               esac ` --pidfile=/run/xpra/Xpra_0.pid  \
390                   ${XPRA_PROXY_DEBUG_LOG:+-d all}  2>&1  |\
391                    (
392                    if [ "${XPRA_PROXY_DEBUG_LOG}" != '' ]
393                    then
394                      exec tee /srv/tmp/debug_proxy_${SRC_PORT}_0
395                    else
396                      exec cat
397                    fi
398                    ) |\
399            while read txt
400            do
401             case ${txt} in
402             #(
403               *[Xx][Pp][Rr][Aa]*[Ii][Ss]*[Rr][Ee][Aa][Dd][Yy]* )
404                echo "Xpra-proxy started" > ${XPRA_STATUS_DIR}/proxy_status_`hostname`
405                echo "${txt}"
406                exec cat
407             ;;
408             #(
409               * ) echo "${txt}"
410             ;;
411             esac
412            done &
413      TRY='-1'
414      while [ "${TRY}" -lt ${MAXTRY:-60} ]
415       do
416         TRY=`expr ${TRY} + 1`
417         sleep 2
418         if [ -f /run/xpra/Xpra_0.pid ]
419         then
420           PID="`cat /run/xpra/Xpra_0.pid`"
421           break
422         fi
423       done
424
425exec 2>> ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/xpra_stderr.log
426exec 1>> ${XPRA_TOPDIR_INT}/log/${HOSTNAME}/xpra_stdout.log
427
428[ -d ${EMPTY} ] && rmdir ${EMPTY}
429
430if [ -x ${XPRA_TOPDIR_INT}/bin/housekeeping.sh ]
431then
432      ${XPRA_TOPDIR_INT}/bin/housekeeping.sh ${SRC_PORT} 
433fi
434
435
436# Wait until Xpra proxy died....
437
438while [ -d /proc/${PID}/. ]
439do
440 sleep 2
441done
442#
443echo "Shutdown Proxyserver(s) at `date`"
444echo "#################################"
445[ "${XPRA_PROXY_DEBUG_LOG}" != '' ] && sleep 14400
446
447# sleep 7200
448shutdown_rc