Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2469 - (hide 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 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 2035 [[ -z ${xres} ]] && xres=30
166     [[ -z ${yres} ]] && xres=30
167     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 1594 declare -i x=30
235     declare -i y=30
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 1594 x=30
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 1594 y=30
258 niro 304
259     # re-check x
260 niro 1594 [ ${x} -ge ${xres} ] && x=30
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 1594 x=30
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 1594 y=30
294 niro 317
295     # re-check x
296 niro 1594 [ ${x} -ge ${xres} ] && x=30
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     # 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 niro 304 # 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 niro 342 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
357 niro 304 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 niro 2401 --dest "${dest}/sysinfo.lnk" \
373 niro 304 --xres "${xres}" \
374     --yres "${yres}" \
375     --icon-width "1" \
376     --icon-height "1"
377     }
378    
379 niro 236 config_sessions()
380     {
381 niro 272 local i
382 niro 2149 local all_ses_ids
383     local all_other_ids
384 niro 2035 local CONFIG
385 niro 2149 local screensaver_passwd_cmd
386 niro 2469 local fbinit
387     local fbkeys
388 niro 236
389 niro 2149 # 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 niro 2435 # get current color depth
399     evaluate_table cfg_graphic
400 niro 2149
401 niro 236 # 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 niro 2469 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 niro 236
418     # fluxbox autostart
419 niro 2411 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
420 niro 2454 # 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 niro 2411 # add icon utility
428 niro 2454 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
429 niro 2411 # add numlock utility
430 niro 2454 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
431 niro 236
432 niro 338 # add screensaver
433 niro 2149 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
434 niro 338 then
435 niro 2149 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
436 niro 338 then
437 niro 2149 screensaver_passwd_cmd="-nolock"
438 niro 338 else
439 niro 2149 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
440 niro 338 fi
441    
442 niro 2149 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
443 niro 338 fi
444    
445 niro 246 # add autostart session
446 niro 2149 if [[ ! -z ${cfg_autostart_session} ]]
447 niro 246 then
448 niro 2371 # 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 niro 246 fi
451    
452 niro 236 # fluxbox hotkeys
453 niro 2469 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 niro 236
461 niro 2035 # generate a fluxbox menu
462 niro 2161 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
463 niro 2035 clearconfig
464    
465 niro 236 # fluxbox menu header
466 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
467 niro 291 # now fix it with proper messages :P
468     local ver="$(< /etc/mageversion)"
469 niro 2035 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
470 niro 239 # add a newline (maybe there is no crlf in the header)
471 niro 2035 addconfig
472 niro 239
473 niro 2149 # first generate session files
474     for i in ${all_ses_ids}
475 niro 236 do
476 niro 2149 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
477     generate_ica_session_file \
478     --session "${cfg_sessions_session}" \
479 niro 2161 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
480 niro 2149 --username "${cfg_sessions_username}" \
481     --password "${cfg_sessions_password}" \
482     --domain "${cfg_sessions_domain}" \
483 niro 2435 --server "${cfg_sessions_browseradrs}" \
484     --colordepth "${cfg_graphic_depth}"
485 niro 2149
486     # fluxbox menusession
487 niro 2161 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
488 niro 2149 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 niro 2035 then
504 niro 2149 workdir="--workdir ${cfg_other_menuitems_workdir}"
505 niro 2035 fi
506 niro 2149 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 niro 2161 --param "${cfg_other_menuitems_param}" \
516     --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
517     "${workdir}"
518 niro 2149
519 niro 2161 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
520 niro 236 done
521    
522     # fluxbox menu footer
523 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
524 niro 239 # add a newline (maybe there is no crlf in the footer)
525 niro 2035 addconfig
526 niro 236
527 niro 304 # now it's a good time to generate *all* icons :)
528 niro 2161 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
529 niro 236
530 niro 2149 # fix permissions
531 niro 236 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 niro 2454 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
535     chmod 0644 ${ALX_UNPRIV_HOME}/.ideskrc
536 niro 236 }