0
0
Fork 0
mirror of https://github.com/atmoz/sftp.git synced 2024-12-08 13:05:39 -05:00
atmoz-sftp/tests/run

294 lines
7.2 KiB
Text
Raw Normal View History

2015-11-23 07:39:17 -05:00
#!/bin/bash
# See: https://github.com/djui/bashunit
2015-12-20 17:45:28 -05:00
skipAllTests=false
2015-11-23 07:39:17 -05:00
scriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
buildDir="$scriptDir/.."
tmpDir="/tmp/atmoz_sftp_test"
sudo="sudo"
cache="--no-cache"
2015-11-23 07:39:17 -05:00
build=${1:-"build"}
2015-12-07 04:10:24 -05:00
output=${2:-"quiet"}
cleanup=${3:-"cleanup"}
2015-11-23 07:39:17 -05:00
sftpImageName="atmoz/sftp_test"
sftpContainerName="atmoz_sftp_test"
2015-12-07 04:10:24 -05:00
if [ "$output" == "quiet" ]; then
redirect="/dev/null"
else
redirect="/dev/stdout"
2015-12-07 04:10:24 -05:00
fi
2016-09-26 14:13:53 -04:00
buildOptions="--tag $sftpImageName"
2015-12-07 04:10:24 -05:00
##############################################################################
2015-11-23 07:39:17 -05:00
function beforeTest() {
if [ "$build" == "build" ]; then
buildOptions="$buildOptions $cache --pull=true"
2016-09-26 14:13:53 -04:00
fi
$sudo docker build $buildOptions "$buildDir"
2016-09-26 14:13:53 -04:00
if [ $? -gt 0 ]; then
echo "Build failed"
exit 1
2015-11-23 07:39:17 -05:00
fi
# Private key can not be read by others
chmod go-rw "$scriptDir/id_rsa"
2015-11-23 07:39:17 -05:00
rm -rf "$tmpDir" # clean state
mkdir "$tmpDir"
2016-08-18 06:45:59 -04:00
echo "test::$(id -u):$(id -g):dir1,dir2" >> "$tmpDir/users"
2017-10-08 13:08:53 -04:00
echo "" >> "$tmpDir/users" # empty line
echo "# comments are allowed" >> "$tmpDir/users"
echo " " >> "$tmpDir/users" # only whitespace
echo " # with whitespace in front" >> "$tmpDir/users"
2017-06-25 09:16:41 -04:00
echo "user.with.dot::$(id -u):$(id -g)" >> "$tmpDir/users"
$sudo docker run \
-v "$tmpDir/users:/etc/sftp/users.conf:ro" \
2015-11-23 07:39:17 -05:00
-v "$scriptDir/id_rsa.pub":/home/test/.ssh/keys/id_rsa.pub:ro \
-v "$scriptDir/id_rsa.pub":/home/user-from-env/.ssh/keys/id_rsa.pub:ro \
2017-06-25 09:16:41 -04:00
-v "$scriptDir/id_rsa.pub":/home/user.with.dot/.ssh/keys/id_rsa.pub:ro \
2015-11-23 07:39:17 -05:00
-v "$tmpDir":/home/test/share \
--name "$sftpContainerName" \
--expose 22 \
-e "SFTP_USERS=user-from-env::$(id -u):$(id -g) user-from-env-2::$(id -u):$(id -g)" \
2015-11-23 07:39:17 -05:00
-d "$sftpImageName" \
2015-12-07 04:10:24 -05:00
> "$redirect"
waitForServer $sftpContainerName
2015-11-23 07:39:17 -05:00
}
function afterTest() {
2015-12-07 04:10:24 -05:00
if [ "$output" != "quiet" ]; then
2015-12-20 19:37:42 -05:00
echo "Docker logs:"
$sudo docker logs "$sftpContainerName"
2015-12-07 04:10:24 -05:00
fi
if [ "$cleanup" == "cleanup" ]; then
$sudo docker rm -fv "$sftpContainerName" > "$redirect"
2015-12-07 04:10:24 -05:00
rm -rf "$tmpDir"
fi
2015-11-23 07:39:17 -05:00
}
function getSftpIp() {
$sudo docker inspect -f {{.NetworkSettings.IPAddress}} "$1"
2015-11-23 07:39:17 -05:00
}
function runSftpCommands() {
ip="$(getSftpIp $1)"
user="$2"
shift 2
2015-12-07 04:10:24 -05:00
commands=""
for cmd in "$@"; do
commands="$commands$cmd"$'\n'
done
echo "$commands" | sftp \
2015-11-23 07:39:17 -05:00
-i "$scriptDir/id_rsa" \
-oStrictHostKeyChecking=no \
-oUserKnownHostsFile=/dev/null \
-b - $user@$ip \
2015-12-07 04:10:24 -05:00
> "$redirect" 2>&1
2016-06-02 08:56:30 -04:00
status=$?
sleep 1 # wait for commands to finish
return $status
}
function waitForServer() {
containerName="$1"
echo -n "Waiting for $containerName to open port 22 ..."
for i in {1..30}; do
sleep 1
ip="$(getSftpIp $containerName)"
echo -n "."
if [ -n "$ip" ] && nc -z $ip 22; then
echo " OPEN"
return 0;
fi
done
echo " TIMEOUT"
return 1
2015-11-23 07:39:17 -05:00
}
2015-12-07 04:10:24 -05:00
##############################################################################
function testContainerIsRunning() {
$skipAllTests && skip && return 0
ps="$($sudo docker ps -q -f name="$sftpContainerName")"
assertNotEqual "$ps" ""
if [ -z "$ps" ]; then
skipAllTests=true
fi
}
function testLoginUsingSshKey() {
$skipAllTests && skip && return 0
runSftpCommands "$sftpContainerName" "test" "exit"
assertReturn $? 0
}
2017-06-25 09:16:41 -04:00
function testUserWithDotLogin() {
$skipAllTests && skip && return 0
runSftpCommands "$sftpContainerName" "user.with.dot" "exit"
assertReturn $? 0
}
function testLoginUsingUserFromEnv() {
$skipAllTests && skip && return 0
runSftpCommands "$sftpContainerName" "user-from-env" "exit"
assertReturn $? 0
}
function testWritePermission() {
$skipAllTests && skip && return 0
runSftpCommands "$sftpContainerName" "test" \
"cd share" \
"mkdir test" \
"exit"
test -d "$tmpDir/test"
assertReturn $? 0
}
function testDir() {
$skipAllTests && skip && return 0
runSftpCommands "$sftpContainerName" "test" \
2016-08-12 14:45:21 -04:00
"cd dir1" \
"mkdir test-dir1" \
"get -rf test-dir1 $tmpDir/" \
"cd ../dir2" \
"mkdir test-dir2" \
"get -rf test-dir2 $tmpDir/" \
"exit"
2016-08-12 14:45:21 -04:00
test -d "$tmpDir/test-dir1"
assertReturn $? 0
test -d "$tmpDir/test-dir2"
assertReturn $? 0
}
# Smallest user config possible
2015-12-20 17:45:28 -05:00
function testMinimalContainerStart() {
$skipAllTests && skip && return 0
tmpContainerName="$sftpContainerName""_minimal"
$sudo docker run \
2015-12-20 17:45:28 -05:00
--name "$tmpContainerName" \
-d "$sftpImageName" \
m: \
2015-12-20 17:45:28 -05:00
> "$redirect"
waitForServer $tmpContainerName
ps="$($sudo docker ps -q -f name="$tmpContainerName")"
2015-12-20 17:45:28 -05:00
assertNotEqual "$ps" ""
if [ -z "$ps" ]; then
skipAllTests=true
fi
if [ "$output" != "quiet" ]; then
$sudo docker logs "$tmpContainerName"
2015-12-20 17:45:28 -05:00
fi
if [ "$cleanup" == "cleanup" ]; then
$sudo docker rm -fv "$tmpContainerName" > "$redirect"
2015-12-20 17:45:28 -05:00
fi
}
function testLegacyConfigPath() {
$skipAllTests && skip && return 0
tmpContainerName="$sftpContainerName""_legacy"
echo "test::$(id -u):$(id -g)" >> "$tmpDir/legacy_users"
$sudo docker run \
-v "$tmpDir/legacy_users:/etc/sftp-users.conf:ro" \
--name "$tmpContainerName" \
--expose 22 \
-d "$sftpImageName" \
> "$redirect"
waitForServer $tmpContainerName
ps="$($sudo docker ps -q -f name="$tmpContainerName")"
assertNotEqual "$ps" ""
if [ "$output" != "quiet" ]; then
$sudo docker logs "$tmpContainerName"
fi
if [ "$cleanup" == "cleanup" ]; then
$sudo docker rm -fv "$tmpContainerName" > "$redirect"
fi
}
# Bind-mount folder using script in /etc/sftp.d/
function testCustomContainerStart() {
$skipAllTests && skip && return 0
tmpContainerName="$sftpContainerName""_custom"
mkdir -p "$tmpDir/custom/bindmount"
echo "mkdir -p /home/custom/bindmount && \
chown custom /home/custom/bindmount && \
mount --bind /custom /home/custom/bindmount" \
> "$tmpDir/mount.sh"
chmod +x "$tmpDir/mount.sh"
$sudo docker run \
--privileged=true \
--name "$tmpContainerName" \
-v "$scriptDir/id_rsa.pub":/home/custom/.ssh/keys/id_rsa.pub:ro \
-v "$tmpDir/custom/bindmount":/custom \
-v "$tmpDir/mount.sh":/etc/sftp.d/mount.sh \
--expose 22 \
-d "$sftpImageName" \
custom:123 \
> "$redirect"
waitForServer $tmpContainerName
ps="$($sudo docker ps -q -f name="$tmpContainerName")"
assertNotEqual "$ps" ""
runSftpCommands "$tmpContainerName" "custom" \
"cd bindmount" \
"mkdir test" \
"exit"
test -d "$tmpDir/custom/bindmount/test"
assertReturn $? 0
if [ "$output" != "quiet" ]; then
$sudo docker logs "$tmpContainerName"
fi
if [ "$cleanup" == "cleanup" ]; then
$sudo docker rm -fv "$tmpContainerName" > "$redirect"
fi
}
2015-12-07 04:10:24 -05:00
##############################################################################
2015-11-23 07:39:17 -05:00
# Run tests
source "$scriptDir/bashunit.bash"
# Nothing happens after this