Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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