using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Windows; using vCloud.GeneratePackages.Entitys; using vCloud.GeneratePackages.Utilities; using Vinno.IUS.Common; using Vinno.IUS.Common.Log; using Vinno.vCloud.Common.Storage.ObjectStorageInfo; namespace vCloud.GeneratePackages.Tool.ViewModels { class MainWindowViewModel : ViewModel { private DeployToolGenerator _deployToolGenerator = new DeployToolGenerator(); private string _outputDir; private string _ftpUrl; private string _windowSonoPostVersion; /// /// Request window close /// public event EventHandler RequestClosed; /// /// Cancel Command /// public Command CancelCommand { get; } /// /// Finish command /// public Command CloseCommand { get; } /// /// Refresh ftp items with specified url /// public Command RefreshCommand { get; } /// /// generage package Command /// public Command GenerateCommand { get; } /// /// Open Output Dir Command /// public Command OpenOutputDirCommand { get; } /// /// /// public ObservableCollection Files { get; } public FtpItem SelectedFile { get; set; } public string WindowSonoPostVersion { get { return _windowSonoPostVersion; } set { if (_windowSonoPostVersion != value) { _windowSonoPostVersion = value; OnPropertyChanged(() => WindowSonoPostVersion); DeployToolGenerator._windowSonoPostVersion = _windowSonoPostVersion; } } } public int FailedNum => _deployToolGenerator.FailedFileNumber; /// /// 打包客户端文件数据 /// public bool PackageClientData { get { return AppManager.Instance.PackageClientData; } set { AppManager.Instance.PackageClientData = value; OnPropertyChanged(() => PackageClientData); } } public bool IsNeedRemoteDeployment { get { return AppManager.Instance.IsNeedRemoteDeployment; } set { AppManager.Instance.IsNeedRemoteDeployment = value; OnPropertyChanged(() => IsNeedRemoteDeployment); } } /// /// Ftp url /// public string FtpUrl { get => _ftpUrl; set { if (_ftpUrl != value) { _ftpUrl = value; AppManager.Instance.SaveFtpUrl(_ftpUrl); OnPropertyChanged(() => FtpUrl); } } } /// /// Output directory /// public string OutputDir { get { return _outputDir; } set { if (_outputDir != value) { _outputDir = value; OnPropertyChanged(() => OutputDir); } } } /// /// Log infoes /// public ObservableCollection LogItems { get; } /// /// Update package window view model /// public UpdatePackageInfoWindowViewModel UpdatePackageInfo { get; } public Command ClearLogCommand { get; } public Command OpenFilesCommand { get; } /// /// retry upload command /// public Command RetryUploadCommand { get; } public MainWindowViewModel() { UpdatePackageInfo = new UpdatePackageInfoWindowViewModel(); LogItems = new ObservableCollection(); Description = "AppName"; CancelCommand = new Command("Cancel", OnCancelCommand); CloseCommand = new Command("Finish", OnCloseCommand); RefreshCommand = new Command("Refresh", OnRefreshCommand); GenerateCommand = new Command("Generate", OnGenerateCommand); OpenOutputDirCommand = new Command("OpenFolder", OnOpenOutputDirCommand); ClearLogCommand = new Command("ClearLog", OnClearLogCommand); RetryUploadCommand = new Command("ClearLog", OnRetryUploadCommand); Files = new ObservableCollection(); _ftpUrl = AppManager.Instance.AppSettings.FtpUrl; OpenFilesCommand = new Command("OpenFiles", OnOpenFilesCommand); } private void OnOpenFilesCommand(object obj) { var uploadFilesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFailedFiles"); if (Directory.Exists(uploadFilesPath)) { Process.Start("explorer.exe", uploadFilesPath); } } private void OnRetryUploadCommand(object obj) { try { AppManager.DoModalAction(() => { var cosConfig = _deployToolGenerator.StorageUploadConfig; var cOSUploadHelpler = _deployToolGenerator.COSUploadHelpler; var uploadFilesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFailedFiles"); if (!Directory.Exists(uploadFilesPath)) { Logger.WriteLineWarn($"Directory is not exist:{uploadFilesPath}"); } if (!string.IsNullOrEmpty(cosConfig.DefaultStroageNode)) { var res = false; var storageNode = cosConfig.StorageNodes.Find(c => c.Name == cosConfig.DefaultStroageNode); if (storageNode != null && !string.IsNullOrEmpty(storageNode.Bucket)) { var nodeFilePath = Path.Combine(uploadFilesPath, storageNode.Bucket); if (!Directory.Exists(nodeFilePath)) { return; } var files = Directory.GetFiles(nodeFilePath); if (files.Count() == 0) { return; } var result = cOSUploadHelpler.UploadFilesWithoutMove(storageNode.Bucket, files.ToList()); if (!result) { Logger.WriteLineError($"retry upload file to {storageNode.Name} failed"); } else { Logger.WriteLineInfo($"end retry upload files to:{storageNode.Name}"); foreach (var file in files) { List destStorageNodesList = new List(); foreach (var item in cosConfig.StorageNodes) { if (item.Name == storageNode.Name) { continue; } destStorageNodesList.Add(item); } string fileName = ""; var fileArray = file.Split('\\'); if (fileArray?.Length > 0) { fileName = fileArray[(fileArray.Length - 1)]; } res = cOSUploadHelpler.CopyFile(destStorageNodesList, storageNode, fileName); if (!res) { break; } } } } if (res) { Logger.WriteLineInfo($"end retry copy files to otherNode success"); return; } else { Logger.WriteLineInfo($"end retry copy files to otherNode fail"); Logger.WriteLineInfo($"begin retry upload files to otherNode"); } } foreach (var node in cosConfig.StorageNodes) { var nodeFilePath = Path.Combine(uploadFilesPath, node.Bucket); if (!Directory.Exists(nodeFilePath)) { continue; } var files = Directory.GetFiles(nodeFilePath); if (files.Count() == 0) { continue; } var result = cOSUploadHelpler.UploadFilesWithoutMove(node.Bucket, files.ToList()); if (!result) { Logger.WriteLineError($"retry upload file to {node.Name} failed"); } else { Logger.WriteLineInfo($"end retry upload files to:{node.Name}"); } } }); } catch (Exception ex) { Logger.WriteLineError($"OnRetryUploadCommand exceptin:{ex}"); } } private void OnClearLogCommand(object obj) { LogItems.Clear(); } private void OnOpenOutputDirCommand(object obj) { if (Directory.Exists(OutputDir)) { Process.Start("explorer.exe", OutputDir); } } private void OnGenerateCommand(object obj) { try { AppManager.DoModalAction(() => { if (SelectedFile == null) { MessageBox.Show("请选择一个压缩包!"); return; } if (SelectedFile.FtpItemType == FtpItemType.Dir) { MessageBox.Show("请选择一个zip包而不是文件夹!"); return; } OutputDir = string.Empty; var packages = new List(); foreach (var packageInfo in UpdatePackageInfo.PackageInfos) { if (!packageInfo.IsPublic) { continue; } var packageType = packageInfo.PackageType; switch (packageType) { case GeneratePackagePlatform.PC: var item = new UpgradePackage(packageType, GeneratePackageType.Client); packages.Add(item); break; case GeneratePackagePlatform.Android: var adroid = new UpgradePackage(packageType, GeneratePackageType.Client); packages.Add(adroid); break; //case PackagePlatform.Mac: // var mac = new UpgradePackage(packageType, PackageType.Client); // packages.Add(mac); // break; case GeneratePackagePlatform.Sonopost: var sonopost = new UpgradePackage(packageType, GeneratePackageType.Sonopost); packages.Add(sonopost); break; case GeneratePackagePlatform.Server: var server = new UpgradePackage(packageType, GeneratePackageType.Server); packages.Add(server); break; case GeneratePackagePlatform.WindowsSonopost: var winSonopost = new UpgradePackage(packageType,GeneratePackageType.Sonopost); packages.Add(winSonopost); break; } } if (packages.Count == 0) { MessageBox.Show($"请至少选择一个发布内容!"); return; } var packageClientData = AppManager.Instance.PackageClientData; var outputdir = _deployToolGenerator.GenerateInstallPackage(SelectedFile, FtpUrl, packages, packageClientData, AppManager.Instance.IsNeedRemoteDeployment).Result; if (!string.IsNullOrWhiteSpace(outputdir)) { OutputDir = outputdir; Process.Start("explorer.exe", OutputDir); } if (!AppManager.Instance.PackageClientData) { var result = _deployToolGenerator.UploadClientPackage(packages); } }); } catch (Exception e) { Logger.WriteLineError($"OnGenerateCommand ex:{e}"); } } private void OnRefreshCommand(object obj) { try { Files.Clear(); AppManager.DoModalAction(() => { Logger.WriteLineInfo($"Start to load file list from {FtpUrl}"); var list = FtpHelper.GetFileList(FtpUrl); foreach (var item in list) { if (item.StartsWith("drw")) { continue; } AppManager.MainDispatcher.Invoke(() => Files.Insert(0, new FtpItem(item))); } Logger.WriteLineInfo($"Load file list from {FtpUrl} done"); }, "正在加载...", "刷新文件列表"); } catch (Exception e) { Logger.WriteLineError($"OnRefreshCommand ex:{e}"); } } private void OnCancelCommand(object obj) { OnRequestClosed(); } private void OnCloseCommand(object obj) { AppManager.DoModalAction(() => { //AppManager.Instance.Finish(); }, "Deploying"); OnRequestClosed(); } void OnRequestClosed() { RequestClosed?.Invoke(this, EventArgs.Empty); } } }