Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2166 - (show annotations) (download) (as text)
Wed May 18 14:55:02 2011 UTC (12 years, 11 months ago) by niro
File MIME type: application/x-sh
File size: 11709 byte(s)
-fixed some typos
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
127 # very basic getops
128 for i in $*
129 do
130 case $1 in
131 --name|-n) shift; name="$1" ;;
132 --command|-c) shift; command="$1" ;;
133 --icon|-i) shift; icon="$1" ;;
134 --dest|-d) shift; dest="$1" ;;
135 --xres|-x) shift; xres="$1" ;;
136 --yres|-y) shift; yres="$1" ;;
137 --icon-width|-w) shift; iwidth="$1" ;;
138 --icon-height|-h) shift; iheight="$1" ;;
139 --default-icon) shift; deficon="$1" ;;
140 esac
141 shift
142 done
143
144 # some sanity checks:
145
146 # abort if name or command not given
147 [[ -z ${name} ]] && return 1
148 [[ -z ${command} ]] && return 1
149
150 # use some defaults for icon, dest, {x,y}res
151 [[ -z ${xres} ]] && xres=30
152 [[ -z ${yres} ]] && xres=30
153 [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.xtdesktop/${name}.lnk"
154 if [[ -z ${icon} ]] || [ ! -f ${icon} ]
155 then
156 # if no default icon is given use default.png
157 [[ -z ${deficon} ]] && deficon="default.png"
158 icon="${ALX_SESSIONS_ICONS}/${deficon}"
159 fi
160
161 CONFIG="${dest}"
162 clearconfig
163
164 addconfig 'table Icon'
165 addconfig ' Type: Program'
166 addconfig " Caption: ${name}"
167 addconfig " Command: ${command}"
168 addconfig " Icon: ${icon}"
169 addconfig " X: ${xres}"
170 addconfig " Y: ${yres}"
171
172 # add these only if not zero
173 if [[ ! -z ${iwidth} ]] && [[ ! -z ${iheight} ]]
174 then
175 addconfig " IconWidth: ${iwidth}"
176 addconfig " IconHeight: ${iheight}"
177 fi
178
179 addconfig 'end'
180 }
181
182 generate_all_desktop_icons()
183 {
184 local session_list="$1"
185 local other_menuitem_list="$2"
186 local res
187 local xres
188 local yres
189 local x
190 local y
191 local i
192 local name
193 local progsh_path
194
195 # progsh path
196 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
197
198 # get the resolution
199 res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'")
200
201 # split res to x & y
202 xres="${res%x*}"
203 yres="${res#*x}"
204
205 # top left edge of the icon is given in config file
206 # remove a little bit to simulate the bottom-right edge
207 xres="$(( ${xres} - 120 ))"
208 yres="$(( ${yres} - 80 ))"
209
210 # basic config
211 cat ${ALX_SKELETONS}/xtdesktop/xtdeskrc > ${ALX_UNPRIV_HOME}/.xtdeskrc
212
213 # clean desktop icon location
214 [ -d ${ALX_UNPRIV_HOME}/.xtdesktop ] && rm -rf ${ALX_UNPRIV_HOME}/.xtdesktop
215 install -d ${ALX_UNPRIV_HOME}/.xtdesktop
216
217 # default settings
218 declare -i x=30
219 declare -i y=30
220
221 # ica icons
222 for i in ${session_list}
223 do
224 # abort if empty
225 [[ -z ${i} ]] && continue
226
227 # get database information
228 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
229
230 # new line if x > xres
231 if [ ${x} -ge ${xres} ]
232 then
233 x=30
234 y=$((${y} + 80))
235 fi
236
237 # new row if y > yres
238 if [ ${y} -ge ${yres} ]
239 then
240 x=$((${x} + 120))
241 y=30
242
243 # re-check x
244 [ ${x} -ge ${xres} ] && x=30
245 fi
246
247 generate_icon \
248 --name "${cfg_sessions_session}" \
249 --command "nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})" \
250 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_sessions_session}).png" \
251 --dest "${ALX_UNPRIV_HOME}/.xtdesktop/$(fix_whitespaces ${cfg_sessions_session}).lnk" \
252 --xres "${x}" \
253 --yres "${y}"
254
255 y=$((${y} + 80))
256 done
257
258 for i in ${other_menuitem_list}
259 do
260 # abort if empty
261 [[ -z ${i} ]] && continue
262
263 # get database information
264 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
265
266 # new line if x > xres
267 if [ ${x} -ge ${xres} ]
268 then
269 x=30
270 y=$((${y} + 80))
271 fi
272
273 # new row if y > yres
274 if [ ${y} -ge ${yres} ]
275 then
276 x=$((${x} + 120))
277 y=30
278
279 # re-check x
280 [ ${x} -ge ${xres} ] && x=30
281 fi
282
283 generate_icon \
284 --name "${cfg_other_menuitems_name}" \
285 --command "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_exec})" \
286 --icon "${ALX_SESSIONS_ICONS}/$(fix_whitespaces ${cfg_other_menuitems_name}).png" \
287 --dest "${ALX_UNPRIV_HOME}/.xtdesktop/$(fix_whitespaces ${cfg_other_menuitems_name}).lnk" \
288 --xres "${x}" \
289 --yres "${y}" \
290 --default-icon "default_item.png"
291
292 y=$((${y} + 80))
293 done
294
295 # last but not least gen a icon with some sys informations
296 local sysinfo
297 local hostname
298 local osversion
299
300 osversion="$(< /etc/mageversion)"
301 hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'")
302 sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)"
303
304 # now get the right position:
305 # restore orig values of xres
306 xres="$(( ${xres} + 120 ))"
307 # default y pos (full yres -22 = cur yres + 58 !)
308 yres="$(( ${yres} + 58 ))"
309 # middle of the screen
310 # (no txt - length required, xtdesk manage that itself)
311 xres="$(( ${xres} / 2))"
312
313 generate_icon \
314 --name "${sysinfo}" \
315 --command "exit 0" \
316 --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \
317 --dest "${ALX_UNPRIV_HOME}/.xtdesktop/sysinfo.lnk" \
318 --xres "${xres}" \
319 --yres "${yres}" \
320 --icon-width "1" \
321 --icon-height "1"
322 }
323
324 config_sessions()
325 {
326 local i
327 local all_ses_ids
328 local all_other_ids
329 local CONFIG
330 local screensaver_passwd_cmd
331
332 # get all session ids from database
333 all_ses_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'")
334 # get all other_menutiem ids from database
335 all_other_ids=$(mysqldo "select id from cfg_other_menuitems where serial='${ALX_SERIAL}'")
336
337 # get screensaver settings
338 evaluate_table cfg_screensaver
339 # get autostart settings
340 evaluate_table cfg_autostart
341
342 # now setup fluxbox for user station
343
344 # create a fresh fluxbox directory
345 [ -d ${ALX_UNPRIV_HOME}/.fluxbox ] && rm -rf ${ALX_UNPRIV_HOME}/.fluxbox
346 install -d ${ALX_UNPRIV_HOME}/.fluxbox
347
348 # now generate fluxbox config files
349
350 # fluxbox main config
351 cat ${ALX_SKELETONS}/fluxbox/init > ${ALX_UNPRIV_HOME}/.fluxbox/init
352
353 # fluxbox autostart
354 cat ${ALX_SKELETONS}/fluxbox/apps > ${ALX_UNPRIV_HOME}/.fluxbox/apps
355
356 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/apps"
357 # add screensaver
358 if [[ ! -z ${cfg_screensaver_screensaver} ]] && [[ ! -z ${cfg_screensaver_screensaver_timeout} ]]
359 then
360 if [[ -z ${cfg_screensaver_password} ]] || [[ ${cfg_screensaver_password} = NULL ]]
361 then
362 screensaver_passwd_cmd="-nolock"
363 else
364 screensaver_passwd_cmd="-cpasswd $(cryptpw -m des ${cfg_screensaver_password})"
365 fi
366
367 addconfig "[startup] {nohup xautolock -time ${cfg_screensaver_timeout} -locker 'xlock -mode ${cfg_screensaver_screensaver} ${screensaver_passwd_cmd}' > /dev/null &}"
368 fi
369
370 # add autostart session
371 if [[ ! -z ${cfg_autostart_session} ]]
372 then
373 addconfig "[startup] {nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
374 fi
375
376 # fluxbox hotkeys
377 cat ${ALX_SKELETONS}/fluxbox/keys > ${ALX_UNPRIV_HOME}/.fluxbox/keys
378
379 # generate a fluxbox menu
380 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
381 clearconfig
382
383 # fluxbox menu header
384 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
385 # now fix it with proper messages :P
386 local ver="$(< /etc/mageversion)"
387 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
388 # add a newline (maybe there is no crlf in the header)
389 addconfig
390
391 # first generate session files
392 for i in ${all_ses_ids}
393 do
394 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
395 generate_ica_session_file \
396 --session "${cfg_sessions_session}" \
397 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
398 --username "${cfg_sessions_username}" \
399 --password "${cfg_sessions_password}" \
400 --domain "${cfg_sessions_domain}" \
401 --server "${cfg_sessions_browseradrs}"
402
403 # fluxbox menusession
404 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
405 done
406
407 # delete all progs
408 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
409 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
410 install -d ${progsh_path}
411
412 # add other menuitems
413 for i in ${all_other_ids}
414 do
415 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
416
417 # now echo config line for fluxbox-menu
418 # make it "configureable" :p
419 if [[ -n ${cfg_other_menuitems_workdir} ]]
420 then
421 workdir="--workdir ${cfg_other_menuitems_workdir}"
422 fi
423 if [[ -n ${cfg_other_menuitems_icon} ]]
424 then
425 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
426 fi
427
428 # gen prog startup wrapper
429 generate_program_sh \
430 --name "${cfg_other_menuitems_name}" \
431 --exec "${cfg_other_menuitems_exec}" \
432 --param "${cfg_other_menuitems_param}" \
433 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
434 "${workdir}"
435
436 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
437 done
438
439 # fluxbox menu footer
440 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
441 # add a newline (maybe there is no crlf in the footer)
442 addconfig
443
444 # now it's a good time to generate *all* icons :)
445 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
446
447 # fix permissions
448 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
449 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
450 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
451 chmod 0755 ${ALX_UNPRIV_HOME}/.xtdesktop
452 chmod 0644 ${ALX_UNPRIV_HOME}/.xtdeskrc
453 }