MainWindowViewModel.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Windows;
  11. using vCloud.GeneratePackages.Entitys;
  12. using vCloud.GeneratePackages.Utilities;
  13. using Vinno.IUS.Common;
  14. using Vinno.IUS.Common.Log;
  15. using Vinno.vCloud.Common.Storage.ObjectStorageInfo;
  16. namespace vCloud.GeneratePackages.Tool.ViewModels
  17. {
  18. class MainWindowViewModel : ViewModel
  19. {
  20. private DeployToolGenerator _deployToolGenerator = new DeployToolGenerator();
  21. private string _outputDir;
  22. private string _ftpUrl;
  23. private string _windowSonoPostVersion;
  24. /// <summary>
  25. /// Request window close
  26. /// </summary>
  27. public event EventHandler RequestClosed;
  28. /// <summary>
  29. /// Cancel Command
  30. /// </summary>
  31. public Command CancelCommand { get; }
  32. /// <summary>
  33. /// Finish command
  34. /// </summary>
  35. public Command CloseCommand { get; }
  36. /// <summary>
  37. /// Refresh ftp items with specified url
  38. /// </summary>
  39. public Command RefreshCommand { get; }
  40. /// <summary>
  41. /// generage package Command
  42. /// </summary>
  43. public Command GenerateCommand { get; }
  44. /// <summary>
  45. /// Open Output Dir Command
  46. /// </summary>
  47. public Command OpenOutputDirCommand { get; }
  48. /// <summary>
  49. ///
  50. /// </summary>
  51. public ObservableCollection<FtpItem> Files { get; }
  52. public FtpItem SelectedFile { get; set; }
  53. public string WindowSonoPostVersion
  54. {
  55. get { return _windowSonoPostVersion; }
  56. set
  57. {
  58. if (_windowSonoPostVersion != value)
  59. {
  60. _windowSonoPostVersion = value;
  61. OnPropertyChanged(() => WindowSonoPostVersion);
  62. DeployToolGenerator._windowSonoPostVersion = _windowSonoPostVersion;
  63. }
  64. }
  65. }
  66. public int FailedNum => _deployToolGenerator.FailedFileNumber;
  67. /// <summary>
  68. /// 打包客户端文件数据
  69. /// </summary>
  70. public bool PackageClientData
  71. {
  72. get
  73. {
  74. return AppManager.Instance.PackageClientData;
  75. }
  76. set
  77. {
  78. AppManager.Instance.PackageClientData = value;
  79. OnPropertyChanged(() => PackageClientData);
  80. }
  81. }
  82. public bool IsNeedRemoteDeployment
  83. {
  84. get
  85. {
  86. return AppManager.Instance.IsNeedRemoteDeployment;
  87. }
  88. set
  89. {
  90. AppManager.Instance.IsNeedRemoteDeployment = value;
  91. OnPropertyChanged(() => IsNeedRemoteDeployment);
  92. }
  93. }
  94. /// <summary>
  95. /// Ftp url
  96. /// </summary>
  97. public string FtpUrl
  98. {
  99. get => _ftpUrl;
  100. set
  101. {
  102. if (_ftpUrl != value)
  103. {
  104. _ftpUrl = value;
  105. AppManager.Instance.SaveFtpUrl(_ftpUrl);
  106. OnPropertyChanged(() => FtpUrl);
  107. }
  108. }
  109. }
  110. /// <summary>
  111. /// Output directory
  112. /// </summary>
  113. public string OutputDir
  114. {
  115. get { return _outputDir; }
  116. set
  117. {
  118. if (_outputDir != value)
  119. {
  120. _outputDir = value;
  121. OnPropertyChanged(() => OutputDir);
  122. }
  123. }
  124. }
  125. /// <summary>
  126. /// Log infoes
  127. /// </summary>
  128. public ObservableCollection<LogItem> LogItems { get; }
  129. /// <summary>
  130. /// Update package window view model
  131. /// </summary>
  132. public UpdatePackageInfoWindowViewModel UpdatePackageInfo { get; }
  133. public Command ClearLogCommand { get; }
  134. public Command OpenFilesCommand { get; }
  135. /// <summary>
  136. /// retry upload command
  137. /// </summary>
  138. public Command RetryUploadCommand { get; }
  139. public MainWindowViewModel()
  140. {
  141. UpdatePackageInfo = new UpdatePackageInfoWindowViewModel();
  142. LogItems = new ObservableCollection<LogItem>();
  143. Description = "AppName";
  144. CancelCommand = new Command("Cancel", OnCancelCommand);
  145. CloseCommand = new Command("Finish", OnCloseCommand);
  146. RefreshCommand = new Command("Refresh", OnRefreshCommand);
  147. GenerateCommand = new Command("Generate", OnGenerateCommand);
  148. OpenOutputDirCommand = new Command("OpenFolder", OnOpenOutputDirCommand);
  149. ClearLogCommand = new Command("ClearLog", OnClearLogCommand);
  150. RetryUploadCommand = new Command("ClearLog", OnRetryUploadCommand);
  151. Files = new ObservableCollection<FtpItem>();
  152. _ftpUrl = AppManager.Instance.AppSettings.FtpUrl;
  153. OpenFilesCommand = new Command("OpenFiles", OnOpenFilesCommand);
  154. }
  155. private void OnOpenFilesCommand(object obj)
  156. {
  157. var uploadFilesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFailedFiles");
  158. if (Directory.Exists(uploadFilesPath))
  159. {
  160. Process.Start("explorer.exe", uploadFilesPath);
  161. }
  162. }
  163. private void OnRetryUploadCommand(object obj)
  164. {
  165. try
  166. {
  167. AppManager.DoModalAction(() =>
  168. {
  169. var cosConfig = _deployToolGenerator.StorageUploadConfig;
  170. var cOSUploadHelpler = _deployToolGenerator.COSUploadHelpler;
  171. var uploadFilesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFailedFiles");
  172. if (!Directory.Exists(uploadFilesPath))
  173. {
  174. Logger.WriteLineWarn($"Directory is not exist:{uploadFilesPath}");
  175. }
  176. if (!string.IsNullOrEmpty(cosConfig.DefaultStroageNode))
  177. {
  178. var res = false;
  179. var storageNode = cosConfig.StorageNodes.Find(c => c.Name == cosConfig.DefaultStroageNode);
  180. if (storageNode != null && !string.IsNullOrEmpty(storageNode.Bucket))
  181. {
  182. var nodeFilePath = Path.Combine(uploadFilesPath, storageNode.Bucket);
  183. if (!Directory.Exists(nodeFilePath))
  184. {
  185. return;
  186. }
  187. var files = Directory.GetFiles(nodeFilePath);
  188. if (files.Count() == 0)
  189. {
  190. return;
  191. }
  192. var result = cOSUploadHelpler.UploadFilesWithoutMove(storageNode.Bucket, files.ToList());
  193. if (!result)
  194. {
  195. Logger.WriteLineError($"retry upload file to {storageNode.Name} failed");
  196. }
  197. else
  198. {
  199. Logger.WriteLineInfo($"end retry upload files to:{storageNode.Name}");
  200. foreach (var file in files)
  201. {
  202. List<StorageNode> destStorageNodesList = new List<StorageNode>();
  203. foreach (var item in cosConfig.StorageNodes)
  204. {
  205. if (item.Name == storageNode.Name)
  206. {
  207. continue;
  208. }
  209. destStorageNodesList.Add(item);
  210. }
  211. string fileName = "";
  212. var fileArray = file.Split('\\');
  213. if (fileArray?.Length > 0)
  214. {
  215. fileName = fileArray[(fileArray.Length - 1)];
  216. }
  217. res = cOSUploadHelpler.CopyFile(destStorageNodesList, storageNode, fileName);
  218. if (!res)
  219. {
  220. break;
  221. }
  222. }
  223. }
  224. }
  225. if (res)
  226. {
  227. Logger.WriteLineInfo($"end retry copy files to otherNode success");
  228. return;
  229. }
  230. else
  231. {
  232. Logger.WriteLineInfo($"end retry copy files to otherNode fail");
  233. Logger.WriteLineInfo($"begin retry upload files to otherNode");
  234. }
  235. }
  236. foreach (var node in cosConfig.StorageNodes)
  237. {
  238. var nodeFilePath = Path.Combine(uploadFilesPath, node.Bucket);
  239. if (!Directory.Exists(nodeFilePath))
  240. {
  241. continue;
  242. }
  243. var files = Directory.GetFiles(nodeFilePath);
  244. if (files.Count() == 0)
  245. {
  246. continue;
  247. }
  248. var result = cOSUploadHelpler.UploadFilesWithoutMove(node.Bucket, files.ToList());
  249. if (!result)
  250. {
  251. Logger.WriteLineError($"retry upload file to {node.Name} failed");
  252. }
  253. else
  254. {
  255. Logger.WriteLineInfo($"end retry upload files to:{node.Name}");
  256. }
  257. }
  258. });
  259. }
  260. catch (Exception ex)
  261. {
  262. Logger.WriteLineError($"OnRetryUploadCommand exceptin:{ex}");
  263. }
  264. }
  265. private void OnClearLogCommand(object obj)
  266. {
  267. LogItems.Clear();
  268. }
  269. private void OnOpenOutputDirCommand(object obj)
  270. {
  271. if (Directory.Exists(OutputDir))
  272. {
  273. Process.Start("explorer.exe", OutputDir);
  274. }
  275. }
  276. private void OnGenerateCommand(object obj)
  277. {
  278. try
  279. {
  280. AppManager.DoModalAction(() =>
  281. {
  282. if (SelectedFile == null)
  283. {
  284. MessageBox.Show("请选择一个压缩包!");
  285. return;
  286. }
  287. if (SelectedFile.FtpItemType == FtpItemType.Dir)
  288. {
  289. MessageBox.Show("请选择一个zip包而不是文件夹!");
  290. return;
  291. }
  292. OutputDir = string.Empty;
  293. var packages = new List<UpgradePackage>();
  294. foreach (var packageInfo in UpdatePackageInfo.PackageInfos)
  295. {
  296. if (!packageInfo.IsPublic)
  297. {
  298. continue;
  299. }
  300. var packageType = packageInfo.PackageType;
  301. switch (packageType)
  302. {
  303. case GeneratePackagePlatform.PC:
  304. var item = new UpgradePackage(packageType, GeneratePackageType.Client);
  305. packages.Add(item);
  306. break;
  307. case GeneratePackagePlatform.Android:
  308. var adroid = new UpgradePackage(packageType, GeneratePackageType.Client);
  309. packages.Add(adroid);
  310. break;
  311. //case PackagePlatform.Mac:
  312. // var mac = new UpgradePackage(packageType, PackageType.Client);
  313. // packages.Add(mac);
  314. // break;
  315. case GeneratePackagePlatform.Sonopost:
  316. var sonopost = new UpgradePackage(packageType, GeneratePackageType.Sonopost);
  317. packages.Add(sonopost);
  318. break;
  319. case GeneratePackagePlatform.Server:
  320. var server = new UpgradePackage(packageType, GeneratePackageType.Server);
  321. packages.Add(server);
  322. break;
  323. case GeneratePackagePlatform.WindowsSonopost:
  324. var winSonopost = new UpgradePackage(packageType,GeneratePackageType.Sonopost);
  325. packages.Add(winSonopost);
  326. break;
  327. }
  328. }
  329. if (packages.Count == 0)
  330. {
  331. MessageBox.Show($"请至少选择一个发布内容!");
  332. return;
  333. }
  334. var packageClientData = AppManager.Instance.PackageClientData;
  335. var outputdir = _deployToolGenerator.GenerateInstallPackage(SelectedFile, FtpUrl, packages, packageClientData, AppManager.Instance.IsNeedRemoteDeployment).Result;
  336. if (!string.IsNullOrWhiteSpace(outputdir))
  337. {
  338. OutputDir = outputdir;
  339. Process.Start("explorer.exe", OutputDir);
  340. }
  341. if (!AppManager.Instance.PackageClientData)
  342. {
  343. var result = _deployToolGenerator.UploadClientPackage(packages);
  344. }
  345. });
  346. }
  347. catch (Exception e)
  348. {
  349. Logger.WriteLineError($"OnGenerateCommand ex:{e}");
  350. }
  351. }
  352. private void OnRefreshCommand(object obj)
  353. {
  354. try
  355. {
  356. Files.Clear();
  357. AppManager.DoModalAction(() =>
  358. {
  359. Logger.WriteLineInfo($"Start to load file list from {FtpUrl}");
  360. var list = FtpHelper.GetFileList(FtpUrl);
  361. foreach (var item in list)
  362. {
  363. if (item.StartsWith("drw"))
  364. {
  365. continue;
  366. }
  367. AppManager.MainDispatcher.Invoke(() => Files.Insert(0, new FtpItem(item)));
  368. }
  369. Logger.WriteLineInfo($"Load file list from {FtpUrl} done");
  370. }, "正在加载...", "刷新文件列表");
  371. }
  372. catch (Exception e)
  373. {
  374. Logger.WriteLineError($"OnRefreshCommand ex:{e}");
  375. }
  376. }
  377. private void OnCancelCommand(object obj)
  378. {
  379. OnRequestClosed();
  380. }
  381. private void OnCloseCommand(object obj)
  382. {
  383. AppManager.DoModalAction(() =>
  384. {
  385. //AppManager.Instance.Finish();
  386. }, "Deploying");
  387. OnRequestClosed();
  388. }
  389. void OnRequestClosed()
  390. {
  391. RequestClosed?.Invoke(this, EventArgs.Empty);
  392. }
  393. }
  394. }