Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2435 - (hide annotations) (download) (as text)
Thu Jun 16 16:21:11 2011 UTC (12 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 13048 byte(s)
-set the correct session colors from current desktop settings, do not rely on citrix's auto-detection
1 niro 2001 # $Id$
2 niro 236 # configures ica-sessions on the host via mysql db settings
3    
4 niro 2161 fix_whitespaces()
5     {
6     local var="$@"
7     echo "${var//\ /_}"
8     }
9    
10 niro 2149 # helper function to create citrix session files
11     generate_ica_session_file()
12 niro 236 {
13 niro 246 local i
14 niro 2149 local num
15 niro 246 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 niro 2435 local ses_colors
23 niro 2035 local CONFIG
24 niro 246
25 niro 2149 # very basic getops
26     for i in $*
27 niro 246 do
28 niro 2149 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 niro 2161 --server) shift; ses_browseradrs="$1" ;;
35 niro 2435 --colordepth) shift; ses_colors="$1" ;;
36 niro 2149 esac
37     shift
38     done
39 niro 246
40 niro 2149 # abort if session, filename or server not given
41 niro 2161 [[ -z ${ses_session} ]] && return 1
42     [[ -z ${ses_filename} ]] && return 1
43     [[ -z ${ses_browseradrs} ]] && return 1
44 niro 272
45 niro 2149 # write session files
46     CONFIG="${ALX_ICA_SESSIONS}/${ses_filename}"
47     clearconfig
48 niro 2035
49 niro 2149 addconfig '[WFClient]'
50     addconfig 'Version=2'
51 niro 1654
52 niro 2149 # 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 niro 246 done
63 niro 2149
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 niro 2435
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 niro 2149 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 niro 246 }
87    
88 niro 317 # generates a sh file to start programs
89     generate_program_sh()
90     {
91     local dest
92     local name
93     local exec
94 niro 2161 local param
95 niro 317 local workdir
96 niro 2035 local CONFIG
97 niro 317
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 niro 2161 --param|-p) shift; param="$1" ;;
105 niro 317 --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 niro 2149 [[ -z ${name} ]] && return 1
113     [[ -z ${exec} ]] && return 1
114     [[ -z ${dest} ]] && return 1
115 niro 317
116 niro 2149 CONFIG="${dest}"
117 niro 2035 addconfig "#!/bin/sh"
118     [ -n "${workdir}" ] && addconfig "cd ${workdir}"
119 niro 2161 addconfig "exec ${exec} ${param}"
120 niro 317
121 niro 2149 chmod 0755 "${dest}"
122 niro 317 }
123    
124 niro 304 # 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 niro 317 local deficon
136 niro 2035 local CONFIG
137 niro 2401 local utility
138 niro 304
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 niro 317 --default-icon) shift; deficon="$1" ;;
152 niro 304 esac
153     shift
154     done
155    
156 niro 2149 # some sanity checks:
157 niro 2401
158 niro 304 # abort if name or command not given
159 niro 2035 [[ -z ${name} ]] && return 1
160     [[ -z ${command} ]] && return 1
161 niro 304
162 niro 2401 # which utility are we using idesk|xtdesk ?
163     if [ -x /usr/bin/idesk ]
164     then
165     utility="idesk"
166     [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.idesktop/${name}.lnk"
167     else
168     utility="xtdesk"
169     [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.xtdesktop/${name}.lnk"
170     fi
171    
172 niro 304 # use some defaults for icon, dest, {x,y}res
173 niro 2035 [[ -z ${xres} ]] && xres=30
174     [[ -z ${yres} ]] && xres=30
175     if [[ -z ${icon} ]] || [ ! -f ${icon} ]
176 niro 304 then
177 niro 317 # if no default icon is given use default.png
178 niro 2035 [[ -z ${deficon} ]] && deficon="default.png"
179 niro 317 icon="${ALX_SESSIONS_ICONS}/${deficon}"
180 niro 304 fi
181    
182 niro 2161 CONFIG="${dest}"
183 niro 2035 clearconfig
184 niro 304
185 niro 2035 addconfig 'table Icon'
186 niro 2401 [[ ${utility} = xtdesk ]] && addconfig ' Type: Program'
187 niro 2035 addconfig " Caption: ${name}"
188     addconfig " Command: ${command}"
189     addconfig " Icon: ${icon}"
190     addconfig " X: ${xres}"
191     addconfig " Y: ${yres}"
192    
193 niro 304 # add these only if not zero
194 niro 2035 if [[ ! -z ${iwidth} ]] && [[ ! -z ${iheight} ]]
195 niro 304 then
196 niro 2401 if [[ ${utility} = xtdesk ]]
197     then
198     addconfig " IconWidth: ${iwidth}"
199     addconfig " IconHeight: ${iheight}"
200     fi
201     if [[ ${utility} = idesk ]]
202     then
203     addconfig " Width: ${iwidth}"
204     addconfig " Height: ${iheight}"
205     fi
206 niro 304 fi
207    
208 niro 2035 addconfig 'end'
209 niro 304 }
210    
211     generate_all_desktop_icons()
212     {
213 niro 2149 local session_list="$1"
214     local other_menuitem_list="$2"
215 niro 304 local res
216     local xres
217     local yres
218     local x
219     local y
220 niro 2161 local i
221 niro 2149 local name
222 niro 317 local progsh_path
223 niro 2401 local utility
224     local dest
225     local rc
226 niro 304
227 niro 2401 # which utility are we using idesk|xtdesk ?
228     if [ -x /usr/bin/idesk ]
229     then
230     utility="idesk"
231     dest="${ALX_UNPRIV_HOME}/.idesktop"
232     rc="${ALX_UNPRIV_HOME}/.ideskrc"
233     else
234     utility="xtdesk"
235     dest="${ALX_UNPRIV_HOME}/.xtdesktop"
236     rc="${ALX_UNPRIV_HOME}/.xtdeskrc"
237     fi
238    
239    
240 niro 2149 # progsh path
241 niro 2161 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
242 niro 2149
243 niro 304 # get the resolution
244 niro 342 res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'")
245 niro 304
246     # split res to x & y
247 niro 2149 xres="${res%x*}"
248 niro 2166 yres="${res#*x}"
249 niro 304
250     # top left edge of the icon is given in config file
251     # remove a little bit to simulate the bottom-right edge
252     xres="$(( ${xres} - 120 ))"
253     yres="$(( ${yres} - 80 ))"
254    
255     # clean desktop icon location
256 niro 2401 [ -d ${dest} ] && rm -rf ${dest}
257     [ -f ${rc} ] && rm -f ${rc}
258     install -d ${dest}
259 niro 304
260 niro 2401 if [[ ${utility} = xtdesk ]]
261     then
262 niro 2381 # basic config
263     cat ${ALX_SKELETONS}/xtdesktop/xtdeskrc > ${ALX_UNPRIV_HOME}/.xtdesktop/xtdeskrc
264 niro 2401 fi
265 niro 2381
266 niro 304 # default settings
267 niro 1594 declare -i x=30
268     declare -i y=30
269 niro 304
270 niro 2149 # ica icons
271 niro 2161 for i in ${session_list}
272 niro 304 do
273     # abort if empty
274 niro 2161 [[ -z ${i} ]] && continue
275 niro 304
276 niro 2161 # get database information
277     evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
278    
279 niro 304 # new line if x > xres
280 niro 2035 if [ ${x} -ge ${xres} ]
281     then
282 niro 1594 x=30
283 niro 304 y=$((${y} + 80))
284     fi
285    
286     # new row if y > yres
287 niro 2035 if [ ${y} -ge ${yres} ]
288     then
289 niro 304 x=$((${x} + 120))
290 niro 1594 y=30
291 niro 304
292     # re-check x
293 niro 1594 [ ${x} -ge ${xres} ] && x=30
294 niro 304 fi
295    
296     generate_icon \
297 niro 2166 --name "${cfg_sessions_session}" \
298     --command "nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})" \
299     --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_sessions_session}).png" \
300 niro 2401 --dest "${dest}/$(fix_whitespaces ${cfg_sessions_session}).lnk" \
301 niro 304 --xres "${x}" \
302     --yres "${y}"
303    
304     y=$((${y} + 80))
305     done
306    
307 niro 2161 for i in ${other_menuitem_list}
308 niro 317 do
309     # abort if empty
310 niro 2161 [[ -z ${i} ]] && continue
311 niro 317
312 niro 2161 # get database information
313     evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
314    
315 niro 317 # new line if x > xres
316 niro 2035 if [ ${x} -ge ${xres} ]
317     then
318 niro 1594 x=30
319 niro 317 y=$((${y} + 80))
320     fi
321    
322     # new row if y > yres
323 niro 2035 if [ ${y} -ge ${yres} ]
324     then
325 niro 317 x=$((${x} + 120))
326 niro 1594 y=30
327 niro 317
328     # re-check x
329 niro 1594 [ ${x} -ge ${xres} ] && x=30
330 niro 317 fi
331    
332     generate_icon \
333 niro 2161 --name "${cfg_other_menuitems_name}" \
334 niro 2381 --command "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
335 niro 2161 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_other_menuitems_name}).png" \
336 niro 2401 --dest "${dest}/$(fix_whitespaces ${cfg_other_menuitems_name}).lnk" \
337 niro 317 --xres "${x}" \
338     --yres "${y}" \
339     --default-icon "default_item.png"
340    
341     y=$((${y} + 80))
342     done
343    
344 niro 304 # last but not least gen a icon with some sys informations
345     local sysinfo
346     local hostname
347     local osversion
348    
349     osversion="$(< /etc/mageversion)"
350 niro 342 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
351 niro 304 sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)"
352    
353     # now get the right position:
354     # restore orig values of xres
355     xres="$(( ${xres} + 120 ))"
356     # default y pos (full yres -22 = cur yres + 58 !)
357     yres="$(( ${yres} + 58 ))"
358     # middle of the screen
359     # (no txt - length required, xtdesk manage that itself)
360     xres="$(( ${xres} / 2))"
361    
362     generate_icon \
363     --name "${sysinfo}" \
364     --command "exit 0" \
365     --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \
366 niro 2401 --dest "${dest}/sysinfo.lnk" \
367 niro 304 --xres "${xres}" \
368     --yres "${yres}" \
369     --icon-width "1" \
370     --icon-height "1"
371     }
372    
373 niro 236 config_sessions()
374     {
375 niro 272 local i
376 niro 2149 local all_ses_ids
377     local all_other_ids
378 niro 2035 local CONFIG
379 niro 2149 local screensaver_passwd_cmd
380 niro 236
381 niro 2149 # get all session ids from database
382     all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
383     # get all other_menutiem ids from database
384     all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
385    
386     # get screensaver settings
387     evaluate_table cfg_screensaver
388     # get autostart settings
389     evaluate_table cfg_autostart
390 niro 2435 # get current color depth
391     evaluate_table cfg_graphic
392 niro 2149
393 niro 236 # now setup fluxbox for user station
394    
395     # create a fresh fluxbox directory
396     [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
397     install -d ${ALX_UNPRIV_HOME}/.fluxbox
398    
399     # now generate fluxbox config files
400    
401     # fluxbox main config
402 niro 2149 cat ${ALX_SKELETONS}/fluxbox/init > ${ALX_UNPRIV_HOME}/.fluxbox/init
403 niro 236
404     # fluxbox autostart
405 niro 2411 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
406     # add icon utility
407     [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
408     [ -x /usr/bin/xtdesk ] && addconfig '[startup] {nohup xtdesk > /dev/null &}'
409     # add numlock utility
410     [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
411 niro 236
412 niro 338 # add screensaver
413 niro 2149 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
414 niro 338 then
415 niro 2149 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
416 niro 338 then
417 niro 2149 screensaver_passwd_cmd="-nolock"
418 niro 338 else
419 niro 2149 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
420 niro 338 fi
421    
422 niro 2149 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
423 niro 338 fi
424    
425 niro 246 # add autostart session
426 niro 2149 if [[ ! -z ${cfg_autostart_session} ]]
427 niro 246 then
428 niro 2371 # sleep one second to wait until busybox is fully initialized and the screen is really centered
429     addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
430 niro 246 fi
431    
432 niro 236 # fluxbox hotkeys
433 niro 2035 cat ${ALX_SKELETONS}/fluxbox/keys > ${ALX_UNPRIV_HOME}/.fluxbox/keys
434 niro 236
435 niro 2035 # generate a fluxbox menu
436 niro 2161 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
437 niro 2035 clearconfig
438    
439 niro 236 # fluxbox menu header
440 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
441 niro 291 # now fix it with proper messages :P
442     local ver="$(< /etc/mageversion)"
443 niro 2035 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
444 niro 239 # add a newline (maybe there is no crlf in the header)
445 niro 2035 addconfig
446 niro 239
447 niro 2149 # first generate session files
448     for i in ${all_ses_ids}
449 niro 236 do
450 niro 2149 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
451     generate_ica_session_file \
452     --session "${cfg_sessions_session}" \
453 niro 2161 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
454 niro 2149 --username "${cfg_sessions_username}" \
455     --password "${cfg_sessions_password}" \
456     --domain "${cfg_sessions_domain}" \
457 niro 2435 --server "${cfg_sessions_browseradrs}" \
458     --colordepth "${cfg_graphic_depth}"
459 niro 2149
460     # fluxbox menusession
461 niro 2161 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
462 niro 2149 done
463    
464     # delete all progs
465     progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
466     [ -d ${progsh_path} ] && rm -rf ${progsh_path}
467     install -d ${progsh_path}
468    
469     # add other menuitems
470     for i in ${all_other_ids}
471     do
472     evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
473    
474     # now echo config line for fluxbox-menu
475     # make it "configureable" :p
476     if [[ -n ${cfg_other_menuitems_workdir} ]]
477 niro 2035 then
478 niro 2149 workdir="--workdir ${cfg_other_menuitems_workdir}"
479 niro 2035 fi
480 niro 2149 if [[ -n ${cfg_other_menuitems_icon} ]]
481     then
482     cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
483     fi
484    
485     # gen prog startup wrapper
486     generate_program_sh \
487     --name "${cfg_other_menuitems_name}" \
488     --exec "${cfg_other_menuitems_exec}" \
489 niro 2161 --param "${cfg_other_menuitems_param}" \
490     --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
491     "${workdir}"
492 niro 2149
493 niro 2161 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
494 niro 236 done
495    
496     # fluxbox menu footer
497 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
498 niro 239 # add a newline (maybe there is no crlf in the footer)
499 niro 2035 addconfig
500 niro 236
501 niro 304 # now it's a good time to generate *all* icons :)
502 niro 2161 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
503 niro 236
504 niro 2149 # fix permissions
505 niro 236 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
506     chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
507     chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
508 niro 338 chmod 0755 ${ALX_UNPRIV_HOME}/.xtdesktop
509     chmod 0644 ${ALX_UNPRIV_HOME}/.xtdeskrc
510 niro 236 }