FirmwareBundleUploadProcedure.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. return false;
  41. }
  42. //upload firmware
  43. var updateList = UpdateData.FirmwareUpdateModels;
  44. //open all file stream
  45. //List<FileStream> firmwareFileStream = new List<FileStream>();
  46. List<UploadFile> UploadFileList = new List<UploadFile>();
  47. try
  48. {
  49. for(int modelIndex = 0;modelIndex < updateList.Count;modelIndex++) //foreach (var model in updateList)
  50. {
  51. var model = updateList[modelIndex];
  52. var stream = File.Open(model.FirmwareFileName, FileMode.Open);
  53. var uploadFile = new UploadFile()
  54. {
  55. Name = string.Format("files[]", modelIndex + 1),
  56. Filename = Path.GetFileName(model.FirmwareFileName),
  57. Stream = stream
  58. };
  59. UploadFileList.Add(uploadFile);
  60. }
  61. }
  62. catch (Exception e)
  63. {
  64. InfoLog += $"create file stream failed";
  65. LogPair.Add($"FirmwareUpload", "0");
  66. return false;
  67. }
  68. //upload
  69. try
  70. {
  71. var uploadResult = await UploadFiles(
  72. $"https://{ServerIpAddress}/upgrade_iso_action.php",
  73. files: UploadFileList,
  74. new NameValueCollection() {
  75. {"fw_tag","iso" }
  76. }
  77. );
  78. var responseStr = Encoding.ASCII.GetString(uploadResult).ToLower();
  79. InfoLog += $"get firmware update response {responseStr}\n";
  80. if (responseStr.Contains("file is uploaded"))
  81. return true;
  82. return false;
  83. }
  84. catch
  85. {
  86. InfoLog += $"file upload failed";
  87. LogPair.Add($"FirmwareUpload", "0");
  88. }
  89. LogPair.Add($"FirmwareUpload", "1");
  90. //release all
  91. foreach (var uploadFile in UploadFileList)
  92. {
  93. if(uploadFile!=null && uploadFile.Stream!=null)
  94. {
  95. uploadFile.Stream.Close();
  96. }
  97. }
  98. return true;
  99. }
  100. public async Task<byte[]> UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values)
  101. {
  102. var request = (HttpWebRequest)HttpWebRequest.Create(address);
  103. //request.Timeout = 10 * 1000;
  104. request.KeepAlive = true;
  105. request.Accept = "*/*";
  106. request.Method = "POST";
  107. request.Referer = address;
  108. request.Expect = "";
  109. var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
  110. request.ContentType = "multipart/form-data; boundary=" + boundary;
  111. boundary = "--" + boundary;
  112. string sendString = "";
  113. using (var requestStream = request.GetRequestStream())
  114. {
  115. // Write the values
  116. foreach (string name in values.Keys)
  117. {
  118. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  119. requestStream.Write(buffer, 0, buffer.Length);
  120. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
  121. requestStream.Write(buffer, 0, buffer.Length);
  122. buffer = Encoding.ASCII.GetBytes(values[name] + Environment.NewLine);
  123. requestStream.Write(buffer, 0, buffer.Length);
  124. }
  125. // Write the files
  126. foreach (var file in files)
  127. {
  128. var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
  129. requestStream.Write(buffer, 0, buffer.Length);
  130. buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
  131. requestStream.Write(buffer, 0, buffer.Length);
  132. var ctype = MimeMapping.GetMimeMapping(file.Filename);
  133. buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", MimeMapping.GetMimeMapping(file.Filename), Environment.NewLine));
  134. requestStream.Write(buffer, 0, buffer.Length);
  135. file.Stream.CopyTo(requestStream);
  136. buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
  137. requestStream.Write(buffer, 0, buffer.Length);
  138. }
  139. var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--");
  140. requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
  141. }
  142. using (var response = await request.GetResponseAsync())
  143. using (var responseStream = response.GetResponseStream())
  144. using (var stream = new MemoryStream())
  145. {
  146. responseStream.CopyTo(stream);
  147. return stream.ToArray();
  148. }
  149. }
  150. }
  151. }