# $FreeBSD$ PIDFILE=ggatessh.pid TESTIMG="test.img" TEMPFILE="random.data" SFTPSERVER="/usr/libexec/sftp-server" PORT=2222 atf_test_case ggatessh cleanup ggatessh_head() { atf_set "descr" "ggatessh can proxy to sftp" atf_set "require.progs" "ggatessh" atf_set "require.user" "root" atf_set "timeout" 20 } ggatessh_body() { load_ggate us=$(alloc_ggate_dev) n1mchunks=3 secsize=4096 atf_check -e ignore -o ignore \ dd if=/dev/random of="$TEMPFILE" bs=1m count=$n1mchunks conv=notrunc startup_sshd truncate -s ${n1mchunks}m "$TESTIMG" # sshd authenticates and switches to USER chown "$USER" "$TESTIMG" echo 'WARNING: ggatessh error messages goes to syslog (aka /var/log/messages)' atf_check ggatessh create -i "$(pwd)/id_rsa" -p "$PORT" -F "$PIDFILE" -u $us -l "$USER" 127.0.0.1 "$(pwd)/$TESTIMG" ggate_dev=/dev/ggate${us} wait_for_ggate_device ${ggate_dev} # make sure it has correct size and sector sizekj read _dev _secsize _size _nsecs _stripesize _stripeoff <<EOF $(diskinfo /dev/ggate$us) EOF atf_check_equal "$_secsize" $secsize atf_check_equal "$_size" $(($n1mchunks * 1024 * 1024)) atf_check_equal "$_nsecs" $(($n1mchunks * 1024 * 1024 / $secsize)) # Test writing atf_check -e ignore -o ignore \ dd if="$TEMPFILE" of=${ggate_dev} bs=1m count=$n1mchunks conv=notrunc # Test reading atf_check -e ignore -o ignore \ dd of="$TEMPFILE"2 if=${ggate_dev} bs=1m count=$n1mchunks conv=notrunc # Verify that we read what we wrote atf_check cmp "$TEMPFILE" "$TEMPFILE"2 # Verify that the image matches atf_check cmp "$TEMPFILE" "$TESTIMG" rm "$TEMPFILE" "$TEMPFILE"2 } ggatessh_cleanup() { common_cleanup } atf_test_case ggatessh_resize cleanup ggatessh_resize_head() { atf_set "descr" "ggatessh will resize the devices" atf_set "require.progs" "ggatessh" atf_set "require.user" "root" atf_set "timeout" 20 } ggatessh_resize_body() { n1mchunks=4 secsize=4096 us=$(alloc_ggate_dev) startup_sshd truncate -s ${n1mchunks}m "$TESTIMG" # sshd authenticates and switches to USER chown "$USER" "$TESTIMG" echo 'WARNING: ggatessh error messages goes to syslog (aka /var/log/messages)' atf_check ggatessh create -i "$(pwd)/id_rsa" -p "$PORT" -F "$PIDFILE" -u $us -l "$USER" 127.0.0.1 "$(pwd)/$TESTIMG" ggate_dev=/dev/ggate${us} wait_for_ggate_device ${ggate_dev} # make sure it has correct size and sector sizekj read _dev _secsize _size _nsecs _stripesize _stripeoff <<EOF $(diskinfo /dev/ggate$us) EOF atf_check_equal "$_secsize" $secsize atf_check_equal "$_size" $(($n1mchunks * 1024 * 1024)) atf_check_equal "$_nsecs" $(($n1mchunks * 1024 * 1024 / $secsize)) # kill off old ggate pkill -F "$PIDFILE" # Test resizing n1mchunks=6 truncate -s ${n1mchunks}m "$TESTIMG" ps auxwww | grep ggatessh cat "$PIDFILE" sleep 1 # restart ggate atf_check ggatessh rescue -v -i "$(pwd)/id_rsa" -p "$PORT" -F "$PIDFILE" -u $us -l "$USER" 127.0.0.1 "$(pwd)/$TESTIMG" & sleep 1 # make sure it has correct size and sector size read _dev _secsize _size _nsecs _stripesize _stripeoff <<EOF $(diskinfo /dev/ggate$us) EOF atf_check_equal "$_secsize" $secsize atf_check_equal "$_size" $(($n1mchunks * 1024 * 1024)) atf_check_equal "$_nsecs" $(($n1mchunks * 1024 * 1024 / $secsize)) dd if=/dev/ggate$us of=/dev/null bs=1m } ggatessh_resize_cleanup() { common_cleanup } atf_init_test_cases() { atf_add_test_case ggatessh atf_add_test_case ggatessh_resize } alloc_ggate_dev() { local us us=0 while [ -c /dev/ggate${us} ]; do : $(( us += 1 )) done echo ${us} > ggate.devs echo ${us} } alloc_md() { local md md=$(mdconfig -a -t malloc -s 1M) || \ atf_fail "failed to allocate md device" echo ${md} >> md.devs echo ${md} } # slightly modified from: # https://serverfault.com/questions/344295/is-it-possible-to-run-sshd-as-a-normal-user startup_sshd() { # Host keys ssh-keygen -f ssh_host_rsa_key -N '' -t rsa > /dev/null # user key ssh-keygen -f id_rsa -N '' -t rsa > /dev/null (echo -n 'command="/usr/libexec/sftp-server" '; cat id_rsa.pub) > authorized_keys cat > sshd_config <<EOF ListenAddress 127.0.0.1:$PORT HostKey /home/freebsd/custom_ssh/ssh_host_rsa_key AuthorizedKeysFile $(pwd)/authorized_keys ChallengeResponseAuthentication no PasswordAuthentication no # to allow writable tmp w/ sticky bit StrictModes no UsePAM no Subsystem sftp ${SFTPSERVER} PidFile $(pwd)/sshd.pid EOF if ! :; then /usr/sbin/sshd -dD -f $(pwd)/sshd_config & sleep .2 else /usr/sbin/sshd -f $(pwd)/sshd_config while ! [ -f sshd.pid ]; do sleep .2 done fi } checksum() { local src work src=$1 work=$2 src_checksum=$(md5 -q $src) work_checksum=$(md5 -q $work) if [ "$work_checksum" != "$src_checksum" ]; then atf_fail "work md5 checksum didn't match" fi ggate_checksum=$(md5 -q /dev/ggate${us}) if [ "$ggate_checksum" != "$src_checksum" ]; then atf_fail "ggate md5 checksum didn't match" fi } common_cleanup() { if [ -f "ggate.devs" ]; then while read test_ggate; do ggatessh destroy -f -u $test_ggate >/dev/null done < ggate.devs rm ggate.devs fi if [ -f "sshd.pid" ]; then pkill -F sshd.pid # clean up after startup_sshd rm ssh_host_rsa_key rm id_rsa id_rsa.pub rm authorized_keys fi if [ -f "$PIDFILE" ]; then pkill -F "$PIDFILE" rm $PIDFILE fi if [ -f "PLAINFILES" ]; then while read f; do rm -f ${f} done < ${PLAINFILES} rm ${PLAINFILES} fi if [ -f "md.devs" ]; then while read test_md; do mdconfig -d -u $test_md 2>/dev/null done < md.devs rm md.devs fi true } load_ggate() { local class=gate # If the geom class isn't already loaded, try loading it. if ! kldstat -q -m g_${class}; then if ! geom ${class} load; then atf_skip "could not load module for geom class=${class}" fi fi } # Bug 204616: ggatel(8) creates /dev/ggate* asynchronously if `ggatel create` # isn't called with `-v`. wait_for_ggate_device() { ggate_device=$1 while [ ! -c $ggate_device ]; do sleep 0.5 done }