Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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