Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2565 - (hide annotations) (download) (as text)
Mon Jul 4 20:17:25 2011 UTC (12 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 13315 byte(s)
-fixed reboot/shutdown icon size
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 2454 [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.idesktop/${name}.lnk"
163 niro 2401
164 niro 304 # use some defaults for icon, dest, {x,y}res
165 niro 2495 [[ -z ${xres} ]] && xres=50
166     [[ -z ${yres} ]] && xres=50
167 niro 2035 if [[ -z ${icon} ]] || [ ! -f ${icon} ]
168 niro 304 then
169 niro 317 # if no default icon is given use default.png
170 niro 2035 [[ -z ${deficon} ]] && deficon="default.png"
171 niro 317 icon="${ALX_SESSIONS_ICONS}/${deficon}"
172 niro 304 fi
173    
174 niro 2161 CONFIG="${dest}"
175 niro 2035 clearconfig
176 niro 304
177 niro 2035 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 niro 304 # add these only if not zero
185 niro 2035 if [[ ! -z ${iwidth} ]] && [[ ! -z ${iheight} ]]
186 niro 304 then
187 niro 2454 addconfig " Width: ${iwidth}"
188     addconfig " Height: ${iheight}"
189 niro 304 fi
190    
191 niro 2035 addconfig 'end'
192 niro 304 }
193    
194     generate_all_desktop_icons()
195     {
196 niro 2149 local session_list="$1"
197     local other_menuitem_list="$2"
198 niro 304 local res
199     local xres
200     local yres
201     local x
202     local y
203 niro 2161 local i
204 niro 2149 local name
205 niro 317 local progsh_path
206 niro 2401 local utility
207     local dest
208     local rc
209 niro 304
210 niro 2454 dest="${ALX_UNPRIV_HOME}/.idesktop"
211     rc="${ALX_UNPRIV_HOME}/.ideskrc"
212 niro 2401
213 niro 2149 # progsh path
214 niro 2161 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
215 niro 2149
216 niro 304 # get the resolution
217 niro 342 res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'")
218 niro 304
219     # split res to x & y
220 niro 2149 xres="${res%x*}"
221 niro 2166 yres="${res#*x}"
222 niro 304
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 niro 2401 [ -d ${dest} ] && rm -rf ${dest}
230     [ -f ${rc} ] && rm -f ${rc}
231     install -d ${dest}
232 niro 304
233     # default settings
234 niro 2495 declare -i x=50
235     declare -i y=50
236 niro 304
237 niro 2149 # ica icons
238 niro 2161 for i in ${session_list}
239 niro 304 do
240     # abort if empty
241 niro 2161 [[ -z ${i} ]] && continue
242 niro 304
243 niro 2161 # get database information
244     evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
245    
246 niro 304 # new line if x > xres
247 niro 2035 if [ ${x} -ge ${xres} ]
248     then
249 niro 2495 x=50
250 niro 304 y=$((${y} + 80))
251     fi
252    
253     # new row if y > yres
254 niro 2035 if [ ${y} -ge ${yres} ]
255     then
256 niro 304 x=$((${x} + 120))
257 niro 2495 y=50
258 niro 304
259     # re-check x
260 niro 2495 [ ${x} -ge ${xres} ] && x=50
261 niro 304 fi
262    
263     generate_icon \
264 niro 2166 --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 niro 2401 --dest "${dest}/$(fix_whitespaces ${cfg_sessions_session}).lnk" \
268 niro 304 --xres "${x}" \
269     --yres "${y}"
270    
271     y=$((${y} + 80))
272     done
273    
274 niro 2161 for i in ${other_menuitem_list}
275 niro 317 do
276     # abort if empty
277 niro 2161 [[ -z ${i} ]] && continue
278 niro 317
279 niro 2161 # get database information
280     evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
281    
282 niro 317 # new line if x > xres
283 niro 2035 if [ ${x} -ge ${xres} ]
284     then
285 niro 2495 x=50
286 niro 317 y=$((${y} + 80))
287     fi
288    
289     # new row if y > yres
290 niro 2035 if [ ${y} -ge ${yres} ]
291     then
292 niro 317 x=$((${x} + 120))
293 niro 2495 y=50
294 niro 317
295     # re-check x
296 niro 2495 [ ${x} -ge ${xres} ] && x=50
297 niro 317 fi
298    
299     generate_icon \
300 niro 2161 --name "${cfg_other_menuitems_name}" \
301 niro 2381 --command "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
302 niro 2161 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_other_menuitems_name}).png" \
303 niro 2401 --dest "${dest}/$(fix_whitespaces ${cfg_other_menuitems_name}).lnk" \
304 niro 317 --xres "${x}" \
305     --yres "${y}" \
306     --default-icon "default_item.png"
307    
308     y=$((${y} + 80))
309     done
310    
311 niro 2469 # 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 niro 2495 x=50
318 niro 2469 y=$((${y} + 80))
319     fi
320    
321     # new row if y > yres
322     if [ ${y} -ge ${yres} ]
323     then
324     x=$((${x} + 120))
325 niro 2495 y=50
326 niro 2469
327     # re-check x
328 niro 2495 [ ${x} -ge ${xres} ] && x=50
329 niro 2469 fi
330    
331     case ${i} in
332 niro 2479 shutdown) name="Herunterfahren" ;;
333     reboot) name="Neustarten" ;;
334 niro 2469 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 niro 2565 --yres "${y}" \
343     --icon-width "40" \
344     --icon-height "40"
345 niro 2469
346     y=$((${y} + 80))
347     done
348    
349 niro 304 # 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 niro 342 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
356 niro 304 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 niro 2401 --dest "${dest}/sysinfo.lnk" \
372 niro 304 --xres "${xres}" \
373     --yres "${yres}" \
374     --icon-width "1" \
375     --icon-height "1"
376     }
377    
378 niro 236 config_sessions()
379     {
380 niro 272 local i
381 niro 2149 local all_ses_ids
382     local all_other_ids
383 niro 2035 local CONFIG
384 niro 2149 local screensaver_passwd_cmd
385 niro 2469 local fbinit
386     local fbkeys
387 niro 236
388 niro 2149 # 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 niro 2435 # get current color depth
398     evaluate_table cfg_graphic
399 niro 2149
400 niro 236 # 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 niro 2469 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 niro 236
417     # fluxbox autostart
418 niro 2411 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
419 niro 2454 # 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 niro 2411 # add icon utility
427 niro 2454 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
428 niro 2411 # add numlock utility
429 niro 2454 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
430 niro 236
431 niro 338 # add screensaver
432 niro 2149 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
433 niro 338 then
434 niro 2149 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
435 niro 338 then
436 niro 2149 screensaver_passwd_cmd="-nolock"
437 niro 338 else
438 niro 2149 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
439 niro 338 fi
440    
441 niro 2149 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
442 niro 338 fi
443    
444 niro 246 # add autostart session
445 niro 2149 if [[ ! -z ${cfg_autostart_session} ]]
446 niro 246 then
447 niro 2371 # 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 niro 246 fi
450    
451 niro 236 # fluxbox hotkeys
452 niro 2469 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 niro 236
460 niro 2035 # generate a fluxbox menu
461 niro 2161 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
462 niro 2035 clearconfig
463    
464 niro 236 # fluxbox menu header
465 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
466 niro 291 # now fix it with proper messages :P
467     local ver="$(< /etc/mageversion)"
468 niro 2035 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
469 niro 239 # add a newline (maybe there is no crlf in the header)
470 niro 2035 addconfig
471 niro 239
472 niro 2149 # first generate session files
473     for i in ${all_ses_ids}
474 niro 236 do
475 niro 2149 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
476     generate_ica_session_file \
477     --session "${cfg_sessions_session}" \
478 niro 2161 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
479 niro 2149 --username "${cfg_sessions_username}" \
480     --password "${cfg_sessions_password}" \
481     --domain "${cfg_sessions_domain}" \
482 niro 2435 --server "${cfg_sessions_browseradrs}" \
483     --colordepth "${cfg_graphic_depth}"
484 niro 2149
485     # fluxbox menusession
486 niro 2161 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
487 niro 2149 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 niro 2035 then
503 niro 2149 workdir="--workdir ${cfg_other_menuitems_workdir}"
504 niro 2035 fi
505 niro 2149 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 niro 2161 --param "${cfg_other_menuitems_param}" \
515     --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
516     "${workdir}"
517 niro 2149
518 niro 2161 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
519 niro 236 done
520    
521     # fluxbox menu footer
522 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
523 niro 239 # add a newline (maybe there is no crlf in the footer)
524 niro 2035 addconfig
525 niro 236
526 niro 304 # now it's a good time to generate *all* icons :)
527 niro 2161 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
528 niro 236
529 niro 2149 # fix permissions
530 niro 236 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 niro 2454 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
534     chmod 0644 ${ALX_UNPRIV_HOME}/.ideskrc
535 niro 236 }