Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3503 - (show annotations) (download) (as text)
Thu Apr 19 12:17:20 2012 UTC (12 years ago) by niro
File MIME type: application/x-sh
File size: 16380 byte(s)
-added autostart support for plugins
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 local progsh_path
440
441 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
442
443 # get all session ids from database
444 all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
445 # get all other_menuitem ids from database
446 all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
447 # get all plugin ids from database
448 all_plugin_ids=$(mysqldo "select id from cfg_plugins where serial='${ALX_SERIAL}'")
449
450 # get screensaver settings
451 evaluate_table cfg_screensaver
452 # get autostart settings
453 evaluate_table cfg_autostart
454 # get current color depth
455 evaluate_table cfg_graphic
456
457 # now setup fluxbox for user station
458
459 # create a fresh fluxbox directory
460 [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
461 install -d ${ALX_UNPRIV_HOME}/.fluxbox
462
463 # now generate fluxbox config files
464
465 # fluxbox main config
466 if [ -f ${ALX_SKELETONS}/fluxbox/init ]
467 then
468 fbinit="${ALX_SKELETONS}/fluxbox/init"
469 else
470 fbinit="/usr/share/fluxbox/init"
471 fi
472 cat ${fbinit} > ${ALX_UNPRIV_HOME}/.fluxbox/init
473
474 # fluxbox autostart
475 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
476 # do not show decorations on messages generated with xmessage
477 if [ -x /usr/bin/xmessage ]
478 then
479 addconfig '[app] (xmessage)'
480 addconfig ' [Deco] {NONE}'
481 addconfig '[end]'
482 fi
483 # add icon utility
484 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
485 # add numlock utility
486 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
487
488 # add screensaver
489 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
490 then
491 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
492 then
493 screensaver_passwd_cmd="-nolock"
494 else
495 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
496 fi
497
498 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
499 fi
500
501 # add plugins autostart
502 for i in ${all_plugin_ids}
503 do
504 evaluate_table cfg_plugins "where serial='${ALX_SERIAL}' and id='${i}'"
505 if [[ -x ${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh ]]
506 then
507 eval $(${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh autostart)
508
509 if [[ ${PLUGIN_AUTOSTART} = 1 ]]
510 then
511 addconfig "[startup] {${progsh_path}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME}) &}"
512 fi
513 fi
514 done
515
516 # add autostart session
517 if [[ ! -z ${cfg_autostart_session} ]]
518 then
519 # sleep one second to wait until busybox is fully initialized and the screen is really centered
520 addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
521 fi
522
523 # fluxbox hotkeys
524 if [ -f ${ALX_SKELETONS}/fluxbox/keys ]
525 then
526 fbkeys="${ALX_SKELETONS}/fluxbox/keys"
527 else
528 fbkeys="/usr/share/fluxbox/keys"
529 fi
530 cat ${fbkeys} > ${ALX_UNPRIV_HOME}/.fluxbox/keys
531
532 # generate a fluxbox menu
533 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
534 clearconfig
535
536 # fluxbox menu header
537 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
538 # now fix it with proper messages :P
539 local ver="$(< /etc/mageversion)"
540 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
541 # add a newline (maybe there is no crlf in the header)
542 addconfig
543
544 # first generate session files
545 for i in ${all_ses_ids}
546 do
547 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
548 generate_ica_session_file \
549 --session "${cfg_sessions_session}" \
550 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
551 --username "${cfg_sessions_username}" \
552 --password "${cfg_sessions_password}" \
553 --domain "${cfg_sessions_domain}" \
554 --server "${cfg_sessions_browseradrs}" \
555 --colordepth "${cfg_graphic_depth}"
556
557 # fluxbox menusession
558 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
559 done
560
561 # delete all progs
562 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
563 install -d ${progsh_path}
564
565 # add other menuitems
566 for i in ${all_other_ids}
567 do
568 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
569
570 # now echo config line for fluxbox-menu
571 # make it "configureable" :p
572 if [[ -n ${cfg_other_menuitems_workdir} ]]
573 then
574 workdir="--workdir ${cfg_other_menuitems_workdir}"
575 fi
576 if [[ -n ${cfg_other_menuitems_icon} ]]
577 then
578 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
579 fi
580
581 # gen prog startup wrapper
582 generate_program_sh \
583 --name "${cfg_other_menuitems_name}" \
584 --exec "${cfg_other_menuitems_exec}" \
585 --param "${cfg_other_menuitems_param}" \
586 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
587 "${workdir}"
588
589 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
590 done
591
592 # add plugins
593 for i in ${all_plugin_ids}
594 do
595 evaluate_table cfg_plugins "where serial='${ALX_SERIAL}' and id='${i}'"
596 if [[ -x ${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh ]]
597 then
598 eval $(${ALX_PLUGINS}/${cfg_plugins_plugin}/plugin.sh menuitem)
599
600 # abort if name or exec is empty
601 [[ -z ${PLUGIN_MENUITEM_NAME} ]] && continue
602 [[ -z ${PLUGIN_MENUITEM_EXEC} ]] && continue
603
604 # now echo config line for fluxbox-menu
605 # make it "configureable" :p
606 if [[ -n ${PLUGIN_MENUITEM_WORKDIR} ]]
607 then
608 workdir="--workdir ${PLUGIN_MENUITEM_WORKDIR}"
609 fi
610 if [[ -n ${PLUGIN_MENUITEM_ICON} ]]
611 then
612 PLUGIN_MENUITEM_ICON="<${PLUGIN_MENUITEM_ICON}>"
613 fi
614
615 # gen prog startup wrapper
616 generate_program_sh \
617 --name "${PLUGIN_MENUITEM_NAME}" \
618 --exec "${PLUGIN_MENUITEM_EXEC}" \
619 --param "${PLUGIN_MENUITEM_PARAM}" \
620 --dest "${progsh_path}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME})" \
621 "${workdir}"
622
623 addconfig "[exec] (${PLUGIN_MENUITEM_NAME}) {${progsh_path}/$(fix_whitespaces ${PLUGIN_MENUITEM_NAME})} ${PLUGIN_MENUITEM_ICON}"
624 fi
625
626 # unset all variables
627 unset PLUGIN_MENUITEM_NAME
628 unset PLUGIN_MENUITEM_EXEC
629 unset PLUGIN_MENUITEM_PARAM
630 unset PLUGIN_MENUITEM_WORKDIR
631 unset PLUGIN_MENUITEM_ICON
632 done
633
634 # fluxbox menu footer
635 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
636 # add a newline (maybe there is no crlf in the footer)
637 addconfig
638
639 # now it's a good time to generate *all* icons :)
640 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}" "${all_plugin_ids}"
641
642 # fix permissions
643 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
644 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
645 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
646 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
647 }