예제 #1
0
파일: Program.cs 프로젝트: mriedmann/oom
        static void Main(string[] args)
        {
#if DEBUG
            //ObjectCache.Instance.Clear();
            SensorFactory.RegisterSensorBuilder <IcmpSensor>(ServiceProtocol.ICMP, (sfr) => new MockedSensor());
            SensorFactory.RegisterSensorBuilder <TcpPortSensor>(ServiceProtocol.TCP, (sfr) => new MockedSensor());
            SensorFactory.RegisterSensorBuilder <UdpPortSensor>(ServiceProtocol.UDP, (sfr) => new MockedSensor());
#else
            SensorFactory.RegisterSensorBuilder <IcmpSensor>(ServiceProtocol.ICMP, (sfr) => new IcmpSensor());
            SensorFactory.RegisterSensorBuilder <TcpPortSensor>(ServiceProtocol.TCP, (sfr) => new TcpPortSensor(sfr.PortNumber));
            SensorFactory.RegisterSensorBuilder <UdpPortSensor>(ServiceProtocol.UDP, (sfr) => new UdpPortSensor(sfr.PortNumber));
#endif
            var serviceRecords = ObjectCache.Instance.GetOrSetObject("ServiceFileRecordsRegistryContent", () => LoadServiceRecordsFromFile());

            ServiceFileRecordRegistry.Load(serviceRecords);
            ServiceFileRecordRegistry.AddServiceFileRecord(new ServiceFileRecord()
            {
                Name        = "echo-icmp",
                DisplayName = "ping",
                PortNumber  = 0,
                Protocol    = ServiceProtocol.ICMP
            });

            var serverRecords = ObjectCache.Instance.GetOrSetObject("ServerList", () => new[] {
                new ServerRecord()
                {
                    HostnameOrIpAddress = "127.0.0.1",
                    ServiceNames        = new[] { "echo-icmp", "microsoft-ds-tcp" }
                },
                new ServerRecord()
                {
                    HostnameOrIpAddress = "ic15.at",
                    ServiceNames        = new[]  { "echo-icmp", "http-tcp", "https-tcp" }
                },
                new ServerRecord()
                {
                    HostnameOrIpAddress = "8.8.8.8",
                    ServiceNames        = new[]  { "echo-icmp", "domain-tcp" }
                },
                new ServerRecord()
                {
                    HostnameOrIpAddress = "8.8.4.4",
                    ServiceNames        = new[]  { "echo-icmp", "domain-tcp" }
                }
            });

            foreach (var serverRecord in serverRecords)
            {
                servers.Add(serverRecord.HostnameOrIpAddress, new Server(serverRecord.HostnameOrIpAddress, serverRecord.ServiceNames));
            }

            Console.CursorVisible = false;

            int bufferWidth  = PreferedConsoleBufferWidth > Console.BufferWidth ? PreferedConsoleBufferWidth : Console.BufferWidth;
            int bufferHeight = PreferedConsoleBufferHeight > Console.BufferHeight ? PreferedConsoleBufferHeight : Console.BufferHeight;

            Console.SetBufferSize(bufferWidth, bufferHeight);
            try
            {
                Console.SetWindowSize(PreferedConsoleWindowWidth, PreferedConsoleWindowHeight);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: {0}", ex.Message);
                Console.WriteLine("== Continue With Enter ==");
                Console.ReadLine();
            }

            Console.Clear();
            buffer = new ConsoleBuffer(Console.BufferWidth, Console.BufferHeight, Console.BufferWidth, Console.BufferHeight);

            object bufferLock = new object();

            buffer.Draw("= == === ==== ===== =========================================== ====== ==== === == =", 0, 0, 15);
            buffer.Draw("= == === ==== ===== =      Fancy Console Host Monitor         = ====== ==== === == =", 0, 1, 15);
            buffer.Draw("= == === ==== ===== =========================================== ====== ==== === == =", 0, 2, 15);

            int offsetIndex = 4;
            foreach (var s in servers.Values)
            {
                var pos = offsetIndex;
                offsetIndex += s.Services.Count() + 2;

                buffer.Draw(string.Format("#### {0}", s.FullyQualifiedHostName), 0, pos, 15);

                offsets.Add(s.HostnameOrIpAddress, pos);
            }
            buffer.Print();

            Observable.Merge(
                servers.Values.Select(server => Observable.Interval(TimeSpan.FromSeconds(1.0)).Select(_ => server))
                )
            .Do(server => {
                lock (server)
                {
                    server.UpdateServices();
                }
            })
            .Do(server => {
                lock (server)
                {
                    RedrawServer(server);
                }
            })
            .Sample(TimeSpan.FromSeconds(0.5))
            .Do(_ => buffer.Print())
            .RunAsync(CancellationToken.None)
            ;

            Console.ReadKey();
        }