#!/bin/sh
#------------------------------------------------------------------------------
#	功能: [ssh方式]执行[远程]Shell脚本驱动插件程序
#
#	更新日志：20171030 由最开始的集成转换为插件，增强扩展原只能执行当前用户可读的 shell 脚本，
#		通过ssh协议，在免密的情况下可以执行本机不同用户和非本机的其他用户
#
#	参数: 
#		1. progname   脚本的全路径名称
#		2. para       脚本的入口参数，格式为 para1 para2 ...
#		3. exppara    对应相应脚本的exppara属性，为脚本文件所在用户，当该参数为空时，默认为当前用户,如果不是当前用户时，为远程连接IP地址和用户名
#			sip=172.22.1.1     ssh远程IP地址
#			sport=9527         ssh远程连接端口
#			suser=taskctl      ssh远程用户
#	返回值: 脚本执行后的实际返回值
#	
#	流程模式代码任务定义举例:
#	1、默认2个输入参数的安装用户可执行的服务器上的sh脚本(如果参数多个，以此类推)
#	<sh>
#		<name>job1</name>
#		<progname>/home/taskctl/test.sh</progname> 
#		<para>para1 para2</para>
#	</sh>
#	2、在同一台服务器上的其他用户可执行，当前节点安装用户不可执行sh脚本，当前用户和目标用户做了ssh免密(如果参数多个，以此类推)
#	<sh>
#		<name>job1</name>
#		<progname>/home/username/test.sh</progname> 
#		<para>para1 para2</para>
#		<exppara>[sport=22,]suser=taskctl</exppara>
#	</sh>
#	3、不同服务器上，但都是shell作业，当前节点安装用户已经做了ssh免密(如果参数多个，以此类推)
#	<sh>
#		<name>job1</name>
#		<progname>/home/username/test.sh</progname> 
#		<para>para1 para2</para>
#		<exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>
#	</sh>
#
#------------------------------------------------------------------------------

if [ $# -ne 3 ]
then
    echo "Param error !"
    echo "Usage: $0 progname para expara"
    exit 126
fi

#------------------------------------------------------------------------------
#      第一步： 接收参数
#------------------------------------------------------------------------------ 
ProgName=$1
Para=$2
ExpPara=$3

#------------------------------------------------------------------------------
#      第二步： 解析 exppara
#------------------------------------------------------------------------------ 
function getValue(){
	if [ $# -ne 2 ] 
	then
		echo "......."
		exit 1
	fi
	
	str=`echo $2|awk -v record=$1 'BEGIN {
		split(record,myarray,",");
		
	}
	END{
		for (i in myarray){
			if (myarray[i]~$1){
				if ( index(myarray[i],$1) == 1){
					print myarray[i];
					break;
				}
			}
			}
	}
	'`
	echo $str|awk -F"=" '{print $2}'
}

ExpPara=`echo $ExpPara`    #此处为了去前后空格,以便判断是否真正有入口参数
#通过判断 exppara 是否为空，决定是直接执行sh还是走ssh通道
#直接执行
if [ ! -n "$ExpPara" ] 
then
	sh $ProgName $Para
	ret=$?
	exit $ret
fi
#走ssh通道
sip=`getValue $ExpPara sip`
#通过判断 sip 是否为空，决定是直接执行本机其他用户还是远程服务器上的sh脚本
if [ ! -n "$sip" ] 
then
	sip=localhost
fi
#sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽
sport=22
suser=`getValue $ExpPara suser`

#------------------------------------------------------------------------------
#      第三步： 检测是否配置了ssh免密连接
#------------------------------------------------------------------------------
ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
if [ $? != 0 ];then
	echo -e "\nSSH Connection failed $sip"
	echo -e "\nssh-keygen -t rsa -P ''"
	echo -e "\nssh-copy-id -p $sport $suser@$sip"
	exit 1
else
	echo -e "\nSSH connection succeeded $sip"
fi

#------------------------------------------------------------------------------
#      第四步： 运行JOB，并返回结果
#------------------------------------------------------------------------------ 
#echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip bash --login $ProgName $Para"    #此处为打印执行命令行,以便调试判断是否真正有入口参数
ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "bash --login $ProgName $Para"
ret=$?
exit $ret