|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +KEY="keys/hansel-key-ecc.pem" |
| 4 | +TEST_FILE="/home/jak/Documents/wolfssh-fork/test" |
| 5 | +FILE_SIZES=("5000" "10000" "50000" "100000" "150000" "200000" "250000" "300000" "350000" "400000" "500000" "1000000") |
| 6 | +TRANSFER_MBS="" |
| 7 | +NUMBER_RUNS=10 |
| 8 | +LOG_FILE="$PWD/log.csv" |
| 9 | +COMPARE_TO="" |
| 10 | +AVERAGE_FILE="" |
| 11 | + |
| 12 | +if [ -z $1 ]; then |
| 13 | + echo "Assuming default server port of 22 (pass port number as first" |
| 14 | + echo "argument if wanting to connect to a different port)" |
| 15 | + PORT=22 |
| 16 | +else |
| 17 | + PORT="$1" |
| 18 | +fi |
| 19 | + |
| 20 | +do_openssh_put_test() { |
| 21 | + cp $TEST_FILE $TEST_FILE-out |
| 22 | + sftp_command= "sftp -P$PORT -i $KEY [email protected]" |
| 23 | + output_file="sftp_log.txt" |
| 24 | + |
| 25 | + # Start the script command to capture the sftp session |
| 26 | +script -qc "$sftp_command << EOF |
| 27 | + put $TEST_FILE $TEST_FILE-out |
| 28 | + bye |
| 29 | +EOF" /dev/null 2>&1 | tee $output_file | while read line; do |
| 30 | + if [[ "$line" == *'MB/s'* ]]; then |
| 31 | + #TRANSFER_MBS=$(echo "$line" | awk '{print $(NF-2)}' | sed 's/MB\/s//') |
| 32 | + TRANSFER_MBS="$(echo "$line" | awk '{print $(NF-2)}' | sed 's/MB\/s//')" |
| 33 | + printf " $TRANSFER_MBS" >> $LOG_FILE |
| 34 | + fi |
| 35 | + done |
| 36 | +} |
| 37 | + |
| 38 | +do_openssh_get_test() { |
| 39 | + cp $TEST_FILE $TEST_FILE-out |
| 40 | + sftp_command= "sftp -P $PORT -i $KEY [email protected]" |
| 41 | + output_file="sftp_log.txt" |
| 42 | + |
| 43 | + # Start the script command to capture the sftp session |
| 44 | +script -qc "$sftp_command << EOF |
| 45 | + get $TEST_FILE $TEST_FILE-out |
| 46 | + bye |
| 47 | +EOF" /dev/null 2>&1 | tee $output_file | while read line; do |
| 48 | + if [[ "$line" == *'MB/s'* ]]; then |
| 49 | + #TRANSFER_MBS=$(echo "$line" | awk '{print $(NF-2)}' | sed 's/MB\/s//') |
| 50 | + TRANSFER_MBS="$(echo "$line" | awk '{print $(NF-2)}' | sed 's/MB\/s//')" |
| 51 | + printf " $TRANSFER_MBS" >> $LOG_FILE |
| 52 | + fi |
| 53 | + done |
| 54 | +} |
| 55 | + |
| 56 | +do_wolfssh_put_test() { |
| 57 | + cp $TEST_FILE $TEST_FILE-out |
| 58 | + RESULT=$(./examples/sftpclient/wolfsftp -g -l $TEST_FILE -r $TEST_FILE-out -i $PWD/keys/hansel-key-ecc.der -j $PWD/keys/hansel-key-ecc.pub -u jak -p $PORT) |
| 59 | + TRANSFER_MBS="$(echo "$RESULT" | awk '{print $(NF-0)}' | sed 's/MB\/s//')" |
| 60 | + printf " $TRANSFER_MBS" >> $LOG_FILE |
| 61 | +} |
| 62 | + |
| 63 | +do_wolfssh_get_test() { |
| 64 | + cp $TEST_FILE $TEST_FILE-out |
| 65 | + RESULT=$(./examples/sftpclient/wolfsftp -G -l $TEST_FILE-out -r $TEST_FILE -i $PWD/keys/hansel-key-ecc.der -j $PWD/keys/hansel-key-ecc.pub -u jak -p $PORT) |
| 66 | + TRANSFER_MBS="$(echo "$RESULT" | awk '{print $(NF-0)}' | sed 's/MB\/s//')" |
| 67 | + printf " $TRANSFER_MBS" >> $LOG_FILE |
| 68 | +} |
| 69 | + |
| 70 | +# Create a log with averages |
| 71 | +do_create_average() { |
| 72 | + awk -F', ' '{sum[$1]+=$2; count[$1]++} END {for (i in sum) print i, sum[i]/count[i]}' "$LOG_FILE" | sort -n > "$AVERAGE_FILE" |
| 73 | + sed -i 's/ /, /' $AVERAGE_FILE |
| 74 | +} |
| 75 | + |
| 76 | + |
| 77 | +do_create_plot() { |
| 78 | + gnuplot -e "set title '$TITLE';set ylabel 'MB/s';set xlabel 'File Size in Bytes';set grid; set format x \"%2.1t{/Symbol \264}10^{%L}\"; set term png;set output '$OUTPUT_FILE';plot '$LOG_FILE' using 1:2, '$AVERAGE_FILE' with lines lc rgb 'red' lw 2, '$COMPARE_TO' with lines lc rgb 'gold' lw 2" |
| 79 | +} |
| 80 | + |
| 81 | +echo "Starting tests" |
| 82 | +echo "Getting the average over $NUMBER_RUNS runs" |
| 83 | + |
| 84 | +# create openssh average if not found |
| 85 | +AVERAGE_FILE="$PWD/openssh-average-upload.csv" |
| 86 | +if [ ! -f "$AVERAGE_FILE" ]; then |
| 87 | + echo "Collecting openssh average upload" |
| 88 | + rm -f $LOG_FILE && touch $LOG_FILE |
| 89 | + for run in $(seq 1 $NUMBER_RUNS); do |
| 90 | + printf "Run $run: " |
| 91 | + for i in "${FILE_SIZES[@]}"; do |
| 92 | + tail -c "$i" /dev/urandom > "$TEST_FILE" |
| 93 | + printf "$i," >> $LOG_FILE |
| 94 | + do_openssh_put_test |
| 95 | + printf "\n" >> $LOG_FILE |
| 96 | + done |
| 97 | + printf "done\n" |
| 98 | + done |
| 99 | + |
| 100 | + do_create_average |
| 101 | + echo "" |
| 102 | +fi |
| 103 | + |
| 104 | +# create wolfssh average upload |
| 105 | +echo "Collecting wolfssh average upload" |
| 106 | +rm -f $LOG_FILE && touch $LOG_FILE |
| 107 | +for run in $(seq 1 $NUMBER_RUNS); do |
| 108 | + printf "Run $run: " |
| 109 | + for i in "${FILE_SIZES[@]}"; do |
| 110 | + tail -c "$i" /dev/urandom > "$TEST_FILE" |
| 111 | + printf "$i," >> $LOG_FILE |
| 112 | + do_wolfssh_put_test |
| 113 | + printf "\n" >> $LOG_FILE |
| 114 | + done |
| 115 | + printf "done\n" |
| 116 | +done |
| 117 | + |
| 118 | +# compile and plot the results of average upload |
| 119 | +AVERAGE_FILE="$PWD/wolfssh-average-upload.csv" |
| 120 | +do_create_average |
| 121 | + |
| 122 | +TITLE="SFTP Client Upload Speeds [$NUMBER_RUNS runs]" |
| 123 | +COMPARE_TO="$PWD/openssh-average-upload.csv" |
| 124 | +AVERAGE_FILE="$PWD/wolfssh-average-upload.csv" |
| 125 | +OUTPUT_FILE="$PWD/upload-results.png" |
| 126 | +do_create_plot |
| 127 | + |
| 128 | +# create openssh average download if not found |
| 129 | +AVERAGE_FILE="$PWD/openssh-average-download.csv" |
| 130 | +if [ ! -f "$AVERAGE_FILE" ]; then |
| 131 | + echo "Collecting openssh average download" |
| 132 | + rm -f $LOG_FILE && touch $LOG_FILE |
| 133 | + for run in $(seq 1 $NUMBER_RUNS); do |
| 134 | + printf "Run $run: " |
| 135 | + for i in "${FILE_SIZES[@]}"; do |
| 136 | + tail -c "$i" /dev/urandom > "$TEST_FILE" |
| 137 | + printf "$i," >> $LOG_FILE |
| 138 | + do_openssh_get_test |
| 139 | + printf "\n" >> $LOG_FILE |
| 140 | + done |
| 141 | + printf "done\n" |
| 142 | + done |
| 143 | + |
| 144 | + do_create_average |
| 145 | + echo "" |
| 146 | +fi |
| 147 | + |
| 148 | +# create wolfssh average download |
| 149 | +echo "Collecting wolfssh average download" |
| 150 | +rm -f $LOG_FILE && touch $LOG_FILE |
| 151 | +for run in $(seq 1 $NUMBER_RUNS); do |
| 152 | + printf "Run $run: " |
| 153 | + for i in "${FILE_SIZES[@]}"; do |
| 154 | + tail -c "$i" /dev/urandom > "$TEST_FILE" |
| 155 | + printf "$i," >> $LOG_FILE |
| 156 | + do_wolfssh_get_test |
| 157 | + printf "\n" >> $LOG_FILE |
| 158 | + done |
| 159 | + printf "done\n" |
| 160 | +done |
| 161 | + |
| 162 | +# compile and plot the results of average download speeds |
| 163 | +AVERAGE_FILE="$PWD/wolfssh-average-download.csv" |
| 164 | +do_create_average |
| 165 | + |
| 166 | +TITLE="SFTP Client Download Speeds [$NUMBER_RUNS runs]" |
| 167 | +COMPARE_TO="$PWD/openssh-average-download.csv" |
| 168 | +AVERAGE_FILE="$PWD/wolfssh-average-download.csv" |
| 169 | +OUTPUT_FILE="$PWD/download-results.png" |
| 170 | +do_create_plot |
| 171 | + |
| 172 | +rm -rf $TEST_FILE |
| 173 | +rm -rf $TEST_FILE-out |
0 commit comments