FirmwareUpdateProcedure.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. using AwInitilizer.Assist;
  2. using AwInitilizer.Model;
  3. using InitializerModel;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.Specialized;
  8. using System.ComponentModel;
  9. using System.Globalization;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Net;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Web;
  16. using System.Windows.Ink;
  17. namespace AwInitilizer.Procedure
  18. {
  19. public class FirmwareUpdateProcedure : ProcedureBase
  20. {
  21. internal string Version;
  22. internal string fileName;
  23. internal string module;
  24. //internal int SleepMinuts = 6;
  25. private FirmwareUpdateModel _model;
  26. public FirmwareUpdateProcedure(FirmwareUpdateModel model) :base()
  27. {
  28. _model = model;
  29. Name = string.Format("Firmware {0}", model.Module);
  30. Content = string.Format("Update {0} Firemware and check version matched", model.Module);
  31. Version = model.Version;
  32. fileName = model.FirmwareFileName;
  33. module = model.Module;
  34. }
  35. internal override async Task<bool> Run()
  36. {
  37. var oldVersion = await GetSpecificVersion();
  38. MesLogData.Add($"{module}OldVersion", oldVersion, true);
  39. if (string.IsNullOrEmpty(oldVersion))
  40. {
  41. InfoLog += $"Get {Name} version failed\n";
  42. Logger.Print($"Get {Name} version failed",isError:true);
  43. return false;
  44. }
  45. InfoLog += $"version before update : {oldVersion}\n";
  46. if (oldVersion == Version)
  47. {
  48. Logger.Print("Updated version detected");
  49. }
  50. Logger.Print("Firmware Uploading...");
  51. var uploadResult = await Uploadfiremware(fileName);
  52. MesLogData.Add($"{module}Upload", uploadResult.ToString(), true);
  53. if (uploadResult)
  54. {
  55. //wait restart
  56. Logger.Print("Waiting restart..");
  57. bool response = false;
  58. int pollinfCnt = 0;
  59. await Task.Delay(TimeSpan.FromMinutes(2));
  60. for (pollinfCnt = 0; pollinfCnt < 28; pollinfCnt++)
  61. {
  62. await Task.Delay(TimeSpan.FromSeconds(15));
  63. response = await ChekCsuBootCompelete();
  64. if (response)
  65. break;
  66. }
  67. //timeout
  68. if(pollinfCnt>=28)
  69. {
  70. Logger.Print("Wait restart timeout",isError:true);
  71. return false;
  72. }
  73. }
  74. else
  75. {
  76. InfoLog += $"Upload {Name} failed\n";
  77. Logger.Print($"Upload {Name} failed", isError: true);
  78. return false;
  79. }
  80. var updatedVersion = await GetSpecificVersion();
  81. //MesLogData.Add($"{module}NewVersion", updatedVersion);
  82. if (string.IsNullOrEmpty(updatedVersion))
  83. {
  84. InfoLog += $"Get updated {Name} version failed\n";
  85. Logger.Print($"Get updated {Name} version failed", isError: true);
  86. MesLogData.Add($"{module}NewVersion", "empty" , false);
  87. return false;
  88. }
  89. InfoLog += $"Get updated version : {updatedVersion}\n";
  90. bool isVersionMatched = false;
  91. if(module== "CsuRootFsFwRev")
  92. {
  93. isVersionMatched = updatedVersion.StartsWith(Version);
  94. }
  95. else
  96. {
  97. isVersionMatched = updatedVersion == Version;
  98. }
  99. if (isVersionMatched)
  100. {
  101. InfoLog += $"{Name}:Updated Version mismatched\n";
  102. Logger.Print($"{Name}:Updated Version mismatched", isError: true);
  103. MesLogData.Add($"{module}NewVersion", updatedVersion, false);
  104. return false;
  105. }
  106. else
  107. {
  108. MesLogData.Add($"{module}NewVersion", updatedVersion, true);
  109. Logger.Print($"{Name}:updated success");
  110. }
  111. return true;
  112. }
  113. internal virtual async Task<string> GetSpecificVersion()
  114. {
  115. var versions = await GetVersion();
  116. if(versions == null ||
  117. !versions.ContainsKey(module))
  118. {
  119. return "";
  120. }
  121. return versions[module];
  122. }
  123. internal async Task<Dictionary<string,string>> GetVersion(bool isConnectTest = false)
  124. {
  125. try
  126. {
  127. var result = await EvApi.GetVersion();
  128. InfoLog += $"get version response:{result.Response}\n";
  129. return result.Result;
  130. }
  131. catch(Exception e)
  132. {
  133. if (!isConnectTest)
  134. {
  135. Logger.Print("Get Version Failed", isError: true);
  136. Logger.Print(e.Message + "", isError: true);
  137. InfoLog += "Get Version Failed\n";
  138. InfoLog += e.Message;
  139. InfoLog += "\n";
  140. }
  141. return null;
  142. }
  143. }
  144. internal async Task<bool> Uploadfiremware(string fileName)
  145. {
  146. try
  147. {
  148. var result = await EvApi.Uploadfirmware(fileName);
  149. InfoLog += $"get firmware update response {result.Response}\n";
  150. if (result.Response != null && result.Response.Contains("file is uploaded"))
  151. return true;
  152. return false;
  153. //using (var stream = File.Open(fileName, FileMode.Open))
  154. //{
  155. // UploadFileAsync(
  156. // new NameValueCollection()
  157. // {
  158. // {"fw_tag","iso" }
  159. // },
  160. // new UploadFile()
  161. // {
  162. // Name = "file",
  163. // Filename = Path.GetFileName(fileName),
  164. // Stream = stream
  165. // }
  166. // );
  167. //}
  168. //return true;
  169. //using (var stream = File.Open(fileName, FileMode.Open))
  170. //{
  171. // var response = await UploadFiles(
  172. // $"https://{ServerIpAddress}/upgrade_iso_action.php",
  173. // new List<UploadFile>() {
  174. // new UploadFile()
  175. // {
  176. // Name="file",
  177. // Filename= Path.GetFileName(fileName),
  178. // Stream = stream
  179. // }
  180. // },
  181. // new NameValueCollection() {
  182. // {"fw_tag","iso" }
  183. // }
  184. // );
  185. // var responseStr = Encoding.ASCII.GetString(response).ToLower();
  186. // InfoLog += $"get firmware update response {responseStr}\n";
  187. // if (responseStr.Contains("file is uploaded"))
  188. // return true;
  189. // return false;
  190. //}
  191. //return true;
  192. //using (WebClient webClient = new WebClient())
  193. //{
  194. // NameValueCollection parameters = new NameValueCollection();
  195. // parameters.Add("fw_tag", "iso");
  196. // webClient.QueryString = parameters;
  197. // var responseBytes = await webClient.UploadFileTaskAsync($"https://{ServerIpAddress}/upgrade_iso_action.php", fileName);
  198. // string responseString = Encoding.ASCII.GetString(responseBytes);
  199. // return true;
  200. //}
  201. }
  202. catch(Exception e)
  203. {
  204. Logger.Print("Upload Firmware Failed", isError: true);
  205. Logger.Print(e.Message + "", isError: true);
  206. InfoLog += "Upload Firmware Failed\n";
  207. InfoLog += e.Message;
  208. InfoLog += "\n";
  209. return false;
  210. }
  211. }
  212. public async Task<byte[]> UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values)
  213. {
  214. var request = (HttpWebRequest) HttpWebRequest.Create(address);
  215. //request.Timeout = 10 * 1000;
  216. request.KeepAlive = true;
  217. request.Accept = "*/*";
  218. request.Method = "POST";
  219. request.Referer = address;
  220. request.Expect = "";
  221. var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
  222. request.ContentType = "multipart/form-data; boundary=" + boundary;
  223. boundary = "--" + boundary;
  224. using (var requestStream = request.GetRequestStream())
  225. {
  226. // Write the values
  227. foreach (string name in values.Keys)
  228. {
  229. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  230. requestStream.Write(buffer, 0, buffer.Length);
  231. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
  232. requestStream.Write(buffer, 0, buffer.Length);
  233. buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
  234. requestStream.Write(buffer, 0, buffer.Length);
  235. }
  236. // Write the files
  237. foreach (var file in files)
  238. {
  239. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  240. requestStream.Write(buffer, 0, buffer.Length);
  241. buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
  242. requestStream.Write(buffer, 0, buffer.Length);
  243. var ctype = MimeMapping.GetMimeMapping(file.Filename);
  244. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", MimeMapping.GetMimeMapping(file.Filename), Environment.NewLine));
  245. requestStream.Write(buffer, 0, buffer.Length);
  246. file.Stream.CopyTo(requestStream);
  247. buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
  248. requestStream.Write(buffer, 0, buffer.Length);
  249. }
  250. var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--");
  251. requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
  252. }
  253. using (var response = await request.GetResponseAsync())
  254. using (var responseStream = response.GetResponseStream())
  255. using (var stream = new MemoryStream())
  256. {
  257. responseStream.CopyTo(stream);
  258. return stream.ToArray();
  259. }
  260. }
  261. [Obsolete]
  262. public void UploadFileAsync(NameValueCollection values, UploadFile file )
  263. {
  264. //to fire events on the calling thread
  265. var _asyncOperation = AsyncOperationManager.CreateOperation(null);
  266. var ms = new MemoryStream();
  267. //make a copy of the input stream in case sb uses disposable stream
  268. file.Stream.CopyTo(ms);
  269. //you cannot set stream position often enough to zero
  270. ms.Position = 0;
  271. Task.Factory.StartNew(() =>
  272. {
  273. try
  274. {
  275. const string contentType = "application/octet-stream";
  276. var request = WebRequest.Create($"https://{ServerIpAddress}/get_query_action.php");
  277. request.Method = "POST";
  278. var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
  279. request.ContentType = "multipart/form-data; boundary=" + boundary;
  280. boundary = "--" + boundary;
  281. var dataStream = new MemoryStream();
  282. byte[] buffer;
  283. // Write the values
  284. foreach (string name in values.Keys)
  285. {
  286. buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  287. dataStream.Write(buffer, 0, buffer.Length);
  288. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
  289. dataStream.Write(buffer, 0, buffer.Length);
  290. buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
  291. dataStream.Write(buffer, 0, buffer.Length);
  292. }
  293. // Write the file
  294. buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  295. dataStream.Write(buffer, 0, buffer.Length);
  296. buffer = Encoding.UTF8.GetBytes($"Content-Disposition: form-data; name=\"{file.Name}\"; filename=\"{file.Filename}\"{Environment.NewLine}");
  297. dataStream.Write(buffer, 0, buffer.Length);
  298. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", MimeMapping.GetMimeMapping(file.Filename), Environment.NewLine));
  299. dataStream.Write(buffer, 0, buffer.Length);
  300. ms.CopyTo(dataStream);
  301. buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
  302. dataStream.Write(buffer, 0, buffer.Length);
  303. buffer = Encoding.ASCII.GetBytes(boundary + "--");
  304. dataStream.Write(buffer, 0, buffer.Length);
  305. dataStream.Position = 0;
  306. //IMPORTANT: set content length to directly write to network socket
  307. request.ContentLength = dataStream.Length;
  308. var requestStream = request.GetRequestStream();
  309. //Write data in chunks and report progress
  310. var size = dataStream.Length;
  311. const int chunkSize = 64 * 1024;
  312. buffer = new byte[chunkSize];
  313. long bytesSent = 0;
  314. int readBytes;
  315. while ((readBytes = dataStream.Read(buffer, 0, buffer.Length)) > 0)
  316. {
  317. requestStream.Write(buffer, 0, readBytes);
  318. bytesSent += readBytes;
  319. var status = "Uploading... " + bytesSent / 1024 + "KB of " + size / 1024 + "KB";
  320. Console.WriteLine(status);
  321. }
  322. //get response
  323. using (var response = request.GetResponse())
  324. using (var responseStream = response.GetResponseStream())
  325. using (var stream = new MemoryStream())
  326. {
  327. // ReSharper disable once PossibleNullReferenceException - exception would get catched anyway
  328. responseStream.CopyTo(stream);
  329. var result = Encoding.Default.GetString(stream.ToArray());
  330. Console.WriteLine(result);
  331. }
  332. }
  333. catch (Exception e )
  334. {
  335. Console.WriteLine(e);
  336. }
  337. }, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
  338. }
  339. }
  340. }