Current File : //proc/thread-self/root/proc/self/root/proc/self/root/usr/local/lsws/admin/misc/chroot.sh
#!/bin/sh

OS=`uname -s`
HW=`uname -i`


CHROOT=$1
EXECUTABLE=$2
if [ "x$CHROOT" = "x" ]; then
        cat <<EOF
Usage: chrootEnv.sh <chroot path> [path_to_binary]

EOF
        exit 1
fi
CUR_USER=`id`
CUR_USER=`expr "$CUR_USER" : 'uid=.*(\(.*\)) gid=.*'`

if [ $CUR_USER != "root" ]; then
        echo "[ERROR] You must be root user to setup chroot environment!"
fi

if [ `expr "$CHROOT" : '\/'` -eq 0 ]; then
        echo "[ERROR] Chroot path must be absolute path!"
        exit 1
fi

if [ $CHROOT = "/" ]; then
        echo "It is not necessory to setup the environment when chroot to '/'."
        exit 0
fi

if [ -f $CHROOT ]; then
        echo "[ERROR] chroot directory does not exist!"
        exit 1
fi

copy_library()
{
        ldd $EXECUTABLE > /tmp/dynlibs
        while read dynlib 
        do
                if [ "x$OS" != "xSunOS" ]; then
                        libname=`expr "$dynlib" : '\(.*\) => .* .*'`
                        libpath=`expr "$dynlib" : '.* => \(.*\) .*'`
                else
                        libname=`expr "$dynlib" : '[ ]*\(.*\) =>.*'`
                        libpath=`expr "$dynlib" : '.* =>[        ]*\(.*\)'`
                fi
                if [ "x$libpath" != "x" ]; then
                        if [ "$libpath" = "/usr/lib/$libname" ]; then
                                #if [ ! -f "$CHROOT/usr/lib/$libname" ] && [ ! -f "$CHROOT/$libname" ]; then
                                        cp $libpath $CHROOT/usr/lib
                                #fi
                        elif [ "$libpath" = "/usr/lib64/$libname" ]; then
                                #if [ ! -f "$CHROOT/usr/lib64/$libname" ] && [ ! -f "$CHROOT/$libname" ]; then
                                        cp $libpath $CHROOT/usr/lib64
                                #fi
                        elif [ "$libpath" = "/lib64/$libname" ]; then
                                #if [ ! -f "$CHROOT/lib64/$libname" ] && [ ! -f "$CHROOT/$libname" ]; then
                                        cp $libpath $CHROOT/lib64
                                #fi
                        else
                                #if [ ! -f "$CHROOT/lib/$libname" ] && [ ! -f "$CHROOT/$libname" ]; then
                                        cp $libpath $CHROOT/lib
                                #fi

                        fi
                fi
        done < /tmp/dynlibs
        rm /tmp/dynlibs
}

copy_perl()
{
    cp /usr/bin/perl $CHROOT/usr/bin
    EXECUTABLE=/usr/bin/perl
    copy_library
    
        if [ "x$OS" = "xFreeBSD" ]; then
        mkdir $CHROOT/usr/libdata
        cp -R /usr/libdata/perl  $CHROOT/usr/libdata

        elif [ "x$OS" = "xSunOS" ]; then
        cp -R /usr/perl5      $CHROOT/usr

	elif [ "x$HW" = "xx86_64" ]; then
	cp -R /usr/lib64/perl5 $CHROOT/usr/lib64

    else
        cp -R /usr/lib/perl5  $CHROOT/usr/lib
        fi
    
}


update_existing()
{
    cd $CHROOT
    for f in `find lib lib64 usr/lib usr/lib64 bin usr/bin -type f`; do rsync -av -L /$f ./$f; done
    rsync -av /etc/pki ./etc/

    #NSS required file, otherwise curl breaks
    FILES="/lib64/libfreeblpriv3.chk 
/lib64/libfreeblpriv3.so 
/lib64/libfreebl3.so 
/lib64/libfreebl3.chk 
/usr/lib64/libnsssysinit.so 
/usr/lib64/libnsspem.so 
/usr/lib64/libnssdbm3.so 
/usr/lib64/libnssdbm3.chk 
/usr/lib64/libsoftokn3.so 
/usr/lib64/libsoftokn3.chk"    
    for f in $FILES ; do rsync -av -L /$f ./$f; done
    ln -sf ../../lib64/libfreeblpriv3.so $CHROOT/usr/lib64/libfreeblpriv3.so
}


if [ "x$EXECUTABLE" = 'x' ]; then
        for req_dir in 'bin' 'lib' 'usr' 'usr/bin' 'usr/lib' 'dev' 'tmp' 'etc'
            do
            if [ ! -d "$CHROOT/$req_dir" ]; then
                    mkdir $CHROOT/$req_dir
                    chmod 755 $CHROOT/$req_dir
            fi
        done 
        chmod 1777 $CHROOT/tmp

	if [ "x$HW" = "xx86_64" ]; then
	    for req_dir in 'lib64' 'usr/lib64'
		do
	            if [ ! -d "$CHROOT/$req_dir" ]; then
       		             mkdir $CHROOT/$req_dir
               		     chmod 755 $CHROOT/$req_dir
            	    fi
        	done
	fi

        if [ "x$OS" = "xFreeBSD" ]; then
                mknod $CHROOT/dev/null c 2 2
                mknod $CHROOT/dev/random c 2 3
                mknod $CHROOT/dev/urandom c 2 4
                mknod $CHROOT/dev/zero c 2 12
                mkdir $CHROOT/usr/libexec
                cp /usr/libexec/ld* $CHROOT/usr/libexec
        mkdir $CHROOT/usr/share
        cp -R /usr/share/locale   $CHROOT/usr/share

        elif [ "x$OS" = "xSunOS" ]; then
                mknod $CHROOT/dev/null c 13 2
                mknod $CHROOT/dev/random c 82 0
                mknod $CHROOT/dev/urandom c 82 1
#from solaris 10
#               mknod $CHROOT/dev/random c 149 0
#               mknod $CHROOT/dev/urandom c 149 1
#               mknod $CHROOT/dev/poll c 138 0
                mknod $CHROOT/dev/zero c 13 12
                cp /usr/lib/ld.so.1 /usr/lib/libdl.so.1 /usr/lib/libc.so.1 $CHROOT/usr/lib
        cp -R /usr/lib/locale $CHROOT/usr/lib
        else
                mknod $CHROOT/dev/null c 1 3
                mknod $CHROOT/dev/random c 1 8
                mknod $CHROOT/dev/urandom c 1 9
                mknod $CHROOT/dev/zero c 1 5

            if [ "x$OS" = "xLinux" ]; then
            cp /lib/ld-linux.so.* $CHROOT/lib
        fi
        cp /lib/libnss_dns.so.* $CHROOT/lib
        cp /lib/libnss_files.so.* $CHROOT/lib
        cp /lib/libnss_nisplus.so.* $CHROOT/lib
        cp /lib/libtermcap.so.* $CHROOT/lib
        cp -R /usr/lib/locale   $CHROOT/usr/lib
        cp /etc/netconfig       $CHROOT/etc        
		if [ "x$HW" = "xx86_64" ]; then
		        cp /lib64/libnss_dns.so.* $CHROOT/lib64
		        cp /lib64/libnss_files.so.* $CHROOT/lib64
		        cp /lib64/libnss_nisplus.so.* $CHROOT/lib64
		        cp /lib64/libtermcap.so.* $CHROOT/lib64
			cp /lib64/ld-* $CHROOT/lib64
		fi
        
        fi
        chmod 666 $CHROOT/dev/*
        cp /etc/localtime $CHROOT/etc/
        cp /etc/resolv.conf $CHROOT/etc/
        cp /etc/hosts $CHROOT/etc/
        #chown root $CHROOT
        #chmod 700  $CHROOT
        touch $CHROOT/etc/passwd $CHROOT/etc/group $CHROOT/etc/shadow
        chmod 400 $CHROOT/etc/shadow

        for req_bin in 'dirname' 'ldd' 'cat' 'echo' 'date' 'sh'
          do
          if [ ! -f "$CHROOT/bin/$req_bin" ]; then
                  if [ -f "/bin/$req_bin" ]; then
                          cp /bin/$req_bin $CHROOT/bin
                      chmod 755 $CHROOT/bin/$req_bin
                          EXECUTABLE=/bin/$req_bin
                  elif [ -f "/usr/bin/$req_bin" ]; then
                          cp /usr/bin/$req_bin $CHROOT/usr/bin
                          chmod 755 $CHROOT/usr/bin/$req_bin
                          EXECUTABLE=/usr/bin/$req_bin
                  elif [ -f "/sbin/$req_bin" ]; then
                          cp /sbin/$req_bin $CHROOT/bin
                          chmod 755 $CHROOT/bin/$req_bin
                          EXECUTABLE=/sbin/$req_bin
                  elif [ -f "/usr/sbin/$req_bin" ]; then
                          cp /usr/sbin/$req_bin $CHROOT/usr/bin
                          chmod 755 $CHROOT/usr/bin/$req_bin
                          EXECUTABLE=/usr/sbin/$req_bin
                  fi
                  copy_library
          fi
        done

elif [ "x$EXECUTABLE" = 'xperl' ]; then
    copy_perl
elif [ "x$EXECUTABLE" = 'xupdate_chroot' ]; then
    update_existing
else
        copy_library
fi