private void AsyncExtractFiles(INyxMessage message, INyxBorg nyxBorg) { if (message.Has("fileExtract")) { _logger.Warn("File extration is already in progress for message {0}.", message); return; } message["fileExtract"] = "1"; var files = message.Elements.Where(s => s.Key.StartsWith("file_")).Select(s => s.Key).ToList(); message.Files.Clear(); var fullExtractPath = Path.Combine(_extractPath, nyxBorg.NodeId); foreach (var file in files) { var path = Path.Combine(fullExtractPath, file.Substring(5)); _logger.Debug("Extracting file {0} to {1}", file, path); try { Directory.CreateDirectory(Path.GetDirectoryName(path)); } catch (Exception ex) { _logger.Error("Error creating directory for extraction.", ex); } File.WriteAllBytes(path, Convert.FromBase64String(message[file])); message.Remove(file); message.Files.Add(new NyxFile { Name = file.Substring(5), Path = path, TransferType = GetType().Name }); } nyxBorg.SendMessage(message.AsInternal()); }
private void RunNodeCollector(INyxMessage message) { var info = message.Get <NodeInfo>(NodeManagerInfo); if (info == null) { return; } var sw = Stopwatch.StartNew(); using (Disposable.Create(() => { _logger.Trace("Hub node collector took {0}ms.", sw.ElapsedMilliseconds); sw.Stop(); })) { if (message.Action == NodesPingStop) { _logger.Debug("Received ping stop from {0}", StringExtensions.Trimmer(message.Source)); var indexToRemove = _nodesInfo.FindIndex(ni => ni.NodeId == message.Source); if (indexToRemove == -1) { return; } var nodeToRemove = _nodesInfo.ElementAt(indexToRemove); lock (NodesLock) _nodesInfo.RemoveAt(indexToRemove); lock (UpdaterLock) { foreach (var update in _pushUpdates) { SendNodesInfo(null, update, new List <NodeInfo>(), new[] { nodeToRemove }); } } return; } bool dirty = false; var removed = new List <NodeInfo>(); var added = new List <NodeInfo>(); var index = _nodesInfo.FindIndex(ni => ni.NodeId == info.NodeId); if (index == -1) { _nodesInfo.Add(info); lock (NodesLock) added.Add(info); } else { // Quick check for group changes dirty = _nodesInfo[index].GetHashCode() != info.GetHashCode(); if (dirty) { lock (NodesLock) added.Add(info); } _nodesInfo[index] = info; } // Cleanup 140 seconds old nodes that don't respond. lock (NodesLock) { _nodesInfo.RemoveAll(ni => { var res = DateTime.Now.Subtract(ni.TimeStamp).TotalSeconds > 140; if (res) { removed.Add(ni); } return(res); }); } // Remove dead subscriptions lock (UpdaterLock) _pushUpdates.RemoveWhere(p => _nodesInfo.All(ni => ni.NodeId != p)); message.Remove(NodeManagerInfo); // Push updates only if something changed. if (added.Count == 0 && removed.Count == 0 && !dirty) { return; } _logger.Debug("Added {0} nodes and removed {1}.", added.Count, removed.Count); lock (UpdaterLock) { foreach (var update in _pushUpdates) { SendNodesInfo(null, update, added, removed); } // Notify any hub plugin listening to node changes _nodesSubject.OnNext(new NodesChanges { All = _nodesInfo.AsReadOnly(), Added = added.AsReadOnly(), Removed = removed.AsReadOnly() }); _groupSubject.OnNext(_groups.Clone()); } } }