1*cdebaff8SEnji Cooper# $NetBSD: t_psshfs.sh,v 1.8 2016/09/05 08:53:57 christos Exp $ 257718be8SEnji Cooper# 357718be8SEnji Cooper# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc. 457718be8SEnji Cooper# All rights reserved. 557718be8SEnji Cooper# 657718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without 757718be8SEnji Cooper# modification, are permitted provided that the following conditions 857718be8SEnji Cooper# are met: 957718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright 1057718be8SEnji Cooper# notice, this list of conditions and the following disclaimer. 1157718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 1257718be8SEnji Cooper# notice, this list of conditions and the following disclaimer in the 1357718be8SEnji Cooper# documentation and/or other materials provided with the distribution. 1457718be8SEnji Cooper# 1557718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1657718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1757718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1857718be8SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 1957718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2057718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2157718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2257718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2357718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2457718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2557718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 2657718be8SEnji Cooper# 2757718be8SEnji Cooper 2857718be8SEnji Cooper# ------------------------------------------------------------------------- 2957718be8SEnji Cooper# Auxiliary functions. 3057718be8SEnji Cooper# ------------------------------------------------------------------------- 3157718be8SEnji Cooper 3257718be8SEnji Cooper# 3357718be8SEnji Cooper# Skips the calling test case if puffs is not supported in the kernel 3457718be8SEnji Cooper# or if the calling user does not have the necessary permissions to mount 3557718be8SEnji Cooper# file systems. 3657718be8SEnji Cooper# 3757718be8SEnji Cooperrequire_puffs() { 3857718be8SEnji Cooper case "$($(atf_get_srcdir)/h_have_puffs)" in 3957718be8SEnji Cooper eacces) 4057718be8SEnji Cooper atf_skip "Cannot open /dev/puffs for read/write access" 4157718be8SEnji Cooper ;; 4257718be8SEnji Cooper enxio) 4357718be8SEnji Cooper atf_skip "puffs support not built into the kernel" 4457718be8SEnji Cooper ;; 4557718be8SEnji Cooper failed) 4657718be8SEnji Cooper atf_skip "Unknown error trying to access /dev/puffs" 4757718be8SEnji Cooper ;; 4857718be8SEnji Cooper yes) 4957718be8SEnji Cooper ;; 5057718be8SEnji Cooper *) 5157718be8SEnji Cooper atf_fail "Unknown value returned by h_have_puffs" 5257718be8SEnji Cooper ;; 5357718be8SEnji Cooper esac 5457718be8SEnji Cooper 5557718be8SEnji Cooper if [ $(id -u) -ne 0 -a $(sysctl -n vfs.generic.usermount) -eq 0 ] 5657718be8SEnji Cooper then 5757718be8SEnji Cooper atf_skip "Regular users cannot mount file systems" \ 5857718be8SEnji Cooper "(vfs.generic.usermount is set to 0)" 5957718be8SEnji Cooper fi 6057718be8SEnji Cooper} 6157718be8SEnji Cooper 6257718be8SEnji Cooper# 6357718be8SEnji Cooper# Starts a SSH server and sets up the client to access it. 6457718be8SEnji Cooper# Authentication is allowed and done using an RSA key exclusively, which 6557718be8SEnji Cooper# is generated on the fly as part of the test case. 6657718be8SEnji Cooper# XXX: Ideally, all the tests in this test program should be able to share 6757718be8SEnji Cooper# the generated key, because creating it can be a very slow process on some 6857718be8SEnji Cooper# machines. 6957718be8SEnji Cooper# 7057718be8SEnji Cooperstart_ssh() { 7157718be8SEnji Cooper echo "Setting up SSH server configuration" 7257718be8SEnji Cooper sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \ 7357718be8SEnji Cooper $(atf_get_srcdir)/sshd_config.in >sshd_config || \ 7457718be8SEnji Cooper atf_fail "Failed to create sshd_config" 7557718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty cp /usr/libexec/sftp-server . 7657718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 7757718be8SEnji Cooper cp $(atf_get_srcdir)/ssh_host_key . 7857718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 7957718be8SEnji Cooper cp $(atf_get_srcdir)/ssh_host_key.pub . 8057718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty chmod 400 ssh_host_key 8157718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty chmod 444 ssh_host_key.pub 8257718be8SEnji Cooper 8357718be8SEnji Cooper /usr/sbin/sshd -e -f ./sshd_config >sshd.log 2>&1 & 8457718be8SEnji Cooper while [ ! -f sshd.pid ]; do 8557718be8SEnji Cooper sleep 0.01 8657718be8SEnji Cooper done 8757718be8SEnji Cooper echo "SSH server started (pid $(cat sshd.pid))" 8857718be8SEnji Cooper 8957718be8SEnji Cooper echo "Setting up SSH client configuration" 9057718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 9157718be8SEnji Cooper ssh-keygen -f ssh_user_key -t rsa -b 1024 -N "" -q 9257718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 9357718be8SEnji Cooper cp ssh_user_key.pub authorized_keys 9457718be8SEnji Cooper echo "[localhost]:10000,[127.0.0.1]:10000,[::1]:10000" \ 9557718be8SEnji Cooper "$(cat $(atf_get_srcdir)/ssh_host_key.pub)" >known_hosts || \ 9657718be8SEnji Cooper atf_fail "Failed to create known_hosts" 9757718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty chmod 600 authorized_keys 9857718be8SEnji Cooper sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \ 9957718be8SEnji Cooper $(atf_get_srcdir)/ssh_config.in >ssh_config || \ 10057718be8SEnji Cooper atf_fail "Failed to create ssh_config" 10157718be8SEnji Cooper} 10257718be8SEnji Cooper 10357718be8SEnji Cooper# 10457718be8SEnji Cooper# Stops the SSH server spawned by start_ssh and prints diagnosis data. 10557718be8SEnji Cooper# 10657718be8SEnji Cooperstop_ssh() { 10757718be8SEnji Cooper if [ -f sshd.pid ]; then 10857718be8SEnji Cooper echo "Stopping SSH server (pid $(cat sshd.pid))" 10957718be8SEnji Cooper kill $(cat sshd.pid) 11057718be8SEnji Cooper fi 11157718be8SEnji Cooper if [ -f sshd.log ]; then 11257718be8SEnji Cooper echo "Server output was:" 11357718be8SEnji Cooper sed -e 's,^, ,' sshd.log 11457718be8SEnji Cooper fi 11557718be8SEnji Cooper} 11657718be8SEnji Cooper 11757718be8SEnji Cooper# 11857718be8SEnji Cooper# Mounts the given source directory on the target directory using psshfs. 11957718be8SEnji Cooper# Both directories are supposed to live on the current directory. 12057718be8SEnji Cooper# 12157718be8SEnji Coopermount_psshfs() { 12257718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 12357718be8SEnji Cooper mount -t psshfs -o -F=$(pwd)/ssh_config localhost:$(pwd)/${1} ${2} 12457718be8SEnji Cooper} 12557718be8SEnji Cooper 12657718be8SEnji Cooper# ------------------------------------------------------------------------- 12757718be8SEnji Cooper# The test cases. 12857718be8SEnji Cooper# ------------------------------------------------------------------------- 12957718be8SEnji Cooper 13057718be8SEnji Cooperatf_test_case inode_nos cleanup 13157718be8SEnji Cooperinode_nos_head() { 13257718be8SEnji Cooper atf_set "descr" "Checks that different files get different inode" \ 13357718be8SEnji Cooper "numbers" 13457718be8SEnji Cooper} 13557718be8SEnji Cooperinode_nos_body() { 13657718be8SEnji Cooper require_puffs 13757718be8SEnji Cooper 13857718be8SEnji Cooper start_ssh 13957718be8SEnji Cooper 14057718be8SEnji Cooper mkdir root 14157718be8SEnji Cooper mkdir root/dir 14257718be8SEnji Cooper touch root/dir/file1 14357718be8SEnji Cooper touch root/dir/file2 14457718be8SEnji Cooper touch root/file3 14557718be8SEnji Cooper touch root/file4 14657718be8SEnji Cooper 14757718be8SEnji Cooper cat >ne_inodes.sh <<EOF 14857718be8SEnji Cooper#! /bin/sh 14957718be8SEnji Cooper# 15057718be8SEnji Cooper# Compares the inodes of the two given files and returns true if they are 15157718be8SEnji Cooper# different; false otherwise. 15257718be8SEnji Cooper# 15357718be8SEnji Cooperset -e 15457718be8SEnji Cooperino1=\$(stat -f %i \${1}) 15557718be8SEnji Cooperino2=\$(stat -f %i \${2}) 15657718be8SEnji Coopertest \${ino1} -ne \${ino2} 15757718be8SEnji CooperEOF 15857718be8SEnji Cooper chmod +x ne_inodes.sh 15957718be8SEnji Cooper 16057718be8SEnji Cooper mkdir mnt 16157718be8SEnji Cooper mount_psshfs root mnt 16257718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 16357718be8SEnji Cooper ./ne_inodes.sh root/dir root/dir/file1 16457718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 16557718be8SEnji Cooper ./ne_inodes.sh root/dir root/dir/file2 16657718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 16757718be8SEnji Cooper ./ne_inodes.sh root/dir/file1 root/dir/file2 16857718be8SEnji Cooper atf_check -s eq:0 -o empty -e empty \ 16957718be8SEnji Cooper ./ne_inodes.sh root/file3 root/file4 17057718be8SEnji Cooper} 17157718be8SEnji Cooperinode_nos_cleanup() { 17257718be8SEnji Cooper umount mnt 17357718be8SEnji Cooper stop_ssh 17457718be8SEnji Cooper} 17557718be8SEnji Cooper 17657718be8SEnji Cooperatf_test_case pwd cleanup 17757718be8SEnji Cooperpwd_head() { 17857718be8SEnji Cooper atf_set "descr" "Checks that pwd works correctly" 17957718be8SEnji Cooper} 18057718be8SEnji Cooperpwd_body() { 18157718be8SEnji Cooper require_puffs 18257718be8SEnji Cooper 18357718be8SEnji Cooper start_ssh 18457718be8SEnji Cooper 18557718be8SEnji Cooper mkdir root 18657718be8SEnji Cooper mkdir root/dir 18757718be8SEnji Cooper 18857718be8SEnji Cooper mkdir mnt 18957718be8SEnji Cooper atf_check -s eq:0 -o save:stdout -e empty \ 19057718be8SEnji Cooper -x 'echo $(cd mnt && /bin/pwd)/dir' 19157718be8SEnji Cooper mv stdout expout 19257718be8SEnji Cooper mount_psshfs root mnt 19357718be8SEnji Cooper atf_check -s eq:0 -o file:expout -e empty \ 19457718be8SEnji Cooper -x 'cd mnt/dir && ls .. >/dev/null && /bin/pwd' 19557718be8SEnji Cooper} 19657718be8SEnji Cooperpwd_cleanup() { 19757718be8SEnji Cooper umount mnt 19857718be8SEnji Cooper stop_ssh 19957718be8SEnji Cooper} 20057718be8SEnji Cooper 20157718be8SEnji Cooperatf_test_case ls cleanup 20257718be8SEnji Cooperls_head() { 20357718be8SEnji Cooper atf_set "descr" "Uses ls, attempts to exercise puffs_cc" 20457718be8SEnji Cooper} 20557718be8SEnji Cooperls_body() { 20657718be8SEnji Cooper require_puffs 20757718be8SEnji Cooper 20857718be8SEnji Cooper start_ssh 20957718be8SEnji Cooper 21057718be8SEnji Cooper mkdir mnt 21157718be8SEnji Cooper mkdir root 21257718be8SEnji Cooper mkdir root/dir 21357718be8SEnji Cooper touch root/dir/file1 21457718be8SEnji Cooper touch root/dir/file2 21557718be8SEnji Cooper touch root/file3 21657718be8SEnji Cooper touch root/file4 21757718be8SEnji Cooper 21857718be8SEnji Cooper mount_psshfs root mnt 21957718be8SEnji Cooper 22057718be8SEnji Cooper ls -l mnt & 22157718be8SEnji Cooper 22257718be8SEnji Cooper IFS=' ' 22357718be8SEnji Cooperlsout='dir 22457718be8SEnji Cooperfile3 22557718be8SEnji Cooperfile4 22657718be8SEnji Cooper 22757718be8SEnji Coopermnt/dir: 22857718be8SEnji Cooperfile1 22957718be8SEnji Cooperfile2 23057718be8SEnji Cooper' 23157718be8SEnji Cooper atf_check -s exit:0 -o inline:"$lsout" ls -R mnt 23257718be8SEnji Cooper} 23357718be8SEnji Cooperls_cleanup() { 23457718be8SEnji Cooper umount mnt 23557718be8SEnji Cooper stop_ssh 23657718be8SEnji Cooper} 23757718be8SEnji Cooper 23857718be8SEnji Cooperatf_test_case setattr_cache cleanup 23957718be8SEnji Coopersetattr_cache_head() { 24057718be8SEnji Cooper atf_set "descr" "Checks that setattr caches" 24157718be8SEnji Cooper # Don't wait for the eternity that atf usually waits. Twenty 24257718be8SEnji Cooper # seconds should be good enough, except maybe on a VAX... 24357718be8SEnji Cooper atf_set "timeout" 20 24457718be8SEnji Cooper} 24557718be8SEnji Coopersetattr_cache_body() { 24657718be8SEnji Cooper require_puffs 24757718be8SEnji Cooper start_ssh 24857718be8SEnji Cooper atf_check -s exit:0 mkdir root 24957718be8SEnji Cooper atf_check -s exit:0 mkdir mnt 25057718be8SEnji Cooper mount_psshfs root mnt 25157718be8SEnji Cooper atf_check -s exit:0 -x ': > mnt/loser' 25257718be8SEnji Cooper atf_check -s exit:0 -o save:stat stat mnt/loser 25357718be8SEnji Cooper # Oops -- this doesn't work. We need to stop the child of the 25457718be8SEnji Cooper # sshd that is handling the sftp session. 25557718be8SEnji Cooper atf_check -s exit:0 kill -STOP $(cat sshd.pid) 25657718be8SEnji Cooper atf_check -s exit:0 -x ': > mnt/loser' 25757718be8SEnji Cooper atf_check -s exit:0 -o file:stat stat mnt/loser 25857718be8SEnji Cooper} 25957718be8SEnji Coopersetattr_cache_cleanup() { 26057718be8SEnji Cooper umount mnt 26157718be8SEnji Cooper kill -CONT $(cat sshd.pid) 26257718be8SEnji Cooper stop_ssh 26357718be8SEnji Cooper} 26457718be8SEnji Cooper 265*cdebaff8SEnji Cooperatf_test_case read_empty_file cleanup 266*cdebaff8SEnji Cooperread_empty_file_head() { 267*cdebaff8SEnji Cooper atf_set "descr" "Checks whether an empty file can be read" 268*cdebaff8SEnji Cooper # This test is supposed to make sure psshfs does not hang 269*cdebaff8SEnji Cooper # when reading from an empty file, hence the timeout. 270*cdebaff8SEnji Cooper atf_set "timeout" 8 271*cdebaff8SEnji Cooper} 272*cdebaff8SEnji Cooperread_empty_file_body() { 273*cdebaff8SEnji Cooper require_puffs 274*cdebaff8SEnji Cooper start_ssh 275*cdebaff8SEnji Cooper atf_check mkdir root mnt 276*cdebaff8SEnji Cooper atf_check -x ': > root/empty' 277*cdebaff8SEnji Cooper mount_psshfs root mnt 278*cdebaff8SEnji Cooper atf_check cat mnt/empty 279*cdebaff8SEnji Cooper} 280*cdebaff8SEnji Cooperread_empty_file_cleanup() { 281*cdebaff8SEnji Cooper umount mnt 282*cdebaff8SEnji Cooper stop_ssh 283*cdebaff8SEnji Cooper} 284*cdebaff8SEnji Cooper 28557718be8SEnji Cooper# ------------------------------------------------------------------------- 28657718be8SEnji Cooper# Initialization. 28757718be8SEnji Cooper# ------------------------------------------------------------------------- 28857718be8SEnji Cooper 28957718be8SEnji Cooperatf_init_test_cases() { 29057718be8SEnji Cooper atf_add_test_case inode_nos 29157718be8SEnji Cooper atf_add_test_case pwd 29257718be8SEnji Cooper atf_add_test_case ls 29357718be8SEnji Cooper #atf_add_test_case setattr_cache 294*cdebaff8SEnji Cooper atf_add_test_case read_empty_file 29557718be8SEnji Cooper} 296