--- alx-src/trunk/alxconfig-ng/functions/config_sessions.sh 2005/04/13 16:09:53 246 +++ alx-src/branches/alxconf-060/functions/config_sessions.sh 2011/05/11 09:11:02 2035 @@ -1,19 +1,17 @@ -# $Header: /home/cvsd/alx-cvs/alx-src/alxconfig-ng/functions/config_sessions.sh,v 1.5 2005-04-13 16:09:53 niro Exp $ +# $Id$ # configures ica-sessions on the host via mysql db settings get_sessions_settings() { local x i all count - #all arrays: + # all arrays: # -> session1 session2 ... sessionN - #get settings from database - all=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select filename from cfg_sessions where serial='${ALX_SERIAL}'") - #"select session from cfg_sessions where serial='${ALX_SERIAL}'") + # get settings from database + all=$(mysqldo "select filename from cfg_sessions where serial='${ALX_SERIAL}'") - #split'em up and put in an array (only if $all not zero) + # split'em up and put in an array (only if $all not zero) declare -i i=0 if [ -n "${all}" ] then @@ -27,16 +25,30 @@ count=0 fi + # get settings from database + ALX_PROGRAMS=$(mysqldo "select name from cfg_other_menuitems where serial='${ALX_SERIAL}'") + export ALX_SESSIONS + export ALX_PROGRAMS } get_autostart_settings() { - #get settings from database - ALX_AUTOSTART=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select session from cfg_autostart where serial='${ALX_SERIAL}'") + # get settings from database + ALX_AUTOSTART=$(mysqldo "select session from cfg_autostart where serial='${ALX_SERIAL}'") - export ALX_SESSIONS + export ALX_AUTOSTART +} + +get_screensaver_settings() +{ + ALX_SCRN_SAVER=$(mysqldo "select screensaver from cfg_screensaver where serial='${ALX_SERIAL}'") + ALX_SCRN_TIMEOUT=$(mysqldo "select timeout from cfg_screensaver where serial='${ALX_SERIAL}'") + ALX_SCRN_PASSWD=$(mysqldo "select password from cfg_screensaver where serial='${ALX_SERIAL}'") + + export ALX_SCRN_SAVER + export ALX_SCRN_TIMEOUT + export ALX_SCRN_PASSWD } generate_ica_session_files() @@ -44,7 +56,7 @@ local all_ids local i local x - local k + local browser_address_num local server local ses_session local ses_filename @@ -52,67 +64,369 @@ local ses_domain local ses_password local ses_browseradrs + local ses_colors + local CONFIG - #get settings from database - all_ids=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select id from cfg_sessions where serial='${ALX_SERIAL}'") + # get settings from database + all_ids=$(mysqldo "select id from cfg_sessions where serial='${ALX_SERIAL}'") - declare -i x=0 for i in ${all_ids} do # get settings - ses_session[${x}]=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select session from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") - - ses_filename[${x}]=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select filename from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") - - ses_username[${x}]=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select username from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") - - ses_domain[${x}]=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select domain from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") - - ses_password[${x}]=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select password from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") - - ses_browseradrs[${x}]=$(mysql_command ${SQL_USER} ${SQL_PASS} ${SQL_HOST} ${SQL_DB} \ - "select browseradrs from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + ses_session=$(mysqldo "select session from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + ses_filename=$(mysqldo "select filename from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + ses_username=$(mysqldo "select username from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + ses_domain=$(mysqldo "select domain from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + ses_password=$(mysqldo "select password from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + ses_browseradrs=$(mysqldo "select browseradrs from cfg_sessions where serial='${ALX_SERIAL}' and id='${i}'") + + # get the right colors + ses_colors=$(mysqldo "select depth from cfg_graphic where serial='${ALX_SERIAL}'") + # convert to ica session file values + case ${ses_colors} in + 24) ses_colors="8";; + 16) ses_colors="4";; + 8) ses_colors="2";; + *) ses_colors="2";; + esac # write session files - echo '[WFClient]' > ${ALX_ICA_SESSIONS}/${ses_filename} - echo 'Version=2' >> ${ALX_ICA_SESSIONS}/${ses_filename} + CONFIG=${ALX_ICA_SESSIONS}/${ses_filename} + clearconfig + + addconfig '[WFClient]' + addconfig 'Version=2' OLD_IFS="$IFS" IFS=";" - declare -i k=0 - for server in ${ses_browseradrs[${x}]} + declare -i x=0 + for server in ${ses_browseradrs} do - (( k++ )) - echo "TcpBrowserAddress${k}=${server}" >> ${ALX_ICA_SESSIONS}/${ses_filename} + (( x++ )) + browser_address_num="${x}" + # support newer ica-clients: + # the first address must be named TcpBrowserAddress, but not TcpBrowserAddress1 !! + [[ ${x} -eq 1 ]] && browser_address_num="" + addconfig "TcpBrowserAddress${browser_address_num}=${server}" done IFS="${OLD_IFS}" - unset k + unset x unset OLD_IFS - - echo 'ScreenPercent=0' >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo '[ApplicationServers]' >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo "${ses_session[${x}]}=" >> ${ALX_ICA_SESSIONS}/${ses_filename} - - echo "[${ses_session[${x}]}]" >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo "Address=${ses_session[${x}]}" >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo "InitialProgram=#${ses_session[${x}]}" >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo 'DesiredColor=3' >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo 'TransportDriver=TCP/IP' >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo 'WinStationDriver=ICA 3.0' >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo "ClearPassword=${ses_password[${x}]}" >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo "Username=${ses_username[${x}]}" >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo "Domain=${ses_domain[${x}]}" >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo 'UseFullScreen=Yes' >> ${ALX_ICA_SESSIONS}/${ses_filename} - echo 'NoWindowManager=True' >> ${ALX_ICA_SESSIONS}/${ses_filename} + addconfig 'ScreenPercent=0' + addconfig '[ApplicationServers]' + addconfig "${ses_session}=" + addconfig "[${ses_session}]" + addconfig "Address=${ses_session}" + addconfig "InitialProgram=#${ses_session}" + addconfig "DesiredColor=${ses_colors}" + addconfig 'TransportDriver=TCP/IP' + addconfig 'WinStationDriver=ICA 3.0' + addconfig "ClearPassword=${ses_password}" + addconfig "Username=${ses_username}" + addconfig "Domain=${ses_domain}" + addconfig 'UseFullScreen=Yes' + addconfig 'NoWindowManager=True' done +} - (( x++ )) +# generates a sh file to start programs +generate_program_sh() +{ + local dest + local name + local exec + local workdir + local CONFIG + + # very basic getops + for i in $* + do + case $1 in + --name|-n) shift; name="$1" ;; + --exec|-x) shift; exec="$1" ;; + --dest|-d) shift; dest="$1" ;; + --workdir|-w) shift; workdir="$1" ;; + esac + shift + done + + # abort if name, dest or exec not given + [ -z "${name}" ] && return 1 + [ -z "${exec}" ] && return 1 + [ -z "${dest}" ] && return 1 + + CONFIG=${dest} + addconfig "#!/bin/sh" + [ -n "${workdir}" ] && addconfig "cd ${workdir}" + addconfig "exec ${exec}" + + chmod 0755 ${dest} +} + +get_other_menuitems() +{ + local x i progsh_path name exec icon workdir + + # all arrays: + # -> session1 session2 ... sessionN + + # get settings from database -> now stored in ALX_PROGRAMS + + # abort if empty + [ -z "${ALX_PROGRAMS}" ] && return 0 + + progsh_path=${ALX_UNPRIV_HOME}/.alxprogs + [ -d ${progsh_path} ] && rm -rf ${progsh_path} + install -d ${progsh_path} + + # gen menu items + for x in ${ALX_PROGRAMS} + do + # to be sure + unset name + unset exec + unset workdir + unset icon + + name=$(mysqldo "select name from cfg_other_menuitems where serial='${ALX_SERIAL}' and name='${x}'") + exec=$(mysqldo "select exec from cfg_other_menuitems where serial='${ALX_SERIAL}' and name='${x}'") + workdir=$(mysqldo "select workdir from cfg_other_menuitems where serial='${ALX_SERIAL}' and name='${x}'") + icon=$(mysqldo "select icon from cfg_other_menuitems where serial='${ALX_SERIAL}' and name='${x}'") + + # now echo config line for fluxbox-menu + # make it "configureable" :P + [ -n "${workdir}" ] && workdir="--workdir ${workdir}" + [ -n "${icon}" ] && icon="<${icon}>" + + # gen prog startup wrapper + generate_program_sh \ + --name "${name}" \ + --exec "${exec}" \ + --dest "${progsh_path}/${name}" \ + "${workdir}" + + echo "[exec] (${name}) {${progsh_path}/${name}} ${icon}" + done +} + +# helper functions for generate all desktop icons +generate_icon() +{ + local name + local icon + local command + local dest + local yres + local xres + local iwidth + local iheight + local deficon + local CONFIG + + # very basic getops + for i in $* + do + case $1 in + --name|-n) shift; name="$1" ;; + --command|-c) shift; command="$1" ;; + --icon|-i) shift; icon="$1" ;; + --dest|-d) shift; dest="$1" ;; + --xres|-x) shift; xres="$1" ;; + --yres|-y) shift; yres="$1" ;; + --icon-width|-w) shift; iwidth="$1" ;; + --icon-height|-h) shift; iheight="$1" ;; + --default-icon) shift; deficon="$1" ;; + esac + shift + done + + # some sanity checks : + + # abort if name or command not given + [[ -z ${name} ]] && return 1 + [[ -z ${command} ]] && return 1 + + # use some defaults for icon, dest, {x,y}res + [[ -z ${xres} ]] && xres=30 + [[ -z ${yres} ]] && xres=30 + [[ -z ${dest} ]] && dest="${ALX_UNPRIV_HOME}/.xtdesktop/${name}.lnk" + if [[ -z ${icon} ]] || [ ! -f ${icon} ] + then + # if no default icon is given use default.png + [[ -z ${deficon} ]] && deficon="default.png" + icon="${ALX_SESSIONS_ICONS}/${deficon}" + fi + + CONFIG=${dest} + clearconfig + + addconfig 'table Icon' + addconfig ' Type: Program' + addconfig " Caption: ${name}" + addconfig " Command: ${command}" + addconfig " Icon: ${icon}" + addconfig " X: ${xres}" + addconfig " Y: ${yres}" + + # add these only if not zero + if [[ ! -z ${iwidth} ]] && [[ ! -z ${iheight} ]] + then + addconfig " IconWidth: ${iwidth}" + addconfig " IconHeight: ${iheight}" + fi + + addconfig 'end' +} + +generate_all_desktop_icons() +{ + local res + local xres + local yres + local icon_list + local x + local y + local item + local basename_item + local progsh_path + + # get the resolution + res=$(mysqldo "select resolution from cfg_graphic where serial='${ALX_SERIAL}'") + + # split res to x & y + xres="$(echo ${res} | cut -dx -f1)" + yres="$(echo ${res} | cut -dx -f2)" + + # top left edge of the icon is given in config file + # remove a little bit to simulate the bottom-right edge + xres="$(( ${xres} - 120 ))" + yres="$(( ${yres} - 80 ))" + + # basic config + cat ${ALX_SKELETONS}/xtdesktop/xtdeskrc > ${ALX_UNPRIV_HOME}/.xtdeskrc + + # clean desktop icon location + [ -d ${ALX_UNPRIV_HOME}/.xtdesktop ] && rm -rf ${ALX_UNPRIV_HOME}/.xtdesktop + install -d ${ALX_UNPRIV_HOME}/.xtdesktop + + + # default settings + declare -i x=30 + declare -i y=30 + + # first all ica sessions + local count=${#ALX_SESSIONS[*]} + for (( i=0; i < count; i++ )) + do + # filenames ! + icon_list="${icon_list} ${ALX_SESSIONS[${i}]}" + done + + for item in ${icon_list} + do + # abort if empty + [[ -z ${item} ]] && continue + + # new line if x > xres + if [ ${x} -ge ${xres} ] + then + x=30 + y=$((${y} + 80)) + fi + + # new row if y > yres + if [ ${y} -ge ${yres} ] + then + x=$((${x} + 120)) + y=30 + + # re-check x + [ ${x} -ge ${xres} ] && x=30 + fi + + # ica icons + # get basename (.ica must be suffix) + basename_item="$(basename ${item} .ica)" + generate_icon \ + --name "${basename_item}" \ + --command "nice -n 19 wfica ${ALX_ICA_SESSIONS}/${item}" \ + --icon "${ALX_SESSIONS_ICONS}/${basename_item}.png" \ + --dest "${ALX_UNPRIV_HOME}/.xtdesktop/${basename_item}.lnk" \ + --xres "${x}" \ + --yres "${y}" + + y=$((${y} + 80)) + done + + + # generate program icons + icon_list="${ALX_PROGRAMS}" + + progsh_path=${ALX_UNPRIV_HOME}/.alxprogs + + for item in ${icon_list} + do + # abort if empty + [[ -z ${item} ]] && continue + + # new line if x > xres + if [ ${x} -ge ${xres} ] + then + x=30 + y=$((${y} + 80)) + fi + + # new row if y > yres + if [ ${y} -ge ${yres} ] + then + x=$((${x} + 120)) + y=30 + + # re-check x + [ ${x} -ge ${xres} ] && x=30 + fi + + generate_icon \ + --name "${item}" \ + --command "${progsh_path}/${item}" \ + --icon "${ALX_SESSIONS_ICONS}/${item}.png" \ + --dest "${ALX_UNPRIV_HOME}/.xtdesktop/${item}.lnk" \ + --xres "${x}" \ + --yres "${y}" \ + --default-icon "default_item.png" + + y=$((${y} + 80)) + done + + + + # last but not least gen a icon with some sys informations + local sysinfo + local hostname + local osversion + + osversion="$(< /etc/mageversion)" + hostname=$(mysqldo "select hostname from cfg_network where serial='${ALX_SERIAL}'") + sysinfo="Hostname: ${hostname} Serial: #${ALX_SERIAL} OS: alx-${osversion} Kernel: $(uname -r)" + + # now get the right position: + # restore orig values of xres + xres="$(( ${xres} + 120 ))" + # default y pos (full yres -22 = cur yres + 58 !) + yres="$(( ${yres} + 58 ))" + # middle of the screen + # (no txt - length required, xtdesk manage that itself) + xres="$(( ${xres} / 2))" + + generate_icon \ + --name "${sysinfo}" \ + --command "exit 0" \ + --icon "${ALX_SESSIONS_ICONS}/sysinfo.png" \ + --dest "${ALX_UNPRIV_HOME}/.xtdesktop/sysinfo.lnk" \ + --xres "${xres}" \ + --yres "${yres}" \ + --icon-width "1" \ + --icon-height "1" } config_sessions() @@ -120,21 +434,15 @@ # generate ica session files generate_ica_session_files - #first of all get the vars + # first of all get the vars get_sessions_settings get_autostart_settings + get_screensaver_settings local count=${#ALX_SESSIONS[*]} local icon - - # DEBUG -# declare -i i=0 -# echo count=${count} -# echo "Number of new sessions: ${count}" -# for ((i=0; i < count; i++)) -# do -# echo "${i} - ${ALX_SESSIONS[${i}]}" -# done + local i + local CONFIG # now setup fluxbox for user station @@ -152,73 +460,77 @@ cat ${ALX_SKELETONS}/fluxbox/apps \ > ${ALX_UNPRIV_HOME}/.fluxbox/apps + CONFIG=${ALX_UNPRIV_HOME}/.fluxbox/apps + # add screensaver + if [[ ! -z ${ALX_SCRN_SAVER} ]] && [[ ! -z ${ALX_SCRN_TIMEOUT} ]] + then + local ALX_PASSWD_CMD + + if [[ -z ${ALX_SCRN_PASSWD} ]] || [[ ${ALX_SCRN_PASSWD} = NULL ]] + then + ALX_PASSWD_CMD="-nolock" + else + ALX_PASSWD_CMD="-cpasswd $(cryptpw -m des ${ALX_SCRN_PASSWD})" + fi + + addconfig "[startup] {nohup xautolock -time ${ALX_SCRN_TIMEOUT} -locker 'xlock -mode ${ALX_SCRN_SAVER} ${ALX_PASSWD_CMD}' > /dev/null &}" + fi + # add autostart session - if [[ ${ALX_AUTOSTART} != "" ]] + if [[ ! -z ${ALX_AUTOSTART} ]] then - echo "[startup] {wfica ${ALX_ICA_SESSIONS}/${ALX_AUTOSTART}}" \ - >> ${ALX_UNPRIV_HOME}/.fluxbox/apps + addconfig "[startup] {nohup nice -n 19 wfica ${ALX_ICA_SESSIONS}/${ALX_AUTOSTART} &}" fi # fluxbox hotkeys - cat ${ALX_SKELETONS}/fluxbox/apps \ - > ${ALX_UNPRIV_HOME}/.fluxbox/keys + cat ${ALX_SKELETONS}/fluxbox/keys > ${ALX_UNPRIV_HOME}/.fluxbox/keys + + # generate a fluxbox menu + CONFIG=${ALX_UNPRIV_HOME}/.fluxbox/menu + clearconfig # fluxbox menu header - cat ${ALX_SKELETONS}/fluxbox/menu.header \ - > ${ALX_UNPRIV_HOME}/.fluxbox/menu + cat ${ALX_SKELETONS}/fluxbox/menu.header >> ${ALX_UNPRIV_HOME}/.fluxbox/menu + + # now fix it with proper messages :P + local ver="$(< /etc/mageversion)" + sed -i "s:@CHANGEME@:alx-${ver} #${ALX_SERIAL}:g" ${ALX_UNPRIV_HOME}/.fluxbox/menu # add a newline (maybe there is no crlf in the header) - echo >> ${ALX_UNPRIV_HOME}/.fluxbox/menu + addconfig # fluxbox menu sessions for (( i=0; i < count; i++ )) do - echo "[exec] ($(basename ${ALX_SESSIONS[${i}]} .ica)) {wfica ${ALX_ICA_SESSIONS}/${ALX_SESSIONS[${i}]}}" \ - >> ${ALX_UNPRIV_HOME}/.fluxbox/menu + if [[ ! -z ${ALX_SESSIONS[${i}]} ]] + then + addconfig "[exec] ($(basename ${ALX_SESSIONS[${i}]} .ica)) {nice -n 19 wfica ${ALX_ICA_SESSIONS}/${ALX_SESSIONS[${i}]}}" + fi done + # add other menuitems + addconfig $(get_other_menuitems) + # fluxbox menu footer - cat ${ALX_SKELETONS}/fluxbox/menu.footer \ - >> ${ALX_UNPRIV_HOME}/.fluxbox/menu + cat ${ALX_SKELETONS}/fluxbox/menu.footer >> ${ALX_UNPRIV_HOME}/.fluxbox/menu # add a newline (maybe there is no crlf in the footer) - echo >> ${ALX_UNPRIV_HOME}/.fluxbox/menu + addconfig - # now we generate the desktop icons - cat ${ALX_SKELETONS}/idesk/ideskrc \ - > ${ALX_UNPRIV_HOME}/.ideskrc - - # whipe out old stuff and install a fresh directory - [ -d ${ALX_UNPRIV_HOME}/.idesktop ] && rm -rf ${ALX_UNPRIV_HOME}/.idesktop - install -d ${ALX_UNPRIV_HOME}/.idesktop - - local name - for (( i=0; i < count; i++ )) - do - name="$(basename ${ALX_SESSIONS[${i}]} .ica)" - - if [ -f ${ALX_SESSIONS_ICONS}/${name}.png ] - then - icon="${ALX_SESSIONS_ICONS}/${name}.png" - else - icon="${ALX_SESSIONS_ICONS}/default.png" - fi - - echo "table Icon -Caption: ${name} -Command: wfica ${ALX_ICA_SESSIONS}/${name}.ica -Icon: ${icon} -end" > ${ALX_UNPRIV_HOME}/.idesktop/${name}.lnk - done + # now it's a good time to generate *all* icons :) + generate_all_desktop_icons # set correct permissions chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME} chown ${ALX_UNPRIV_USER}:${ALX_UNPRIV_GROUP} ${ALX_UNPRIV_HOME}/.fluxbox chmod 0755 ${ALX_UNPRIV_HOME}/.fluxbox - chmod 0755 ${ALX_UNPRIV_HOME}/.idesktop - chmod 0644 ${ALX_UNPRIV_HOME}/.ideskrc - + chmod 0755 ${ALX_UNPRIV_HOME}/.xtdesktop + chmod 0644 ${ALX_UNPRIV_HOME}/.xtdeskrc # unset vars unset ALX_SESSIONS + unset ALX_PROGRAMS + unset ALX_SCRN_SAVER + unset ALX_SCRN_TIMEOUT + unset ALX_SCRN_PASSWD }