Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2371 - (show annotations) (download) (as text)
Tue Jun 14 10:42:58 2011 UTC (12 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 11818 byte(s)
-sleep one second to wait until busybox is fully initialized and the screen is really centered
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 # sleep one second to wait until busybox is fully initialized and the screen is really centered
374 addconfig "[startup] {sleep 1 && nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_autostart_session}) &}"
375 fi
376
377 # fluxbox hotkeys
378 cat ${ALX_SKELETONS}/fluxbox/keys > ${ALX_UNPRIV_HOME}/.fluxbox/keys
379
380 # generate a fluxbox menu
381 CONFIG="${ALX_UNPRIV_HOME}/.fluxbox/menu"
382 clearconfig
383
384 # fluxbox menu header
385 cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
386 # now fix it with proper messages :P
387 local ver="$(< /etc/mageversion)"
388 sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu
389 # add a newline (maybe there is no crlf in the header)
390 addconfig
391
392 # first generate session files
393 for i in ${all_ses_ids}
394 do
395 evaluate_table cfg_sessions "where serial='${ALX_SERIAL}' and id='${i}'"
396 generate_ica_session_file \
397 --session "${cfg_sessions_session}" \
398 --filename "$(fix_whitespaces ${cfg_sessions_filename})" \
399 --username "${cfg_sessions_username}" \
400 --password "${cfg_sessions_password}" \
401 --domain "${cfg_sessions_domain}" \
402 --server "${cfg_sessions_browseradrs}"
403
404 # fluxbox menusession
405 addconfig "[exec] (${cfg_sessions_session}) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/$(fix_whitespaces ${cfg_sessions_filename})}"
406 done
407
408 # delete all progs
409 progsh_path="${ALX_UNPRIV_HOME}/.alxprogs"
410 [ -d ${progsh_path} ] && rm -rf ${progsh_path}
411 install -d ${progsh_path}
412
413 # add other menuitems
414 for i in ${all_other_ids}
415 do
416 evaluate_table cfg_other_menuitems "where serial='${ALX_SERIAL}' and id='${i}'"
417
418 # now echo config line for fluxbox-menu
419 # make it "configureable" :p
420 if [[ -n ${cfg_other_menuitems_workdir} ]]
421 then
422 workdir="--workdir ${cfg_other_menuitems_workdir}"
423 fi
424 if [[ -n ${cfg_other_menuitems_icon} ]]
425 then
426 cfg_other_menuitems_icon="<${cfg_other_menuitems_icon}>"
427 fi
428
429 # gen prog startup wrapper
430 generate_program_sh \
431 --name "${cfg_other_menuitems_name}" \
432 --exec "${cfg_other_menuitems_exec}" \
433 --param "${cfg_other_menuitems_param}" \
434 --dest "${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})" \
435 "${workdir}"
436
437 addconfig "[exec] (${cfg_other_menuitems_name}) {${progsh_path}/$(fix_whitespaces ${cfg_other_menuitems_name})} ${cfg_other_menuitems_icon}"
438 done
439
440 # fluxbox menu footer
441 cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu
442 # add a newline (maybe there is no crlf in the footer)
443 addconfig
444
445 # now it's a good time to generate *all* icons :)
446 generate_all_desktop_icons "${all_ses_ids}" "${all_other_ids}"
447
448 # fix permissions
449 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}
450 chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox
451 chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox
452 chmod 0755 ${ALX_UNPRIV_HOME}/.xtdesktop
453 chmod 0644 ${ALX_UNPRIV_HOME}/.xtdeskrc
454 }