i=cliffw,jitendra
Create a more portable way of remote shelling:
- set $DSH variable to either rsh or ssh (default)
The location of the results can be set with rslt_loc which defaults to /tmp.
Eliminate the "scp brutal hack" needed for non-shared filesystems.
A related work item could be to do a test to see if $rslt_loc is actually
shared between the nodes and not use remote_shell if it is indeed shared.
Specifically invoke gawk in obdfilter-survey where it uses gnu awk extensions
declare -a do_unload_echo
declare -a do_unload_echo
+DSH=${DSH:-"ssh"}
+
+dsh () {
+ local node="$1"
+ local user="$2"
+ shift 2
+ local command="$@"
+
+ local here=$(pwd)
+
+ command="cd $here; export PATH=/sbin:/usr/sbin:\$PATH; $command"
+
+ case $DSH in
+ ssh)
+ if [ -n "$user" ]; then
+ user="$user@"
+ fi
+ $DSH $user$node "$command"
+ ;;
+ rsh)
+ if [ -n "$user" ]; then
+ user="-l $user"
+ fi
+ $DSH $user $node "$command"
+ ;;
+ esac
+}
# This function executes the command sent through parameters to host
# parameters
# 1. hostname
# This function executes the command sent through parameters to host
# parameters
# 1. hostname
remote_shell () {
host=$1
shift
remote_shell () {
host=$1
shift
if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
eval "$cmds"
else
if [ "$host" = "localhost" -o "$host" = `uname -n` ]; then
eval "$cmds"
else
- custom_remote_shell $host "$cmds"
+ # split $host into $host and $user
+ local user=""
+ if [[ $host == *@* ]]; then
+ user=${host%@*}
+ host=${host#*@}
+ fi
+ dsh $host "$user" "$cmds"
get_stats () {
local rfile=$1
get_stats () {
local rfile=$1
'/^Selected device [0-9]+$/ {n = 0; next}\
/error/ {n = -1; exit}\
/^[0-9]+\/[0-9]+ Total: [0-9]+\.[0-9]+\/second$/ {n++; v=strtonum($3); \
'/^Selected device [0-9]+$/ {n = 0; next}\
/error/ {n = -1; exit}\
/^[0-9]+\/[0-9]+ Total: [0-9]+\.[0-9]+\/second$/ {n++; v=strtonum($3); \
# result file prefix (date/time + hostname makes unique)
# NB ensure path to it exists
# result file prefix (date/time + hostname makes unique)
# NB ensure path to it exists
-rslt=${rslt:-"/tmp/obdfilter_survey_`date +%F@%R`_`uname -n`"}
+rslt_loc=${rslt_loc:-"/tmp"}
+rslt=${rslt:-"$rslt_loc/obdfilter_survey_`date +%F@%R`_`uname -n`"}
# what tests to run (first must be write)
tests_str=${tests_str:-""}
# what tests to run (first must be write)
tests_str=${tests_str:-""}
echo "Specify the server NID"
exit 1;
fi
echo "Specify the server NID"
exit 1;
fi
- osc_names_string=`ssh root@"$server_nid" lctl dl`
+ osc_names_string=`dsh $server_nid root "lctl dl"`
count=0;
for name in $osc_names_str; do
count=$((count+1))
count=0;
for name in $osc_names_str; do
count=$((count+1))
fi
# Now do the server setup
setup_srv_obd $server_nid "ost_testfs"
fi
# Now do the server setup
setup_srv_obd $server_nid "ost_testfs"
- op_string=`ssh root@"$server_nid" lctl dl`
+ op_string=`dsh $server_nid root "lctl dl"`
t0=`date +%s.%N`
pidcount=0
for host in ${unique_hosts[@]}; do
t0=`date +%s.%N`
pidcount=0
for host in ${unique_hosts[@]}; do
- # brutal hack to deal with a non-shared /tmp
- scp -q ${cmdsf}_${host} ${host}:/tmp > /dev/null
- remote_shell $host bash ${cmdsf}_${host} &
+ remote_shell $host bash < ${cmdsf}_${host} &
pidarray[$pidcount]=$!
pidcount=$((pidcount+1))
done
pidarray[$pidcount]=$!
pidcount=$((pidcount+1))
done
tmpfi="${tmpf}_$idx"
echo "=============> $test $client_name" >> $workf
host="${host_names[$idx]}"
tmpfi="${tmpf}_$idx"
echo "=============> $test $client_name" >> $workf
host="${host_names[$idx]}"
- scp -q ${host}:$tmpfi $tmpfi > /dev/null
- cat $tmpfi >> $workf
+ remote_shell $host cat $tmpfi >> $workf
get_stats $tmpfi >> $tmpf
rm $tmpfi
done
get_stats $tmpfi >> $tmpf
rm $tmpfi
done