El mié, 19-09-2012 a las 15:10 +0300, Alkis Georgopoulos escribió:

> Στις 19/09/2012 02:50 μμ, ο/η Juan Antonio Martinez έγραψε:
> > Not sure if this solution work for us:
> Yup, with the additional info you gave it probably doesn't suit you out
> of the box, so you'd need to patch the ltsp scripts a bit.
> > - We use pam_mount to handle not only user home, but other user/group
> > dependent directories (some of then my mean of cifs-mount)
> E.g. you can create a script to conditionally set LOCALAPPS_EXTRA_MOUNTS
> based on the user/group that logs in.
> And another script for nfs /home/user mounting upon login.


OK: I've modified X01-localapps by mean of remove every ssh calls and
substitute for their
local counterparts.

As ldap is configured in fat client, no need to ask server to retrieve
user data. then no ssh storm
in the server (that in turn, needs to ask ldap servers on every ssh
request)

Also when gnome-session starts, pam_mount is invoked properly. no more
need for sshfs


> > - There is a collateral problem in server: sshd limits the number of
> > simultaneous incoming connections by mean of "MaxStartUps" configuration
> > variable. When 30+ students try to simultaneous login into fatclients,
> > ltsp server refuses more ssh connection for authentication
> You can easily increase that from sshd_config.


As seen before, now it's not a problem anymore

Attached comes my modified (chroot)/usr/share/ldm/rc.d/X01-localapps.
Expect to be usefull for you.
Perhaps you could include a "ldap-aware" version for ldm fat client ( or
even better: "pam-aware"  :-)

Juan Antonio

#
# The following is a script to set up local apps support on LTSP through LDM
#

# This hook modifies /etc/group and /etc/passwd directly with user/group
# information gathered from the server.

# This will enable us to easily bypass the need for setting up local user
# authentication, and instead leverage the authentication already set up on
# the server.

if boolean_is_true "$LOCAL_APPS"; then

    # Set up local uids/gids

    LOCALAPPS_CACHE=/var/cache/ltsp-localapps
    export LOCALAPPS_CACHE
    mkdir -p ${LOCALAPPS_CACHE} 2>/dev/null

    # Copy /etc/passwd and /etc/group to cache if it does not exist (should 
only happen on first login)
    for i in passwd group; do
        if [ ! -e "${LOCALAPPS_CACHE}/${i}" ]; then
            cp /etc/${i} "${LOCALAPPS_CACHE}/${i}"
        else
            cp "${LOCALAPPS_CACHE}/${i}" /etc/${i}
        fi
    done

    # Get logged in username if not set
    # [ -z "$LDM_USERNAME" ] && LDM_USERNAME=$(ssh -S ${LDM_SOCKET} 
${LDM_SERVER} 'echo ${USER}')
    [ -z "$LDM_USERNAME" ] && LDM_USERNAME=$('echo ${USER}')

    # Get passwd info *just* for that user
    # ssh -S ${LDM_SOCKET} ${LDM_SERVER} "/usr/bin/getent passwd 
${LDM_USERNAME}" | sed -e "s/${LDM_USERNAME}/${LDM_USERNAME}/i" >>/etc/passwd
    /usr/bin/getent passwd ${LDM_USERNAME} | sed -e 
"s/${LDM_USERNAME}/${LDM_USERNAME}/i" >>/etc/passwd

    # Get all group info and copy to COMBINED_GROUP
    COMBINED_GROUP=${LOCALAPPS_CACHE}/group.combined
    cp /etc/group ${COMBINED_GROUP}
    # ssh -S ${LDM_SOCKET} ${LDM_SERVER} "/usr/bin/getent group" >> 
${COMBINED_GROUP}
    /usr/bin/getent group >> ${COMBINED_GROUP}

    # Get the system groups that the user belongs to, so we can add him back in
    # myGroups=$(ssh -S ${LDM_SOCKET} ${LDM_SERVER} /usr/bin/getent group|egrep 
"[,:]${LDM_USERNAME}(,|$)"|cut -d: -f1| tr '\n' ',' | sed -e 's/,$//g')
    myGroups=$(/usr/bin/getent group|egrep "[,:]${LDM_USERNAME}(,|$)"|cut -d: 
-f1| tr '\n' ',' | sed -e 's/,$//g')

    # (/usr/bin/id is only needed because getent evidently does not return 
groups
    # added by pam_group (bug in pam_group?)

    # myGroups1=$(ssh -S ${LDM_SOCKET} ${LDM_SERVER} LANG=C LANGUAGE=C 
/usr/bin/id | sed -e 's/^.*groups=//' -e 's/) .*$/)/'|cut -d= -f2|sed -e 
's/[0-9]*(//g' -e 's/)//g')
    myGroups1=$(LANG=C LANGUAGE=C /usr/bin/id | sed -e 's/^.*groups=//' -e 's/) 
.*$/)/'|cut -d= -f2|sed -e 's/[0-9]*(//g' -e 's/)//g')

    # concatenate groups from different sources, stripping off prefixed and
    # trailing commas
    myGroups=$(echo ${myGroups},${myGroups1} | sed -e 's/^,//g' -e 's/,$//g')

    # Get the user's groups specifically (in case they weren't returned by 
"getent group")
    myGroups_quoted=$(echo $myGroups | sed -e "s/^/\\\'/" -e "s/$/\\\'/" -e 
"s/,/\\\' \\\'/g")
    # ssh -S ${LDM_SOCKET} ${LDM_SERVER} LANG=C eval getent group 
${myGroups_quoted} >> ${COMBINED_GROUP}
    LANG=C eval getent group ${myGroups_quoted} >> ${COMBINED_GROUP}
    unset myGroups_quoted

    # Now, some groups may have different gids on the server than the client 
chroot
    # So, let's prune out all the dups
    TMPGROUP="${LOCALAPPS_CACHE}/tmpgroup"
    [ -f "${TMPGROUP}" ] && rm ${TMPGROUP}
    gnames=""
    gids=""
    # those 2 variables are there because if group is rejected because of the 
gid we need to create this group.
    dgnames=""
    ngids=""

    oldifs="${IFS-not set}"
    IFS=":"
    while read gname gpass gid gusers; do
        match=
        case $gnames in
            *:"$gname":*|*:"$gname") 
                # group name present in the list of groups already processed.
                match=1
                case $gusers in
                    
"$LDM_USERNAME"|*,"$LDM_USERNAME",*|*,"$LDM_USERNAME"|"$LDM_USERNAME",*) 
                        dgnames="$dgnames $gname,"
                        ;;
                esac
                ;;
        esac
        case $gids in
            *:"$gid":*|*:"$gid") 
                # gid present in the list of gids already processed.
                match=1
                case $gusers in
                    
"$LDM_USERNAME"|*,"$LDM_USERNAME",*|*,"$LDM_USERNAME"|"$LDM_USERNAME",*) 
                        ngids="$ngids $gname,"
                        ;;
                esac
                ;;
        esac
        if [ -z "$match" ]; then
            echo "$gname:$gpass:$gid:$gusers" >>${TMPGROUP}
            gnames="$gnames:$gname"
            gids="$gids:$gid"
        fi
    done < ${COMBINED_GROUP}
    test "$oldifs" = "not set" && unset IFS || IFS="$oldifs"
    # cleanup
    dgnames=$(echo ${dgnames} | tr ',' '\n' | sort -u | tr '\n' ',' | sed 
's/,$//')
    ngids=$(echo ${ngids} | tr ',' '\n' | sort -u | tr '\n' ',' | sed 's/,$//')
    tocreate=""
    oldifs="${IFS-not set}"
    IFS=,
    for e in $ngids; do
        match=
        for f in $dgnames; do
            if [ "$e" = "$f" ]; then
                match=1
            fi
        done
        if [ -z "$match" ]; then
            tocreate="$tocreate $e,"
        fi
    done
    tocreate=$(echo ${tocreate} | tr ',' '\n' | sort -u | tr '\n' ',' | sed 
's/,$//' | sed 's/^[[:blank:]]*//g')
    test "$oldifs" = "not set" && unset IFS || IFS="$oldifs"

    cp ${TMPGROUP} /etc/group
    chmod 644 /etc/group


    if [ -n "$myGroups" ]; then
        if [ -w /etc ]; then
            oldifs="${IFS-not set}"
            IFS=,
            for ngroup in $tocreate; do
                ngroup=$(echo ${ngroup} | sed -e 's/ /\\\ /g') # FIXME: Problem 
with AD. Space not permited here.
                groupadd -r ${ngroup}
            done
            test "$oldifs" = "not set" && unset IFS || IFS="$oldifs"
            for group in $(echo ${myGroups} | tr ',' '\n' | sort -u); do
                /usr/sbin/usermod -a -G $group "${LDM_USERNAME}" 2>/dev/null
            done
        else
            # FIXME: maybe add system groups: $tocreate into /etc/group
            # Read-only /etc cannot use usermod
            myGroups=$(echo ${myGroups} | tr ',' '\n' | sort -u | tr '\n' ',' | 
sed 's/,$//')
            oldifs="${IFS-not set}"
            IFS=,
            cp /etc/group $TMPGROUP
            for group in $myGroups ; do
                # add user to each group manually
                line="$(egrep ^${group}: $TMPGROUP | egrep -v 
[:,]${LDM_USERNAME}'(,|$)' )"
                if [ -n "$line" ]; then
                    # add the user to the group
                    sed -i -e "s/^$line/$line,${LDM_USERNAME}/g" -e 's/:,/:/g' 
$TMPGROUP
                fi
            done
            cp $TMPGROUP /etc/group
            test "$oldifs" = "not set" && unset IFS || IFS="$oldifs"
        fi
    fi

    # Now, let's mount the home directory
    oldifs="${IFS-not set}"
    IFS=":"
    export LDM_HOME=""
    export USER_UID=""
    export USER_GID=""
    while read user pass uid gid gecos home shell ; do
        # First, make the mountpoint
        LDM_HOME="$home"
        USER_UID="$uid"
        USER_GID="$gid"
        mkdir -p ${LDM_HOME}
        chown "$USER_UID":"$USER_GID" ${LDM_HOME}
        if [ -n "${XAUTHORITY_DIR}" ]; then
            chown "$USER_UID":"$USER_GID" ${XAUTHORITY_DIR}
        fi
    done <<EOF
$(getent passwd "$LDM_USERNAME")
EOF
    test "$oldifs" = "not set" && unset IFS || IFS="$oldifs"

    ## Maybe do this:
    ## export HOME=${LOCALAPPS_CACHE}

    if [ -z "$SSH_FOLLOW_SYMLINKS" ]; then
        # By default, don't follow symlinks under $HOME for localapps, as
        # that breaks some apps that try to create locks to other filesystems.
        # But do follow symlinks for any extra mounts.
        follow_extra_symlinks="follow_symlinks,"
    elif boolean_is_true "$SSH_FOLLOW_SYMLINKS"; then
        follow_home_symlinks="follow_symlinks,"
        follow_extra_symlinks="follow_symlinks,"
    fi
    # If the user's home directory is not located in the root cow device, assume
    # that it has already been mounted with other means, e.g. with FSTAB_x.
    if [ "$(stat -c %m "$LDM_HOME")" != "/" ]; then
        unset SSHFS_HOME
    else
        export SSHFS_HOME=true
        # sshfs -o ${follow_home_symlinks}allow_other,ControlPath=${LDM_SOCKET} 
${LDM_SERVER}:${LDM_HOME} ${LDM_HOME}
    fi

    # Mount other directories
    if [ -n "${LOCAL_APPS_EXTRAMOUNTS}" ]; then
        oldifs="${IFS-not set}"
        IFS=","
        for extradir in ${LOCAL_APPS_EXTRAMOUNTS}; do
            mkdir -p "${extradir}"
            # sshfs -o 
"${follow_extra_symlinks}allow_other,ControlPath=${LDM_SOCKET}" 
"${LDM_SERVER}:${extradir}" "${extradir}"
        done
        test "$oldifs" = "not set" && unset IFS || IFS="$oldifs"
    fi

    # attempt to create cups dir if not present
    if [ ! -d /etc/cups ]; then
        mkdir /etc/cups || true
    fi

    # if cups is installed in the chroot, use LDM_SERVER for printing
    if [ -d /etc/cups ]; then
        if [ -n "${CUPS_SERVER}" ]; then
            echo "ServerName ${CUPS_SERVER}" > /etc/cups/client.conf
        else
            echo "ServerName ${LDM_SERVER}" > /etc/cups/client.conf
        fi
    fi

fi
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://ad.doubleclick.net/clk;258768047;13503038;j?
http://info.appdynamics.com/FreeJavaPerformanceDownload.html
_____________________________________________________________________
Ltsp-discuss mailing list.   To un-subscribe, or change prefs, goto:
      https://lists.sourceforge.net/lists/listinfo/ltsp-discuss
For additional LTSP help,   try #ltsp channel on irc.freenode.net

Reply via email to