Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2495 - (hide 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 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     --yres "${y}"
343    
344     y=$((${y} + 80))
345     done
346    
347 niro 304 # 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 niro 342 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
354 niro 304 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 niro 2401 --dest "${dest}/sysinfo.lnk" \
370 niro 304 --xres "${xres}" \
371     --yres "${yres}" \
372     --icon-width "1" \
373     --icon-height "1"
374     }
375    
376 niro 236 config_sessions()
377     {
378 niro 272 local i
379 niro 2149 local all_ses_ids
380     local all_other_ids
381 niro 2035 local CONFIG
382 niro 2149 local screensaver_passwd_cmd
383 niro 2469 local fbinit
384     local fbkeys
385 niro 236
386 niro 2149 # 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 niro 2435 # get current color depth
396     evaluate_table cfg_graphic
397 niro 2149
398 niro 236 # 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 niro 2469 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 niro 236
415     # fluxbox autostart
416 niro 2411 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
417 niro 2454 # 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 niro 2411 # add icon utility
425 niro 2454 [ -x /usr/bin/idesk ] && addconfig '[startup] {nohup idesk > /dev/null &}'
426 niro 2411 # add numlock utility
427 niro 2454 [ -x /usr/bin/numlockx ] && addconfig '[startup] {nohup numlockx on &}'
428 niro 236
429 niro 338 # add screensaver
430 niro 2149 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
431 niro 338 then
432 niro 2149 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
433 niro 338 then
434 niro 2149 screensaver_passwd_cmd="-nolock"
435 niro 338 else
436 niro 2149 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
437 niro 338 fi
438    
439 niro 2149 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
440 niro 338 fi
441    
442 niro 246 # add autostart session
443 niro 2149 if [[ ! -z ${cfg_autostart_session} ]]
444 niro 246 then
445 niro 2371 # 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 niro 246 fi
448    
449 niro 236 # fluxbox hotkeys
450 niro 2469 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 niro 236
458 niro 2035 # generate a fluxbox menu
459 niro 2161 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
460 niro 2035 clearconfig
461    
462 niro 236 # fluxbox menu header
463 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
464 niro 291 # now fix it with proper messages :P
465     local ver="$(< /etc/mageversion)"
466 niro 2035 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
467 niro 239 # add a newline (maybe there is no crlf in the header)
468 niro 2035 addconfig
469 niro 239
470 niro 2149 # first generate session files
471     for i in ${all_ses_ids}
472 niro 236 do
473 niro 2149 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
474     generate_ica_session_file \
475     --session "${cfg_sessions_session}" \
476 niro 2161 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
477 niro 2149 --username "${cfg_sessions_username}" \
478     --password "${cfg_sessions_password}" \
479     --domain "${cfg_sessions_domain}" \
480 niro 2435 --server "${cfg_sessions_browseradrs}" \
481     --colordepth "${cfg_graphic_depth}"
482 niro 2149
483     # fluxbox menusession
484 niro 2161 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
485 niro 2149 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 niro 2035 then
501 niro 2149 workdir="--workdir ${cfg_other_menuitems_workdir}"
502 niro 2035 fi
503 niro 2149 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 niro 2161 --param "${cfg_other_menuitems_param}" \
513     --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
514     "${workdir}"
515 niro 2149
516 niro 2161 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
517 niro 236 done
518    
519     # fluxbox menu footer
520 niro 2035 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
521 niro 239 # add a newline (maybe there is no crlf in the footer)
522 niro 2035 addconfig
523 niro 236
524 niro 304 # now it's a good time to generate *all* icons :)
525 niro 2161 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
526 niro 236
527 niro 2149 # fix permissions
528 niro 236 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 niro 2454 chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop
532     chmod 0644 ${ALX_UNPRIV_HOME}/.ideskrc
533 niro 236 }