Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3490 - (show annotations) (download) (as text)
Mon Apr 16 10:07:49 2012 UTC (12 years ago) by niro
File MIME type: application/x-sh
File size: 15942 byte(s)
-fixed whitespaces
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 [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.idesktop/${name}.lnk"
163
164 # use some defaults for icon, dest, {x,y}res
165 [[ -z ${xres} ]] && xres=50
166 [[ -z ${yres} ]] && xres=50
167 if [[ -z ${icon} ]] || [ ! -f ${icon} ]
168 then
169 # if no default icon is given use default.png
170 [[ -z ${deficon} ]] && deficon="default.png"
171 icon="${ALX_SESSIONS_ICONS}/${deficon}"
172 fi
173
174 CONFIG="${dest}"
175 clearconfig
176
177 addconfig 'table Icon'
178 addconfig " Caption: ${name}"
179 addconfig " Command: ${command}"
180 addconfig " Icon: ${icon}"
181 addconfig " X: ${xres}"
182 addconfig " Y: ${yres}"
183
184 # add these only if not zero
185 if [[ ! -z ${iwidth} ]] && [[ ! -z ${iheight} ]]
186 then
187 addconfig " Width: ${iwidth}"
188 addconfig " Height: ${iheight}"
189 fi
190
191 addconfig 'end'
192 }
193
194 generate_all_desktop_icons()
195 {
196 local session_list="$1"
197 local other_menuitem_list="$2"
198 local plugin_list="$3"
199 local res
200 local xres
201 local yres
202 local x
203 local y
204 local i
205 local name
206 local progsh_path
207 local utility
208 local dest
209 local rc
210
211 dest="${ALX_UNPRIV_HOME}/.idesktop"
212 rc="${ALX_UNPRIV_HOME}/.ideskrc"
213
214 # progsh path
215 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
216
217 # get the resolution
218 res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'")
219
220 # split res to x & y
221 xres="${res%x*}"
222 yres="${res#*x}"
223
224 # top left edge of the icon is given in config file
225 # remove a little bit to simulate the bottom-right edge
226 xres="$(( ${xres} - 120 ))"
227 yres="$(( ${yres} - 80 ))"
228
229 # clean desktop icon location
230 [ -d ${dest} ] && rm -rf ${dest}
231 [ -f ${rc} ] && rm -f ${rc}
232 install -d ${dest}
233
234 # default settings
235 declare -i x=50
236 declare -i y=50
237
238 # ica icons
239 for i in ${session_list}
240 do
241 # abort if empty
242 [[ -z ${i} ]] && continue
243
244 # get database information
245 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
246
247 # new line if x > xres
248 if [ ${x} -ge ${xres} ]
249 then
250 x=50
251 y=$((${y} + 80))
252 fi
253
254 # new row if y > yres
255 if [ ${y} -ge ${yres} ]
256 then
257 x=$((${x} + 120))
258 y=50
259
260 # re-check x
261 [ ${x} -ge ${xres} ] && x=50
262 fi
263
264 generate_icon \
265 --name "${cfg_sessions_session}" \
266 --command "nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})" \
267 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_sessions_session}).png" \
268 --dest "${dest}/$(fix_whitespaces ${cfg_sessions_session}).lnk" \
269 --xres "${x}" \
270 --yres "${y}"
271
272 y=$((${y} + 80))
273 done
274
275 for i in ${other_menuitem_list}
276 do
277 # abort if empty
278 [[ -z ${i} ]] && continue
279
280 # get database information
281 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
282
283 # new line if x > xres
284 if [ ${x} -ge ${xres} ]
285 then
286 x=50
287 y=$((${y} + 80))
288 fi
289
290 # new row if y > yres
291 if [ ${y} -ge ${yres} ]
292 then
293 x=$((${x} + 120))
294 y=50
295
296 # re-check x
297 [ ${x} -ge ${xres} ] && x=50
298 fi
299
300 generate_icon \
301 --name "${cfg_other_menuitems_name}" \
302 --command "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
303 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_other_menuitems_name}).png" \
304 --dest "${dest}/$(fix_whitespaces ${cfg_other_menuitems_name}).lnk" \
305 --xres "${x}" \
306 --yres "${y}" \
307 --default-icon "default_item.png"
308
309 y=$((${y} + 80))
310 done
311
312 for i in ${plugin_list}
313 do
314 # abort if empty
315 [[ -z ${i} ]] && continue
316
317 evaluate_table cfg_plugins "where serial='${ALX_SERIAL}' and id='${i}'"
318 if [[ -x ${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh ]]
319 then
320 eval $(${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh menuitem)
321
322 # abort if name or exec is empty
323 [[ -z ${PLUGIN_MENUITEM_NAME} ]] && continue
324 [[ -z ${PLUGIN_MENUITEM_EXEC} ]] && continue
325
326 # new line if x > xres
327 if [ ${x} -ge ${xres} ]
328 then
329 x=50
330 y=$((${y} + 80))
331 fi
332
333 # new row if y > yres
334 if [ ${y} -ge ${yres} ]
335 then
336 x=$((${x} + 120))
337 y=50
338
339 # re-check x
340 [ ${x} -ge ${xres} ] && x=50
341 fi
342
343 generate_icon \
344 --name "${PLUGIN_MENUITEM_NAME}" \
345 --command "${progsh_path}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME})" \
346 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME}).png" \
347 --dest "${dest}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME}).lnk" \
348 --xres "${x}" \
349 --yres "${y}" \
350 --default-icon "default_item.png"
351
352 y=$((${y} + 80))
353 fi
354
355 # unset all variables
356 unset PLUGIN_MENUITEM_NAME
357 unset PLUGIN_MENUITEM_EXEC
358 unset PLUGIN_MENUITEM_PARAM
359 unset PLUGIN_MENUITEM_WORKDIR
360 unset PLUGIN_MENUITEM_ICON
361 done
362
363 # add shutdown, reboot icons
364 for i in shutdown reboot
365 do
366 # new line if x > xres
367 if [ ${x} -ge ${xres} ]
368 then
369 x=50
370 y=$((${y} + 80))
371 fi
372
373 # new row if y > yres
374 if [ ${y} -ge ${yres} ]
375 then
376 x=$((${x} + 120))
377 y=50
378
379 # re-check x
380 [ ${x} -ge ${xres} ] && x=50
381 fi
382
383 case ${i} in
384 shutdown) name="Herunterfahren" ;;
385 reboot) name="Neustarten" ;;
386 esac
387
388 generate_icon \
389 --name "${name}" \
390 --command "/usr/lib/alxconfig-ng/bin/user_${i}.sh" \
391 --icon "${ALX_SESSIONS_ICONS}/${i}.png" \
392 --dest "${dest}/${i}.lnk" \
393 --xres "${x}" \
394 --yres "${y}" \
395 --icon-width "40" \
396 --icon-height "40"
397
398 y=$((${y} + 80))
399 done
400
401 # last but not least gen a icon with some sys informations
402 local sysinfo
403 local hostname
404 local osversion
405
406 osversion="$(< /etc/mageversion)"
407 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
408 sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)"
409
410 # now get the right position:
411 # restore orig values of xres
412 xres="$(( ${xres} + 120 ))"
413 # default y pos (full yres -22 = cur yres + 58 !)
414 yres="$(( ${yres} + 58 ))"
415 # middle of the screen
416 # (no txt - length required, xtdesk manage that itself)
417 xres="$(( ${xres} / 2))"
418
419 generate_icon \
420 --name "${sysinfo}" \
421 --command "exit 0" \
422 --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \
423 --dest "${dest}/sysinfo.lnk" \
424 --xres "${xres}" \
425 --yres "${yres}" \
426 --icon-width "1" \
427 --icon-height "1"
428 }
429
430 config_sessions()
431 {
432 local i
433 local all_ses_ids
434 local all_other_ids
435 local CONFIG
436 local screensaver_passwd_cmd
437 local fbinit
438 local fbkeys
439
440 # get all session ids from database
441 all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
442 # get all other_menuitem ids from database
443 all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
444 # get all plugin ids from database
445 all_plugin_ids=$(mysqldo "select id from cfg_plugins where serial='${ALX_SERIAL}'")
446
447 # get screensaver settings
448 evaluate_table cfg_screensaver
449 # get autostart settings
450 evaluate_table cfg_autostart
451 # get current color depth
452 evaluate_table cfg_graphic
453
454 # now setup fluxbox for user station
455
456 # create a fresh fluxbox directory
457 [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
458 install -d ${ALX_UNPRIV_HOME}/.fluxbox
459
460 # now generate fluxbox config files
461
462 # fluxbox main config
463 if [ -f ${ALX_SKELETONS}/fluxbox/init ]
464 then
465 fbinit="${ALX_SKELETONS}/fluxbox/init"
466 else
467 fbinit="/usr/share/fluxbox/init"
468 fi
469 cat ${fbinit} > ${ALX_UNPRIV_HOME}/.fluxbox/init
470
471 # fluxbox autostart
472 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
473 # do not show decorations on messages generated with xmessage
474 if [ -x /usr/bin/xmessage ]
475 then
476 addconfig '[app] (xmessage)'
477 addconfig ' [Deco] {NONE}'
478 addconfig '[end]'
479 fi
480 # add icon utility
481 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
482 # add numlock utility
483 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
484
485 # add screensaver
486 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
487 then
488 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
489 then
490 screensaver_passwd_cmd="-nolock"
491 else
492 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
493 fi
494
495 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
496 fi
497
498 # add autostart session
499 if [[ ! -z ${cfg_autostart_session} ]]
500 then
501 # sleep one second to wait until busybox is fully initialized and the screen is really centered
502 addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
503 fi
504
505 # fluxbox hotkeys
506 if [ -f ${ALX_SKELETONS}/fluxbox/keys ]
507 then
508 fbkeys="${ALX_SKELETONS}/fluxbox/keys"
509 else
510 fbkeys="/usr/share/fluxbox/keys"
511 fi
512 cat ${fbkeys} > ${ALX_UNPRIV_HOME}/.fluxbox/keys
513
514 # generate a fluxbox menu
515 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
516 clearconfig
517
518 # fluxbox menu header
519 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
520 # now fix it with proper messages :P
521 local ver="$(< /etc/mageversion)"
522 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
523 # add a newline (maybe there is no crlf in the header)
524 addconfig
525
526 # first generate session files
527 for i in ${all_ses_ids}
528 do
529 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
530 generate_ica_session_file \
531 --session "${cfg_sessions_session}" \
532 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
533 --username "${cfg_sessions_username}" \
534 --password "${cfg_sessions_password}" \
535 --domain "${cfg_sessions_domain}" \
536 --server "${cfg_sessions_browseradrs}" \
537 --colordepth "${cfg_graphic_depth}"
538
539 # fluxbox menusession
540 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
541 done
542
543 # delete all progs
544 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
545 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
546 install -d ${progsh_path}
547
548 # add other menuitems
549 for i in ${all_other_ids}
550 do
551 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
552
553 # now echo config line for fluxbox-menu
554 # make it "configureable" :p
555 if [[ -n ${cfg_other_menuitems_workdir} ]]
556 then
557 workdir="--workdir ${cfg_other_menuitems_workdir}"
558 fi
559 if [[ -n ${cfg_other_menuitems_icon} ]]
560 then
561 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
562 fi
563
564 # gen prog startup wrapper
565 generate_program_sh \
566 --name "${cfg_other_menuitems_name}" \
567 --exec "${cfg_other_menuitems_exec}" \
568 --param "${cfg_other_menuitems_param}" \
569 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
570 "${workdir}"
571
572 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
573 done
574
575 # add plugins
576 for i in ${all_plugin_ids}
577 do
578 evaluate_table cfg_plugins "where serial='${ALX_SERIAL}' and id='${i}'"
579 if [[ -x ${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh ]]
580 then
581 eval $(${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh menuitem)
582
583 # abort if name or exec is empty
584 [[ -z ${PLUGIN_MENUITEM_NAME} ]] && continue
585 [[ -z ${PLUGIN_MENUITEM_EXEC} ]] && continue
586
587 # now echo config line for fluxbox-menu
588 # make it "configureable" :p
589 if [[ -n ${PLUGIN_MENUITEM_WORKDIR} ]]
590 then
591 workdir="--workdir ${PLUGIN_MENUITEM_WORKDIR}"
592 fi
593 if [[ -n ${PLUGIN_MENUITEM_ICON} ]]
594 then
595 PLUGIN_MENUITEM_ICON="<${PLUGIN_MENUITEM_ICON}>"
596 fi
597
598 # gen prog startup wrapper
599 generate_program_sh \
600 --name "${PLUGIN_MENUITEM_NAME}" \
601 --exec "${PLUGIN_MENUITEM_EXEC}" \
602 --param "${PLUGIN_MENUITEM_PARAM}" \
603 --dest "${progsh_path}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME})" \
604 "${workdir}"
605
606 addconfig "[exec] (${PLUGIN_MENUITEM_NAME}) {${progsh_path}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME})} ${PLUGIN_MENUITEM_ICON}"
607 fi
608
609 # unset all variables
610 unset PLUGIN_MENUITEM_NAME
611 unset PLUGIN_MENUITEM_EXEC
612 unset PLUGIN_MENUITEM_PARAM
613 unset PLUGIN_MENUITEM_WORKDIR
614 unset PLUGIN_MENUITEM_ICON
615 done
616
617 # fluxbox menu footer
618 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
619 # add a newline (maybe there is no crlf in the footer)
620 addconfig
621
622 # now it's a good time to generate *all* icons :)
623 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}" "${all_plugin_ids}"
624
625 # fix permissions
626 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
627 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
628 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
629 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
630 }