Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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