Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2469 - (show annotations) (download) (as text)
Mon Jun 27 15:07:00 2011 UTC (12 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 13310 byte(s)
-do not install skeletons already provided by fluxbox
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=30
166 [[ -z ${yres} ]] && xres=30
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 res
199 local xres
200 local yres
201 local x
202 local y
203 local i
204 local name
205 local progsh_path
206 local utility
207 local dest
208 local rc
209
210 dest="${ALX_UNPRIV_HOME}/.idesktop"
211 rc="${ALX_UNPRIV_HOME}/.ideskrc"
212
213 # progsh path
214 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
215
216 # get the resolution
217 res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'")
218
219 # split res to x & y
220 xres="${res%x*}"
221 yres="${res#*x}"
222
223 # top left edge of the icon is given in config file
224 # remove a little bit to simulate the bottom-right edge
225 xres="$(( ${xres} - 120 ))"
226 yres="$(( ${yres} - 80 ))"
227
228 # clean desktop icon location
229 [ -d ${dest} ] && rm -rf ${dest}
230 [ -f ${rc} ] && rm -f ${rc}
231 install -d ${dest}
232
233 # default settings
234 declare -i x=30
235 declare -i y=30
236
237 # ica icons
238 for i in ${session_list}
239 do
240 # abort if empty
241 [[ -z ${i} ]] && continue
242
243 # get database information
244 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
245
246 # new line if x > xres
247 if [ ${x} -ge ${xres} ]
248 then
249 x=30
250 y=$((${y} + 80))
251 fi
252
253 # new row if y > yres
254 if [ ${y} -ge ${yres} ]
255 then
256 x=$((${x} + 120))
257 y=30
258
259 # re-check x
260 [ ${x} -ge ${xres} ] && x=30
261 fi
262
263 generate_icon \
264 --name "${cfg_sessions_session}" \
265 --command "nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})" \
266 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_sessions_session}).png" \
267 --dest "${dest}/$(fix_whitespaces ${cfg_sessions_session}).lnk" \
268 --xres "${x}" \
269 --yres "${y}"
270
271 y=$((${y} + 80))
272 done
273
274 for i in ${other_menuitem_list}
275 do
276 # abort if empty
277 [[ -z ${i} ]] && continue
278
279 # get database information
280 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
281
282 # new line if x > xres
283 if [ ${x} -ge ${xres} ]
284 then
285 x=30
286 y=$((${y} + 80))
287 fi
288
289 # new row if y > yres
290 if [ ${y} -ge ${yres} ]
291 then
292 x=$((${x} + 120))
293 y=30
294
295 # re-check x
296 [ ${x} -ge ${xres} ] && x=30
297 fi
298
299 generate_icon \
300 --name "${cfg_other_menuitems_name}" \
301 --command "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
302 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_other_menuitems_name}).png" \
303 --dest "${dest}/$(fix_whitespaces ${cfg_other_menuitems_name}).lnk" \
304 --xres "${x}" \
305 --yres "${y}" \
306 --default-icon "default_item.png"
307
308 y=$((${y} + 80))
309 done
310
311 # add shutdown, reboot icons
312 for i in shutdown reboot
313 do
314 # abort if empty
315 [[ -z ${i} ]] && continue
316
317 # new line if x > xres
318 if [ ${x} -ge ${xres} ]
319 then
320 x=30
321 y=$((${y} + 80))
322 fi
323
324 # new row if y > yres
325 if [ ${y} -ge ${yres} ]
326 then
327 x=$((${x} + 120))
328 y=30
329
330 # re-check x
331 [ ${x} -ge ${xres} ] && x=30
332 fi
333
334 case ${i} in
335 shutdown) name="Herunterfahren"
336 reboot) name="Neustarten"
337 esac
338
339 generate_icon \
340 --name "${name}" \
341 --command "/usr/lib/alxconfig-ng/bin/user_${i}.sh" \
342 --icon "${ALX_SESSIONS_ICONS}/${i}.png" \
343 --dest "${dest}/${i}.lnk" \
344 --xres "${x}" \
345 --yres "${y}"
346
347 y=$((${y} + 80))
348 done
349
350 # last but not least gen a icon with some sys informations
351 local sysinfo
352 local hostname
353 local osversion
354
355 osversion="$(< /etc/mageversion)"
356 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
357 sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)"
358
359 # now get the right position:
360 # restore orig values of xres
361 xres="$(( ${xres} + 120 ))"
362 # default y pos (full yres -22 = cur yres + 58 !)
363 yres="$(( ${yres} + 58 ))"
364 # middle of the screen
365 # (no txt - length required, xtdesk manage that itself)
366 xres="$(( ${xres} / 2))"
367
368 generate_icon \
369 --name "${sysinfo}" \
370 --command "exit 0" \
371 --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \
372 --dest "${dest}/sysinfo.lnk" \
373 --xres "${xres}" \
374 --yres "${yres}" \
375 --icon-width "1" \
376 --icon-height "1"
377 }
378
379 config_sessions()
380 {
381 local i
382 local all_ses_ids
383 local all_other_ids
384 local CONFIG
385 local screensaver_passwd_cmd
386 local fbinit
387 local fbkeys
388
389 # get all session ids from database
390 all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
391 # get all other_menutiem ids from database
392 all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
393
394 # get screensaver settings
395 evaluate_table cfg_screensaver
396 # get autostart settings
397 evaluate_table cfg_autostart
398 # get current color depth
399 evaluate_table cfg_graphic
400
401 # now setup fluxbox for user station
402
403 # create a fresh fluxbox directory
404 [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
405 install -d ${ALX_UNPRIV_HOME}/.fluxbox
406
407 # now generate fluxbox config files
408
409 # fluxbox main config
410 if [ -f ${ALX_SKELETONS}/fluxbox/init ]
411 then
412 fbinit="${ALX_SKELETONS}/fluxbox/init"
413 else
414 fbinit="/usr/share/fluxbox/init"
415 fi
416 cat ${fbinit} > ${ALX_UNPRIV_HOME}/.fluxbox/init
417
418 # fluxbox autostart
419 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
420 # do not show decorations on messages generated with xmessage
421 if [ -x /usr/bin/xmessage ]
422 then
423 addconfig '[app] (xmessage)'
424 addconfig ' [Deco] {NONE}'
425 addconfig '[end]'
426 fi
427 # add icon utility
428 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
429 # add numlock utility
430 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
431
432 # add screensaver
433 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
434 then
435 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
436 then
437 screensaver_passwd_cmd="-nolock"
438 else
439 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
440 fi
441
442 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
443 fi
444
445 # add autostart session
446 if [[ ! -z ${cfg_autostart_session} ]]
447 then
448 # sleep one second to wait until busybox is fully initialized and the screen is really centered
449 addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
450 fi
451
452 # fluxbox hotkeys
453 if [ -f ${ALX_SKELETONS}/fluxbox/keys ]
454 then
455 fbkeys="${ALX_SKELETONS}/fluxbox/keys"
456 else
457 fbkeys="/usr/share/fluxbox/keys"
458 fi
459 cat ${fbkeys} > ${ALX_UNPRIV_HOME}/.fluxbox/keys
460
461 # generate a fluxbox menu
462 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
463 clearconfig
464
465 # fluxbox menu header
466 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
467 # now fix it with proper messages :P
468 local ver="$(< /etc/mageversion)"
469 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
470 # add a newline (maybe there is no crlf in the header)
471 addconfig
472
473 # first generate session files
474 for i in ${all_ses_ids}
475 do
476 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
477 generate_ica_session_file \
478 --session "${cfg_sessions_session}" \
479 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
480 --username "${cfg_sessions_username}" \
481 --password "${cfg_sessions_password}" \
482 --domain "${cfg_sessions_domain}" \
483 --server "${cfg_sessions_browseradrs}" \
484 --colordepth "${cfg_graphic_depth}"
485
486 # fluxbox menusession
487 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
488 done
489
490 # delete all progs
491 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
492 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
493 install -d ${progsh_path}
494
495 # add other menuitems
496 for i in ${all_other_ids}
497 do
498 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
499
500 # now echo config line for fluxbox-menu
501 # make it "configureable" :p
502 if [[ -n ${cfg_other_menuitems_workdir} ]]
503 then
504 workdir="--workdir ${cfg_other_menuitems_workdir}"
505 fi
506 if [[ -n ${cfg_other_menuitems_icon} ]]
507 then
508 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
509 fi
510
511 # gen prog startup wrapper
512 generate_program_sh \
513 --name "${cfg_other_menuitems_name}" \
514 --exec "${cfg_other_menuitems_exec}" \
515 --param "${cfg_other_menuitems_param}" \
516 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
517 "${workdir}"
518
519 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
520 done
521
522 # fluxbox menu footer
523 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
524 # add a newline (maybe there is no crlf in the footer)
525 addconfig
526
527 # now it's a good time to generate *all* icons :)
528 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
529
530 # fix permissions
531 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
532 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
533 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
534 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
535 chmod 0644 ${ALX_UNPRIV_HOME}/.ideskrc
536 }