Exemplo n.º 1
0
        private async Task ProcessFile(IIgnite client, FileInfo fileInfo, FastPcapFileReaderDevice device)
        {
            device.Open();
            var frameKeyProvider = new FrameKeyProvider();
            var cache            = CacheFactory.GetOrCreateCache <string, Artifact>(client, FrameCacheName ?? fileInfo.Name);
            var flowTracker      = new PacketFlowTracker(new FrameKeyProvider());

            using (var dataStreamer = client.GetDataStreamer <string, Artifact>(cache.Name))
            {
                dataStreamer.AllowOverwrite = true;
                dataStreamer.Receiver       = new PacketFlowVisitor(new MergePacketFlowProcessor());

                var cacheStoreTask = Task.CompletedTask;

                var currentChunkBytes  = 0;
                var currentChunkNumber = 0;

                RawCapture rawCapture = null;
                while ((rawCapture = device.GetNextPacket()) != null)
                {
                    currentChunkBytes += rawCapture.Data.Length + 4 * sizeof(int);

                    var frame = new FrameData
                    {
                        LinkLayer = (LinkLayerType)rawCapture.LinkLayerType,
                        Timestamp = rawCapture.Timeval.ToUnixTimeMilliseconds(),
                        Data      = rawCapture.Data
                    };
                    flowTracker.ProcessFrame(frame);
                    if (flowTracker.TotalFrameCount == ChunkSize)
                    {
                        OnChunkLoaded(currentChunkNumber, currentChunkBytes);
                        cacheStoreTask = cacheStoreTask.ContinueWith(StreamData(dataStreamer, flowTracker.FlowTable, currentChunkNumber, currentChunkBytes));
                        flowTracker.Reset();
                    }
                }

                OnChunkLoaded(currentChunkNumber, currentChunkBytes);
                cacheStoreTask = cacheStoreTask.ContinueWith(StreamData(dataStreamer, flowTracker.FlowTable, currentChunkNumber, currentChunkBytes));

                await cacheStoreTask;

                dataStreamer.Flush();
            }
            Console.WriteLine($"Stored flows: {cache.GetSize()}");
            device.Close();
        }
Exemplo n.º 2
0
        public override async Task Invoke()
        {
            var cfg = GetIgniteConfiguration();

            cfg.PeerAssemblyLoadingMode = PeerAssemblyLoadingMode.CurrentAppDomain;
            cfg.ClientMode = true;

            using (var ignite = Ignition.Start(cfg))
            {
                ignite.GetCompute().Broadcast(new NotificationAction("Start streaming..."));
                foreach (var fileInfo in SourceFiles)
                {
                    OnFileOpened(fileInfo);
                    using (var device = new FastPcapFileReaderDevice(fileInfo.FullName))
                    {
                        await ProcessFile(ignite, fileInfo, device);
                    }
                    OnFileCompleted(fileInfo);
                }
                ignite.GetCompute().Broadcast(new NotificationAction("Done."));
            }
        }