public DTODistributeFileResult DistributeFile(DTODistributionFile distributionFile) { Logger.Add(LogType.Verbose, $"DistributeFile call received: relative path = {distributionFile.RelativePath}, destination group id = {distributionFile.DestinationGroupID}, content length = {distributionFile.Content.Length}"); DistributeFileResult distributeFileResult = ProcessManager.Instance.DistributeFile(distributionFile.FromDTO()); return(new DTODistributeFileResult(distributeFileResult)); }
private void DistributeSourceFilesThread(Machine machine) { List <DistributionWork> processedDistributionWork = new List <DistributionWork>(); while (ConnectionStore.ConnectionCreated(machine)) { DistributionWork work; lock (_pendingDistributionWork) { work = _pendingDistributionWork .Where(pendingWork => Comparer.MachinesEqual(pendingWork.DestinationMachine, machine)) .FirstOrDefault(pendingWork => !processedDistributionWork.Contains(pendingWork)); } if (work == null) { Thread.Sleep(10); continue; } processedDistributionWork.Add(work); Task.Run(() => { try { try { Group destinationGroup = ConnectionStore.Connections[work.DestinationMachine].Configuration.Groups .FirstOrDefault(group => Comparer.GroupsEqual(group, work.Group)); if (destinationGroup == null) { Logger.AddAndThrow <DistributionActionException>(LogType.Warning, $"Could not distribute application {work.Application.Name} in group {work.Group.Name}" + $" to destination machine {work.DestinationMachine.HostName}. Destination machine does not contain a matching group."); } List <string> errorMessages = new List <string>(); foreach (DistributionFile file in work.Files) { file.DestinationGroupID = destinationGroup.ID; file.Content = FileSystemHandler.GetFileContent(Path.Combine(work.Group.Path, file.RelativePath.Trim(Path.DirectorySeparatorChar))); DistributeFileResult result = ConnectionStore.Connections[work.DestinationMachine].ServiceHandler.Service.DistributeFile(new DTODistributionFile(file)).FromDTO(); try { if (result.Success) { Logger.Add(LogType.Verbose, $"Distribution of file to {work.DestinationMachine.HostName} succeeded: {file.RelativePath}, {file.Content.Length} bytes"); } else { Logger.AddAndThrow <DistributionActionException>(LogType.Error, $"Distribution of file to {work.DestinationMachine.HostName} failed: {Path.GetFileName(file.RelativePath)} | {result.ErrorMessage}"); } } catch (DistributionActionException ex) { errorMessages.Add(ex.Message); } file.IsDistributed = true; } if (errorMessages.Any()) { throw new DistributionActionException(string.Join(Environment.NewLine, errorMessages.Select(x => x.Replace(" | ", Environment.NewLine + "\t")))); } RaiseDistributionCompletedEvent(new DistributionResult(work, DistributionResultValue.Success), work.ClientId); } catch (DistributionActionException) { throw; } catch (ThreadAbortException) { } catch (Exception ex) { Logger.AddAndThrow <DistributionActionException>("An unexpected error occurred while distributing source files, aborting..", ex); } finally { lock (_pendingDistributionWork) _pendingDistributionWork.Remove(work); } } catch (DistributionActionException ex) { RaiseDistributionCompletedEvent(new DistributionResult(work, DistributionResultValue.Failure, ex.Message), work.ClientId); } }); } }
public DTODistributeFileResult(DistributeFileResult distributeFileResult) { RelativePath = distributeFileResult.RelativePath; DestinationGroupID = distributeFileResult.DestinationGroupID; ErrorMessage = distributeFileResult.ErrorMessage; }