You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
6.2 KiB
194 lines
6.2 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using FileTransDataObject;
|
|
using Sog;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
namespace SMCenter
|
|
{
|
|
// 文件拉取命令
|
|
public class FilePullCmdProc : BaseCmdProc
|
|
{
|
|
public override void ClearData()
|
|
{
|
|
m_nowCmd = null;
|
|
}
|
|
|
|
// cmdParams[0] is serverId
|
|
public override int DoCmd(out string msg)
|
|
{
|
|
if (m_nowCmd.CMD == "cancelpull")
|
|
{
|
|
CancelPull();
|
|
msg = "";
|
|
return 0;
|
|
}
|
|
|
|
if (m_nowCmd.CmdParams.Count < 1)
|
|
{
|
|
msg = "invalid cmd param";
|
|
return -1;
|
|
}
|
|
|
|
if (CmdUtils.CheckValidServerId(m_nowCmd.CmdParams[0], out string fixSvrId) == false)
|
|
{
|
|
msg = "invalid server id";
|
|
return -1;
|
|
}
|
|
|
|
if (fixSvrId != null)
|
|
{
|
|
m_nowCmd.CmdParams[0] = fixSvrId;
|
|
}
|
|
|
|
SMProcAppMgr.Instance.GetAllMatchingProc(m_nowCmd.CmdParams[0], m_nowCmd.m_procs);
|
|
// HostName去重
|
|
CmdProcInfoDistinct();
|
|
|
|
if (CenterFilePullMng.Instance.DoPullCmd(m_nowCmd, out msg) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
// 通知agent pull cmd
|
|
long nowSec = AppTime.ServerAppTime.GetTimeSecond();
|
|
foreach (var cmdInfo in m_nowCmd.m_procs.Values)
|
|
{
|
|
if (cmdInfo.SendCmdToHostTime == 0)
|
|
{
|
|
SendCmdToHost(cmdInfo);
|
|
cmdInfo.SendCmdToHostTime = nowSec;
|
|
}
|
|
}
|
|
|
|
msg += m_nowCmd.ConsoleInput + " begin ...";
|
|
TraceLog.Trace("FilePullCmdProc.DoCmd {0}", msg);
|
|
return 0;
|
|
}
|
|
|
|
public override int UpdateCmd(long tMs)
|
|
{
|
|
if (CenterFilePullMng.Instance.isFinish)
|
|
{
|
|
AckConsoleCmdResult();
|
|
CenterFilePullMng.Instance.Clear();
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
private void AckConsoleCmdResult()
|
|
{
|
|
SMConsoleCommandRes res = new SMConsoleCommandRes();
|
|
res.Command = m_nowCmd.ConsoleInput;
|
|
res.Message = "";
|
|
|
|
var recvMgr = CenterFilePullMng.Instance.recvMgr;
|
|
|
|
string procResult = "";
|
|
string pullFiles = null;
|
|
|
|
foreach (var proc in m_nowCmd.m_procs.Values)
|
|
{
|
|
string hostName = proc.SMApp.HostName;
|
|
var recvNode = recvMgr.GetRecvNode(hostName);
|
|
if (recvNode == null)
|
|
{
|
|
procResult += string.Format("\n{0}: NoRes", hostName);
|
|
}
|
|
else
|
|
{
|
|
procResult += string.Format("\n{0}: ", hostName);
|
|
|
|
// pull file的文件列表对于所有recvNode都是相同的
|
|
if (pullFiles == null)
|
|
{
|
|
for (int i = 0; i < recvNode.fileList.Count; i++)
|
|
{
|
|
pullFiles += recvNode.fileList[i].fileName;
|
|
// 每行3个文件
|
|
pullFiles += i % 3 == 2 ? "\n\t" : "\t";
|
|
}
|
|
}
|
|
|
|
// 1表示成功
|
|
string str = string.Join(' ', recvNode.fileList.Where(r => r.recvState != 1).Select(r => r.fileName));
|
|
if (str.Length == 0)
|
|
{
|
|
procResult += "Succ";
|
|
}
|
|
else
|
|
{
|
|
procResult += "Fail (" + str + ")";
|
|
}
|
|
}
|
|
|
|
if (pullFiles != null)
|
|
{
|
|
res.Message += "Files: " + pullFiles;
|
|
}
|
|
res.Message += procResult;
|
|
}
|
|
|
|
SMCenterNet.Instance.SendMsg(m_nowCmd.SessionId, SMMsgID.ConsoleCommandRes, res);
|
|
}
|
|
|
|
|
|
private void SendCmdToHost(CmdProcInfo cmdInfo)
|
|
{
|
|
string hostname = cmdInfo.SMApp.HostName;
|
|
ClientInfo client = SMCenterNet.Instance.GetClientInfoByName(hostname);
|
|
if (client == null)
|
|
{
|
|
TraceLog.Error("FilePullCmdProc.SendCmdToHost host {0} agent not register!", hostname);
|
|
return;
|
|
}
|
|
|
|
SMAgentDoCommandReq req = new SMAgentDoCommandReq();
|
|
req.Command = m_nowCmd.CMD;
|
|
req.SeqNum = m_nowCmd.SeqNum;
|
|
req.ServerId = cmdInfo.SMApp.AppId;
|
|
req.StopTimeout = cmdInfo.SMApp.StopTimeout;
|
|
req.CenterName = SMCenterUtils.HostName;
|
|
req.TestMode = SMCenterUtils.Config.testMode;
|
|
client.SendMsg(req, SMMsgID.AgentDoCommandReq);
|
|
}
|
|
|
|
public override void OnAgentDoCommandRes(ClientInfo client, SMAgentDoCommandRes res)
|
|
{
|
|
if (m_nowCmd.SeqNum != res.SeqNum)
|
|
{
|
|
TraceLog.Error("FilePullCmdProc.OnAgentDoCommandRes CMD {0} svrId {1} seq not same, local {2} res {3}"
|
|
, res.Command, res.ServerId, m_nowCmd.SeqNum, res.SeqNum);
|
|
return;
|
|
}
|
|
|
|
if (m_nowCmd.m_procs.ContainsKey(res.ServerId) == false)
|
|
{
|
|
TraceLog.Error("FilePullCmdProc.OnAgentDoCommandRes CMD {0} serverId {1} not in m_procs, skip"
|
|
, res.Command, res.ServerId);
|
|
return;
|
|
}
|
|
|
|
TraceLog.Trace("FilePullCmdProc.OnAgentDoCommandRes CMD {0} svrId {1} ret {2} msg {3}"
|
|
, res.Command, res.ServerId, res.ResultCode, res.Result);
|
|
|
|
// 文件不存在或异常, 先回复console
|
|
if (res.ResultCode != ResResultCode.Success)
|
|
{
|
|
SMConsoleCommandRes csRes = new SMConsoleCommandRes();
|
|
csRes.Command = m_nowCmd.ConsoleInput;
|
|
csRes.Message = res.Result;
|
|
SMCenterNet.Instance.SendMsg(m_nowCmd.SessionId, SMMsgID.ConsoleCommandRes, csRes);
|
|
}
|
|
}
|
|
|
|
public void CancelPull()
|
|
{
|
|
TraceLog.Trace("FilePullCmdProc.CancelPull");
|
|
|
|
CenterFilePullMng.Instance.CancelPull();
|
|
}
|
|
}
|
|
}
|
|
|