FirmwareBundleUploadProcedure.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using AwInitilizer.Model;
  7. using AwInitilizer.Assist;
  8. using System.Collections.Specialized;
  9. using System.Globalization;
  10. using System.Net;
  11. using System.Web;
  12. using System.IO;
  13. namespace AwInitilizer.Procedure
  14. {
  15. public class FirmwareBundleUploadProcedure : ProcedureBase
  16. {
  17. public FirmwareBundleUploadProcedure() : base()
  18. {
  19. Name = string.Format("Firmware Upload");
  20. Content = string.Format("Upload all Firemware");
  21. }
  22. internal override async Task<bool> Run()
  23. {
  24. //wait restart
  25. Logger.Print("Waiting restart..");
  26. bool response = false;
  27. int pollingCnt = 0;
  28. for (pollingCnt = 0; pollingCnt < 56; pollingCnt++)
  29. {
  30. await Task.Delay(TimeSpan.FromSeconds(15));
  31. response = await ChekCsuBootCompelete();
  32. if (response)
  33. break;
  34. }
  35. //timeout
  36. if (pollingCnt >= 56)
  37. {
  38. Logger.Print("Wait restart timeout", isError: true);
  39. InfoLog += "Wait restart timeout\n";
  40. LogPair.Add($"UploadStartWait", "fail");
  41. return false;
  42. }
  43. LogPair.Add($"UploadStartWait", "0");
  44. //upload firmware
  45. var updateList = UpdateData.FirmwareUpdateModels;
  46. //open all file stream
  47. //List<FileStream> firmwareFileStream = new List<FileStream>();
  48. List<UploadFile> UploadFileList = new List<UploadFile>();
  49. try
  50. {
  51. for(int modelIndex = 0;modelIndex < updateList.Count;modelIndex++) //foreach (var model in updateList)
  52. {
  53. var model = updateList[modelIndex];
  54. var stream = File.Open(model.FirmwareFileName, FileMode.Open);
  55. var uploadFile = new UploadFile()
  56. {
  57. Name = string.Format("files[]", modelIndex + 1),
  58. Filename = Path.GetFileName(model.FirmwareFileName),
  59. Stream = stream
  60. };
  61. UploadFileList.Add(uploadFile);
  62. }
  63. }
  64. catch (Exception e)
  65. {
  66. InfoLog += $"create file stream failed";
  67. LogPair.Add($"FirmwareUpload", "0");
  68. return false;
  69. }
  70. //upload
  71. try
  72. {
  73. var uploadResult = await UploadFiles(
  74. $"https://{ServerIpAddress}/upgrade_iso_action.php",
  75. files: UploadFileList,
  76. new NameValueCollection() {
  77. {"fw_tag","iso" }
  78. }
  79. );
  80. var responseStr = Encoding.ASCII.GetString(uploadResult).ToLower();
  81. InfoLog += $"get firmware update response {responseStr}\n";
  82. if (responseStr.Contains("file is uploaded"))
  83. return true;
  84. return false;
  85. }
  86. catch
  87. {
  88. InfoLog += $"file upload failed";
  89. LogPair.Add($"FirmwareUpload", "0");
  90. }
  91. LogPair.Add($"FirmwareUpload", "1");
  92. //release all
  93. foreach (var uploadFile in UploadFileList)
  94. {
  95. if(uploadFile!=null && uploadFile.Stream!=null)
  96. {
  97. uploadFile.Stream.Close();
  98. }
  99. }
  100. return true;
  101. }
  102. public async Task<byte[]> UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values)
  103. {
  104. var request = (HttpWebRequest)HttpWebRequest.Create(address);
  105. //request.Timeout = 10 * 1000;
  106. request.KeepAlive = true;
  107. request.Accept = "*/*";
  108. request.Method = "POST";
  109. request.Referer = address;
  110. request.Expect = "";
  111. var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
  112. request.ContentType = "multipart/form-data; boundary=" + boundary;
  113. boundary = "--" + boundary;
  114. string sendString = "";
  115. using (var requestStream = request.GetRequestStream())
  116. {
  117. // Write the values
  118. foreach (string name in values.Keys)
  119. {
  120. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  121. requestStream.Write(buffer, 0, buffer.Length);
  122. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
  123. requestStream.Write(buffer, 0, buffer.Length);
  124. buffer = Encoding.ASCII.GetBytes(values[name] + Environment.NewLine);
  125. requestStream.Write(buffer, 0, buffer.Length);
  126. }
  127. // Write the files
  128. foreach (var file in files)
  129. {
  130. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  131. requestStream.Write(buffer, 0, buffer.Length);
  132. buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
  133. requestStream.Write(buffer, 0, buffer.Length);
  134. var ctype = MimeMapping.GetMimeMapping(file.Filename);
  135. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", MimeMapping.GetMimeMapping(file.Filename), Environment.NewLine));
  136. requestStream.Write(buffer, 0, buffer.Length);
  137. file.Stream.CopyTo(requestStream);
  138. buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
  139. requestStream.Write(buffer, 0, buffer.Length);
  140. }
  141. var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--");
  142. requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
  143. }
  144. using (var response = await request.GetResponseAsync())
  145. using (var responseStream = response.GetResponseStream())
  146. using (var stream = new MemoryStream())
  147. {
  148. responseStream.CopyTo(stream);
  149. return stream.ToArray();
  150. }
  151. }
  152. }
  153. }