Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2565 - (show annotations) (download) (as text)
Mon Jul 4 20:17:25 2011 UTC (12 years, 9 months ago) by niro
File MIME type: application/x-sh
File size: 13315 byte(s)
-fixed reboot/shutdown icon size
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 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=50
235 declare -i y=50
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=50
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=50
258
259 # re-check x
260 [ ${x} -ge ${xres} ] && x=50
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=50
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=50
294
295 # re-check x
296 [ ${x} -ge ${xres} ] && x=50
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 # new line if x > xres
315 if [ ${x} -ge ${xres} ]
316 then
317 x=50
318 y=$((${y} + 80))
319 fi
320
321 # new row if y > yres
322 if [ ${y} -ge ${yres} ]
323 then
324 x=$((${x} + 120))
325 y=50
326
327 # re-check x
328 [ ${x} -ge ${xres} ] && x=50
329 fi
330
331 case ${i} in
332 shutdown) name="Herunterfahren" ;;
333 reboot) name="Neustarten" ;;
334 esac
335
336 generate_icon \
337 --name "${name}" \
338 --command "/usr/lib/alxconfig-ng/bin/user_${i}.sh" \
339 --icon "${ALX_SESSIONS_ICONS}/${i}.png" \
340 --dest "${dest}/${i}.lnk" \
341 --xres "${x}" \
342 --yres "${y}" \
343 --icon-width "40" \
344 --icon-height "40"
345
346 y=$((${y} + 80))
347 done
348
349 # last but not least gen a icon with some sys informations
350 local sysinfo
351 local hostname
352 local osversion
353
354 osversion="$(< /etc/mageversion)"
355 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
356 sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)"
357
358 # now get the right position:
359 # restore orig values of xres
360 xres="$(( ${xres} + 120 ))"
361 # default y pos (full yres -22 = cur yres + 58 !)
362 yres="$(( ${yres} + 58 ))"
363 # middle of the screen
364 # (no txt - length required, xtdesk manage that itself)
365 xres="$(( ${xres} / 2))"
366
367 generate_icon \
368 --name "${sysinfo}" \
369 --command "exit 0" \
370 --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \
371 --dest "${dest}/sysinfo.lnk" \
372 --xres "${xres}" \
373 --yres "${yres}" \
374 --icon-width "1" \
375 --icon-height "1"
376 }
377
378 config_sessions()
379 {
380 local i
381 local all_ses_ids
382 local all_other_ids
383 local CONFIG
384 local screensaver_passwd_cmd
385 local fbinit
386 local fbkeys
387
388 # get all session ids from database
389 all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
390 # get all other_menutiem ids from database
391 all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
392
393 # get screensaver settings
394 evaluate_table cfg_screensaver
395 # get autostart settings
396 evaluate_table cfg_autostart
397 # get current color depth
398 evaluate_table cfg_graphic
399
400 # now setup fluxbox for user station
401
402 # create a fresh fluxbox directory
403 [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
404 install -d ${ALX_UNPRIV_HOME}/.fluxbox
405
406 # now generate fluxbox config files
407
408 # fluxbox main config
409 if [ -f ${ALX_SKELETONS}/fluxbox/init ]
410 then
411 fbinit="${ALX_SKELETONS}/fluxbox/init"
412 else
413 fbinit="/usr/share/fluxbox/init"
414 fi
415 cat ${fbinit} > ${ALX_UNPRIV_HOME}/.fluxbox/init
416
417 # fluxbox autostart
418 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
419 # do not show decorations on messages generated with xmessage
420 if [ -x /usr/bin/xmessage ]
421 then
422 addconfig '[app] (xmessage)'
423 addconfig ' [Deco] {NONE}'
424 addconfig '[end]'
425 fi
426 # add icon utility
427 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
428 # add numlock utility
429 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
430
431 # add screensaver
432 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
433 then
434 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
435 then
436 screensaver_passwd_cmd="-nolock"
437 else
438 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
439 fi
440
441 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
442 fi
443
444 # add autostart session
445 if [[ ! -z ${cfg_autostart_session} ]]
446 then
447 # sleep one second to wait until busybox is fully initialized and the screen is really centered
448 addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
449 fi
450
451 # fluxbox hotkeys
452 if [ -f ${ALX_SKELETONS}/fluxbox/keys ]
453 then
454 fbkeys="${ALX_SKELETONS}/fluxbox/keys"
455 else
456 fbkeys="/usr/share/fluxbox/keys"
457 fi
458 cat ${fbkeys} > ${ALX_UNPRIV_HOME}/.fluxbox/keys
459
460 # generate a fluxbox menu
461 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
462 clearconfig
463
464 # fluxbox menu header
465 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
466 # now fix it with proper messages :P
467 local ver="$(< /etc/mageversion)"
468 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
469 # add a newline (maybe there is no crlf in the header)
470 addconfig
471
472 # first generate session files
473 for i in ${all_ses_ids}
474 do
475 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
476 generate_ica_session_file \
477 --session "${cfg_sessions_session}" \
478 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
479 --username "${cfg_sessions_username}" \
480 --password "${cfg_sessions_password}" \
481 --domain "${cfg_sessions_domain}" \
482 --server "${cfg_sessions_browseradrs}" \
483 --colordepth "${cfg_graphic_depth}"
484
485 # fluxbox menusession
486 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
487 done
488
489 # delete all progs
490 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
491 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
492 install -d ${progsh_path}
493
494 # add other menuitems
495 for i in ${all_other_ids}
496 do
497 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
498
499 # now echo config line for fluxbox-menu
500 # make it "configureable" :p
501 if [[ -n ${cfg_other_menuitems_workdir} ]]
502 then
503 workdir="--workdir ${cfg_other_menuitems_workdir}"
504 fi
505 if [[ -n ${cfg_other_menuitems_icon} ]]
506 then
507 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
508 fi
509
510 # gen prog startup wrapper
511 generate_program_sh \
512 --name "${cfg_other_menuitems_name}" \
513 --exec "${cfg_other_menuitems_exec}" \
514 --param "${cfg_other_menuitems_param}" \
515 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
516 "${workdir}"
517
518 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
519 done
520
521 # fluxbox menu footer
522 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
523 # add a newline (maybe there is no crlf in the footer)
524 addconfig
525
526 # now it's a good time to generate *all* icons :)
527 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
528
529 # fix permissions
530 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
531 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
532 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
533 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
534 chmod 0644 ${ALX_UNPRIV_HOME}/.ideskrc
535 }