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.
240 lines
7.0 KiB
240 lines
7.0 KiB
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Security.Cryptography;
|
|
using System.Threading;
|
|
|
|
|
|
namespace SMAgentUpdater
|
|
{
|
|
class Program
|
|
{
|
|
private static string updateFilePath = "../data/agentRecv/";
|
|
|
|
static void Log(string strLog)
|
|
{
|
|
try
|
|
{
|
|
using (StreamWriter w = File.AppendText("updatelog.txt"))
|
|
{
|
|
var msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + strLog + "\n";
|
|
w.WriteLine("{0}", msg);
|
|
}
|
|
}
|
|
catch (Exception )
|
|
{
|
|
}
|
|
}
|
|
|
|
static void Log(string strFormat, params object[] argvList)
|
|
{
|
|
try
|
|
{
|
|
string strLog = string.Format(strFormat, argvList);
|
|
using (StreamWriter w = File.AppendText("updatelog.txt"))
|
|
{
|
|
var msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + strLog + "\n";
|
|
w.Write("{0}", msg);
|
|
}
|
|
}
|
|
catch (Exception )
|
|
{
|
|
}
|
|
}
|
|
|
|
static void LogException(Exception ex)
|
|
{
|
|
try
|
|
{
|
|
Log("catch one exception");
|
|
Log(ex.Message);
|
|
Log(ex.Source);
|
|
Log(ex.StackTrace);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
|
|
static bool IsWindows()
|
|
{
|
|
var os = Environment.OSVersion.ToString().ToLowerInvariant();
|
|
return os.Contains("windows");
|
|
}
|
|
|
|
static string GetExeFileName()
|
|
{
|
|
string exename = "SMAgent";
|
|
if (IsWindows())
|
|
{
|
|
exename += ".exe";
|
|
}
|
|
return exename;
|
|
}
|
|
|
|
static bool IsFileExist(string path)
|
|
{
|
|
if (File.Exists(path) == false)
|
|
{
|
|
Log("file {0} not exist", path);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// recvFile目录下SMAgent和bin目录下MD5是否一致,如果recvFile新则更新
|
|
static bool NeedUpdateAgent()
|
|
{
|
|
// 当前运行文件和更新程序在同一层级
|
|
var dllFile = "SMAgent.dll";
|
|
var pdbFile = "SMAgent.pdb";
|
|
|
|
// 更新文件位置
|
|
var updateDllFile = updateFilePath + "SMAgent.dll";
|
|
var updatePdbFile = updateFilePath + "SMAgent.pdb";
|
|
|
|
|
|
if (IsFileExist(dllFile) == false || IsFileExist(pdbFile) == false
|
|
|| IsFileExist(updateDllFile) == false || IsFileExist(updatePdbFile) == false)
|
|
{
|
|
Log("file not exist");
|
|
return false;
|
|
}
|
|
|
|
|
|
try
|
|
{
|
|
string dllMd5, pdbMd5, updateExeMd5, updatePdbMd5;
|
|
using (var md5 = MD5.Create())
|
|
{
|
|
using (var stream = File.OpenRead(dllFile))
|
|
{
|
|
dllMd5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
|
|
}
|
|
|
|
using (var stream = File.OpenRead(pdbFile))
|
|
{
|
|
pdbMd5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
|
|
}
|
|
|
|
using (var stream = File.OpenRead(updateDllFile))
|
|
{
|
|
updateExeMd5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
|
|
}
|
|
|
|
using (var stream = File.OpenRead(updatePdbFile))
|
|
{
|
|
updatePdbMd5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
|
|
}
|
|
}
|
|
|
|
if (dllMd5 != updateExeMd5 || pdbMd5 != updatePdbMd5)
|
|
{
|
|
// 暂时用文件生成时间来比较哪个更新一些,用版本号比较的话每次都要修改有点麻烦
|
|
if (File.GetCreationTime(dllFile) < File.GetCreationTime(updateDllFile)
|
|
&& File.GetCreationTime(pdbFile) < File.GetCreationTime(updatePdbFile))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
Log("update file is older than current file...");
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
LogException(e);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static bool IsProcessRunning(string name)
|
|
{
|
|
var proc = Process.GetProcessesByName(name);
|
|
return proc.Length > 0;
|
|
}
|
|
|
|
static void StartProcess(string path, string name)
|
|
{
|
|
if (IsProcessRunning(name))
|
|
{
|
|
return;
|
|
}
|
|
|
|
int count = 0;
|
|
var exeFile = path + "/" + name;
|
|
Log("start process {0}", exeFile);
|
|
|
|
while (count < 5)
|
|
{
|
|
ProcessStartInfo startInfo = new ProcessStartInfo(exeFile, "--id=0.3.1 start &");
|
|
startInfo.CreateNoWindow = true;
|
|
startInfo.WorkingDirectory = path;
|
|
|
|
using (Process proc = new Process())
|
|
{
|
|
proc.StartInfo = startInfo;
|
|
proc.EnableRaisingEvents = true;
|
|
proc.Start();
|
|
}
|
|
|
|
Thread.Sleep(2000);
|
|
|
|
if (IsProcessRunning(name))
|
|
{
|
|
Log("start succ...");
|
|
return;
|
|
}
|
|
|
|
count++;
|
|
}
|
|
}
|
|
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
try
|
|
{
|
|
Log("curr dir {0}, prepare update ...", Directory.GetCurrentDirectory());
|
|
|
|
if (NeedUpdateAgent() == false)
|
|
{
|
|
Log("no need to update ...");
|
|
return;
|
|
}
|
|
|
|
var proc = Process.GetProcessesByName("SMAgent");
|
|
foreach (Process p in proc)
|
|
{
|
|
p.Kill();
|
|
//p.WaitForExit();
|
|
}
|
|
|
|
int count = 0;
|
|
while (IsProcessRunning("SMAgent") && count < 20)
|
|
{
|
|
Thread.Sleep(500);
|
|
count++;
|
|
}
|
|
|
|
if (! IsProcessRunning("SMAgent"))
|
|
{
|
|
File.Copy(updateFilePath + "SMAgent.dll", "SMAgent.dll", true);
|
|
File.Copy(updateFilePath + "SMAgent.pdb", "SMAgent.pdb", true);
|
|
|
|
StartProcess(Directory.GetCurrentDirectory(), "SMAgent");
|
|
}
|
|
else
|
|
{
|
|
Log("stop agent fail");
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
LogException(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|