Magellan Linux

Contents of /alx-src/branches/alxconf-060/functions/config_sessions.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2435 - (show annotations) (download) (as text)
Thu Jun 16 16:21:11 2011 UTC (12 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 13048 byte(s)
-set the correct session colors from current desktop settings, do not rely on citrix's auto-detection
1 # $Id$
2 # configures ica-sessions on the host via mysql db settings
3
4 fix_whitespaces()
5 {
6 local var="$@"
7 echo "${var//\ /_}"
8 }
9
10 # helper function to create citrix session files
11 generate_ica_session_file()
12 {
13 local i
14 local num
15 local server
16 local ses_session
17 local ses_filename
18 local ses_username
19 local ses_domain
20 local ses_password
21 local ses_browseradrs
22 local ses_colors
23 local CONFIG
24
25 # very basic getops
26 for i in $*
27 do
28 case $1 in
29 --session) shift; ses_session="$1" ;;
30 --filename) shift; ses_filename="$1" ;;
31 --username) shift; ses_username="$1" ;;
32 --password) shift; ses_password="$1" ;;
33 --domain) shift; ses_domain="$1" ;;
34 --server) shift; ses_browseradrs="$1" ;;
35 --colordepth) shift; ses_colors="$1" ;;
36 esac
37 shift
38 done
39
40 # abort if session, filename or server not given
41 [[ -z ${ses_session} ]] && return 1
42 [[ -z ${ses_filename} ]] && return 1
43 [[ -z ${ses_browseradrs} ]] && return 1
44
45 # write session files
46 CONFIG="${ALX_ICA_SESSIONS}/${ses_filename}"
47 clearconfig
48
49 addconfig '[WFClient]'
50 addconfig 'Version=2'
51
52 # use ';' as ifs
53 declare -i i=0
54 for server in ${ses_browseradrs//;/ }
55 do
56 (( i++ ))
57 num="${i}"
58 # support newer ica-clients:
59 # the first address must be named TcpBrowserAddress, but not TcpBrowserAddress1 !!
60 [[ ${i} -eq 1 ]] && num=""
61 addconfig "TcpBrowserAddress${num}=${server}"
62 done
63
64 addconfig 'ScreenPercent=0'
65 addconfig '[ApplicationServers]'
66 addconfig "${ses_session}="
67 addconfig "[${ses_session}]"
68 addconfig "Address=${ses_session}"
69 addconfig "InitialProgram=#${ses_session}"
70
71 # convert to ica session file values
72 case ${ses_colors} in
73 24|32) ses_colors="8";;
74 16) ses_colors="4";;
75 8) ses_colors="2";;
76 *) ses_colors="4";; # default to 16bit
77 esac
78 addconfig "DesiredColor=${ses_colors}"
79 addconfig 'TransportDriver=TCP/IP'
80 addconfig 'WinStationDriver=ICA 3.0'
81 addconfig "ClearPassword=${ses__password}"
82 addconfig "Username=${ses_username}"
83 addconfig "Domain=${ses_domain}"
84 addconfig 'UseFullScreen=Yes'
85 addconfig 'NoWindowManager=True'
86 }
87
88 # generates a sh file to start programs
89 generate_program_sh()
90 {
91 local dest
92 local name
93 local exec
94 local param
95 local workdir
96 local CONFIG
97
98 # very basic getops
99 for i in $*
100 do
101 case $1 in
102 --name|-n) shift; name="$1" ;;
103 --exec|-x) shift; exec="$1" ;;
104 --param|-p) shift; param="$1" ;;
105 --dest|-d) shift; dest="$1" ;;
106 --workdir|-w) shift; workdir="$1" ;;
107 esac
108 shift
109 done
110
111 # abort if name, dest or exec not given
112 [[ -z ${name} ]] && return 1
113 [[ -z ${exec} ]] && return 1
114 [[ -z ${dest} ]] && return 1
115
116 CONFIG="${dest}"
117 addconfig "#!/bin/sh"
118 [ -n "${workdir}" ] && addconfig "cd ${workdir}"
119 addconfig "exec ${exec} ${param}"
120
121 chmod 0755 "${dest}"
122 }
123
124 # helper functions for generate all desktop icons
125 generate_icon()
126 {
127 local name
128 local icon
129 local command
130 local dest
131 local yres
132 local xres
133 local iwidth
134 local iheight
135 local deficon
136 local CONFIG
137 local utility
138
139 # very basic getops
140 for i in $*
141 do
142 case $1 in
143 --name|-n) shift; name="$1" ;;
144 --command|-c) shift; command="$1" ;;
145 --icon|-i) shift; icon="$1" ;;
146 --dest|-d) shift; dest="$1" ;;
147 --xres|-x) shift; xres="$1" ;;
148 --yres|-y) shift; yres="$1" ;;
149 --icon-width|-w) shift; iwidth="$1" ;;
150 --icon-height|-h) shift; iheight="$1" ;;
151 --default-icon) shift; deficon="$1" ;;
152 esac
153 shift
154 done
155
156 # some sanity checks:
157
158 # abort if name or command not given
159 [[ -z ${name} ]] && return 1
160 [[ -z ${command} ]] && return 1
161
162 # which utility are we using idesk|xtdesk ?
163 if [ -x /usr/bin/idesk ]
164 then
165 utility="idesk"
166 [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.idesktop/${name}.lnk"
167 else
168 utility="xtdesk"
169 [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.xtdesktop/${name}.lnk"
170 fi
171
172 # use some defaults for icon, dest, {x,y}res
173 [[ -z ${xres} ]] && xres=30
174 [[ -z ${yres} ]] && xres=30
175 if [[ -z ${icon} ]] || [ ! -f ${icon} ]
176 then
177 # if no default icon is given use default.png
178 [[ -z ${deficon} ]] && deficon="default.png"
179 icon="${ALX_SESSIONS_ICONS}/${deficon}"
180 fi
181
182 CONFIG="${dest}"
183 clearconfig
184
185 addconfig 'table Icon'
186 [[ ${utility} = xtdesk ]] && addconfig ' Type: Program'
187 addconfig " Caption: ${name}"
188 addconfig " Command: ${command}"
189 addconfig " Icon: ${icon}"
190 addconfig " X: ${xres}"
191 addconfig " Y: ${yres}"
192
193 # add these only if not zero
194 if [[ ! -z ${iwidth} ]] && [[ ! -z ${iheight} ]]
195 then
196 if [[ ${utility} = xtdesk ]]
197 then
198 addconfig " IconWidth: ${iwidth}"
199 addconfig " IconHeight: ${iheight}"
200 fi
201 if [[ ${utility} = idesk ]]
202 then
203 addconfig " Width: ${iwidth}"
204 addconfig " Height: ${iheight}"
205 fi
206 fi
207
208 addconfig 'end'
209 }
210
211 generate_all_desktop_icons()
212 {
213 local session_list="$1"
214 local other_menuitem_list="$2"
215 local res
216 local xres
217 local yres
218 local x
219 local y
220 local i
221 local name
222 local progsh_path
223 local utility
224 local dest
225 local rc
226
227 # which utility are we using idesk|xtdesk ?
228 if [ -x /usr/bin/idesk ]
229 then
230 utility="idesk"
231 dest="${ALX_UNPRIV_HOME}/.idesktop"
232 rc="${ALX_UNPRIV_HOME}/.ideskrc"
233 else
234 utility="xtdesk"
235 dest="${ALX_UNPRIV_HOME}/.xtdesktop"
236 rc="${ALX_UNPRIV_HOME}/.xtdeskrc"
237 fi
238
239
240 # progsh path
241 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
242
243 # get the resolution
244 res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'")
245
246 # split res to x & y
247 xres="${res%x*}"
248 yres="${res#*x}"
249
250 # top left edge of the icon is given in config file
251 # remove a little bit to simulate the bottom-right edge
252 xres="$(( ${xres} - 120 ))"
253 yres="$(( ${yres} - 80 ))"
254
255 # clean desktop icon location
256 [ -d ${dest} ] && rm -rf ${dest}
257 [ -f ${rc} ] && rm -f ${rc}
258 install -d ${dest}
259
260 if [[ ${utility} = xtdesk ]]
261 then
262 # basic config
263 cat ${ALX_SKELETONS}/xtdesktop/xtdeskrc > ${ALX_UNPRIV_HOME}/.xtdesktop/xtdeskrc
264 fi
265
266 # default settings
267 declare -i x=30
268 declare -i y=30
269
270 # ica icons
271 for i in ${session_list}
272 do
273 # abort if empty
274 [[ -z ${i} ]] && continue
275
276 # get database information
277 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
278
279 # new line if x > xres
280 if [ ${x} -ge ${xres} ]
281 then
282 x=30
283 y=$((${y} + 80))
284 fi
285
286 # new row if y > yres
287 if [ ${y} -ge ${yres} ]
288 then
289 x=$((${x} + 120))
290 y=30
291
292 # re-check x
293 [ ${x} -ge ${xres} ] && x=30
294 fi
295
296 generate_icon \
297 --name "${cfg_sessions_session}" \
298 --command "nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})" \
299 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_sessions_session}).png" \
300 --dest "${dest}/$(fix_whitespaces ${cfg_sessions_session}).lnk" \
301 --xres "${x}" \
302 --yres "${y}"
303
304 y=$((${y} + 80))
305 done
306
307 for i in ${other_menuitem_list}
308 do
309 # abort if empty
310 [[ -z ${i} ]] && continue
311
312 # get database information
313 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
314
315 # new line if x > xres
316 if [ ${x} -ge ${xres} ]
317 then
318 x=30
319 y=$((${y} + 80))
320 fi
321
322 # new row if y > yres
323 if [ ${y} -ge ${yres} ]
324 then
325 x=$((${x} + 120))
326 y=30
327
328 # re-check x
329 [ ${x} -ge ${xres} ] && x=30
330 fi
331
332 generate_icon \
333 --name "${cfg_other_menuitems_name}" \
334 --command "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
335 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_other_menuitems_name}).png" \
336 --dest "${dest}/$(fix_whitespaces ${cfg_other_menuitems_name}).lnk" \
337 --xres "${x}" \
338 --yres "${y}" \
339 --default-icon "default_item.png"
340
341 y=$((${y} + 80))
342 done
343
344 # last but not least gen a icon with some sys informations
345 local sysinfo
346 local hostname
347 local osversion
348
349 osversion="$(< /etc/mageversion)"
350 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
351 sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)"
352
353 # now get the right position:
354 # restore orig values of xres
355 xres="$(( ${xres} + 120 ))"
356 # default y pos (full yres -22 = cur yres + 58 !)
357 yres="$(( ${yres} + 58 ))"
358 # middle of the screen
359 # (no txt - length required, xtdesk manage that itself)
360 xres="$(( ${xres} / 2))"
361
362 generate_icon \
363 --name "${sysinfo}" \
364 --command "exit 0" \
365 --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \
366 --dest "${dest}/sysinfo.lnk" \
367 --xres "${xres}" \
368 --yres "${yres}" \
369 --icon-width "1" \
370 --icon-height "1"
371 }
372
373 config_sessions()
374 {
375 local i
376 local all_ses_ids
377 local all_other_ids
378 local CONFIG
379 local screensaver_passwd_cmd
380
381 # get all session ids from database
382 all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
383 # get all other_menutiem ids from database
384 all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
385
386 # get screensaver settings
387 evaluate_table cfg_screensaver
388 # get autostart settings
389 evaluate_table cfg_autostart
390 # get current color depth
391 evaluate_table cfg_graphic
392
393 # now setup fluxbox for user station
394
395 # create a fresh fluxbox directory
396 [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
397 install -d ${ALX_UNPRIV_HOME}/.fluxbox
398
399 # now generate fluxbox config files
400
401 # fluxbox main config
402 cat ${ALX_SKELETONS}/fluxbox/init > ${ALX_UNPRIV_HOME}/.fluxbox/init
403
404 # fluxbox autostart
405 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
406 # add icon utility
407 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
408 [ -x /usr/bin/xtdesk ] && addconfig '[startup] {nohup xtdesk > /dev/null &}'
409 # add numlock utility
410 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
411
412 # add screensaver
413 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
414 then
415 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
416 then
417 screensaver_passwd_cmd="-nolock"
418 else
419 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
420 fi
421
422 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
423 fi
424
425 # add autostart session
426 if [[ ! -z ${cfg_autostart_session} ]]
427 then
428 # sleep one second to wait until busybox is fully initialized and the screen is really centered
429 addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
430 fi
431
432 # fluxbox hotkeys
433 cat ${ALX_SKELETONS}/fluxbox/keys > ${ALX_UNPRIV_HOME}/.fluxbox/keys
434
435 # generate a fluxbox menu
436 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
437 clearconfig
438
439 # fluxbox menu header
440 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
441 # now fix it with proper messages :P
442 local ver="$(< /etc/mageversion)"
443 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
444 # add a newline (maybe there is no crlf in the header)
445 addconfig
446
447 # first generate session files
448 for i in ${all_ses_ids}
449 do
450 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
451 generate_ica_session_file \
452 --session "${cfg_sessions_session}" \
453 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
454 --username "${cfg_sessions_username}" \
455 --password "${cfg_sessions_password}" \
456 --domain "${cfg_sessions_domain}" \
457 --server "${cfg_sessions_browseradrs}" \
458 --colordepth "${cfg_graphic_depth}"
459
460 # fluxbox menusession
461 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
462 done
463
464 # delete all progs
465 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
466 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
467 install -d ${progsh_path}
468
469 # add other menuitems
470 for i in ${all_other_ids}
471 do
472 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
473
474 # now echo config line for fluxbox-menu
475 # make it "configureable" :p
476 if [[ -n ${cfg_other_menuitems_workdir} ]]
477 then
478 workdir="--workdir ${cfg_other_menuitems_workdir}"
479 fi
480 if [[ -n ${cfg_other_menuitems_icon} ]]
481 then
482 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
483 fi
484
485 # gen prog startup wrapper
486 generate_program_sh \
487 --name "${cfg_other_menuitems_name}" \
488 --exec "${cfg_other_menuitems_exec}" \
489 --param "${cfg_other_menuitems_param}" \
490 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
491 "${workdir}"
492
493 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
494 done
495
496 # fluxbox menu footer
497 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
498 # add a newline (maybe there is no crlf in the footer)
499 addconfig
500
501 # now it's a good time to generate *all* icons :)
502 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
503
504 # fix permissions
505 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
506 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
507 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
508 chmod 0755 ${ALX_UNPRIV_HOME}/.xtdesktop
509 chmod 0644 ${ALX_UNPRIV_HOME}/.xtdeskrc
510 }