Пример #1
0
        public async Task DoWorkAsync()
        {
            _logger.LogInformation("Update Background Service is running");
            try
            {
                _logger.LogInformation("Update Background Service is checking VPCs");
                if (context.VPCs.Any())
                {
                    DescribeVpcsResponse responseDescribeVPC = await ec2Client.DescribeVpcsAsync();

                    List <VPC> vpcs = await context.VPCs.ToListAsync();

                    foreach (VPC vpc in vpcs)
                    {
                        Boolean Flag = false;

                        foreach (Vpc AWSVPC in responseDescribeVPC.Vpcs)
                        {
                            if (vpc.AWSVPCReference.Equals(AWSVPC.VpcId))
                            {
                                Flag = true;
                                break;
                            }
                        }
                        if (Flag == false)
                        {
                            context.VPCs.Remove(vpc);
                        }
                    }
                    context.SaveChanges();
                    _logger.LogInformation("Update Background Service completed checking of VPCs");
                }
                if (context.VPCs.Any())
                {
                    VPC vpc = await context.VPCs.FindAsync(1);

                    if (context.Servers.Any())
                    {
                        _logger.LogInformation("Update Background Service is checking servers");
                        List <Server> servers = await context.Servers.ToListAsync();

                        DescribeInstancesResponse response = await ec2Client.DescribeInstancesAsync(new DescribeInstancesRequest
                        {
                            Filters = new List <Filter>
                            {
                                new Filter {
                                    Name = "vpc-id", Values = new List <string> {
                                        vpc.AWSVPCReference
                                    }
                                }
                            }
                        });

                        foreach (var server in servers)
                        {
                            foreach (var reservation in response.Reservations)
                            {
                                foreach (var instance in reservation.Instances)
                                {
                                    bool Flag = false;
                                    if (server.AWSEC2Reference.Equals(instance.InstanceId))
                                    {
                                        if (instance.State.Code == 0 && server.State != State.Starting)
                                        {
                                            server.State = State.Starting;
                                            Flag         = true;
                                        }
                                        else if (instance.State.Code == 16 && server.State != State.Running)
                                        {
                                            server.State = State.Running;
                                            Flag         = true;
                                        }
                                        else if (instance.State.Code == 64 && server.State != State.Stopping)
                                        {
                                            server.State = State.Stopping;
                                            Flag         = true;
                                        }
                                        else if (instance.State.Code == 80 && server.State != State.Stopped)
                                        {
                                            server.State = State.Stopped;
                                            Flag         = true;
                                        }
                                        if (server.Visibility == Visibility.Internet && (server.IPAddress != instance.PublicIpAddress || server.DNSHostname != instance.PublicDnsName) && server.State != State.Stopped)
                                        {
                                            server.IPAddress   = instance.PublicIpAddress;
                                            server.DNSHostname = instance.PublicDnsName;
                                            Flag = true;
                                        }
                                        else if (server.Visibility == Visibility.Internet && (server.IPAddress != instance.PublicIpAddress || server.DNSHostname != instance.PublicDnsName))
                                        {
                                            server.IPAddress   = "Public IP Address is not available when server is stopped";
                                            server.DNSHostname = "Public DNS Hostname is not available when server is stopped";
                                            Flag = true;
                                        }
                                        else if ((server.Visibility == Visibility.Extranet || server.Visibility == Visibility.Intranet) && (server.IPAddress != instance.PrivateIpAddress || server.DNSHostname != instance.PrivateDnsName))
                                        {
                                            server.IPAddress   = instance.PrivateIpAddress;
                                            server.DNSHostname = instance.PrivateDnsName;
                                            Flag = true;
                                        }
                                        if (Flag == true)
                                        {
                                            context.Servers.Update(server);
                                        }

                                        break;
                                    }
                                }
                            }
                        }
                        context.SaveChanges();
                    }
                    if (context.CloudWatchLogGroups.Any() && context.CloudWatchLogStreams.Any())
                    {
                        _logger.LogInformation("Update Background Service is checking cloudwatch groups");
                        List <CloudWatchLogGroup> allStreams = await context.CloudWatchLogGroups.ToListAsync();

                        foreach (CloudWatchLogGroup g in allStreams)
                        {
                            DescribeLogStreamsResponse response = await cwlClient.DescribeLogStreamsAsync(new DescribeLogStreamsRequest
                            {
                                LogGroupName = g.Name.Replace("@", "/")
                            });

                            foreach (LogStream ls in response.LogStreams)
                            {
                                Boolean Flag = false;
                                foreach (CloudWatchLogStream CWLS in g.LogStreams)
                                {
                                    if (ls.Arn.Equals(CWLS.ARN))
                                    {
                                        Flag = true;
                                        break;
                                    }
                                }
                                if (Flag == false)
                                {
                                    CloudWatchLogStream newS = new CloudWatchLogStream
                                    {
                                        ARN            = ls.Arn,
                                        CreationTime   = ls.CreationTime,
                                        FirstEventTime = ls.FirstEventTimestamp,
                                        LastEventTime  = ls.LastEventTimestamp,
                                        Name           = ls.LogStreamName,
                                        LinkedGroupID  = g.ID
                                    };
                                    if (g.Name.Equals("VMVPCLogs"))
                                    {
                                        newS.DisplayName = "Network Flow Log For Challenge Network Interface (" + newS.Name.Substring(0, newS.Name.Length - 4) + ")";
                                    }
                                    else if (g.Name.Equals("PlatformVPCLogs"))
                                    {
                                        newS.DisplayName = "Network Flow Log For Platform Network Interface (" + newS.Name.Substring(0, newS.Name.Length - 4) + ")";
                                    }
                                    else if (g.Name.Equals("@aws@elasticbeanstalk@User-Side@IIS-Log"))
                                    {
                                        newS.DisplayName = "IIS Logs for User Side Web Server";
                                    }
                                    else if (g.Name.Equals("@aws@elasticbeanstalk@Admin-Side@IIS-Log"))
                                    {
                                        newS.DisplayName = "IIS Logs for Admin Side Web Server";
                                    }
                                    else if (g.Name.Equals("@aws@elasticbeanstalk@User-Side@EBDeploy-Log"))
                                    {
                                        newS.DisplayName = "Elastic Beanstalk Deployment Tool Logs for User Side";
                                    }
                                    else if (g.Name.Equals("@aws@elasticbeanstalk@Admin-Side@EBDeploy-Log"))
                                    {
                                        newS.DisplayName = "Elastic Beanstalk Deployment Tool Logs for Admin Side";
                                    }
                                    else if (g.Name.Equals("@aws@elasticbeanstalk@User-Side@EBHooks-Log"))
                                    {
                                        newS.DisplayName = "Elastic Beanstalk Deployment Hook Logs for User Side";
                                    }
                                    else if (g.Name.Equals("@aws@elasticbeanstalk@Admin-Side@EBHooks-Log"))
                                    {
                                        newS.DisplayName = "Elastic Beanstalk Deployment Hook Logs for Admin Side";
                                    }
                                    else
                                    {
                                        newS.DisplayName = newS.Name;
                                    }

                                    if (!g.Name.Equals("RDSOSMetrics") || !g.Name.Contains("sns"))
                                    {
                                        context.CloudWatchLogStreams.Add(newS);
                                    }
                                }
                            }
                            foreach (CloudWatchLogStream CWLS in g.LogStreams)
                            {
                                Boolean Flag = false;
                                foreach (LogStream ls in response.LogStreams)
                                {
                                    if (CWLS.ARN.Equals(ls.Arn))
                                    {
                                        Flag = true;
                                        break;
                                    }
                                }
                                if (Flag == false)
                                {
                                    context.CloudWatchLogStreams.Remove(CWLS);
                                }
                            }
                        }
                        await context.SaveChangesAsync();
                    }
                    if (context.Templates.Any())
                    {
                        DescribeSnapshotsResponse response = await ec2Client.DescribeSnapshotsAsync(new DescribeSnapshotsRequest());

                        List <Template> templates = await context.Templates.FromSql("SELECT * FROM dbo.Templates WHERE AWSSnapshotReference = NULL").ToListAsync();

                        foreach (Template t in templates)
                        {
                            foreach (Snapshot s in response.Snapshots)
                            {
                                if (s.Description.Contains(t.AWSAMIReference))
                                {
                                    t.AWSSnapshotReference = s.SnapshotId;
                                    break;
                                }
                            }
                        }
                        await context.SaveChangesAsync();
                    }
                }
                _logger.LogInformation("Update Background Service has completed!");
            }
            catch (SqlException e)
            {
                _logger.LogInformation("Update Background Service faced an SQL exception! " + e.Message + " | " + e.Source);
                return;
            }
            catch (Exception e)
            {
                _logger.LogInformation("Update Background Service faced an exception! " + e.Message + " | " + e.Source);
                return;
            }
        }
        public async Task <IActionResult> Index(string StreamID, string ViewMode)
        {
            if (_context.VPCs.ToList().Count == 0)
            {
                ViewData["MissingVPC"] = "YES";
            }
            if (StreamID == null)
            {
                PlatformLogsParentViewModel model = new PlatformLogsParentViewModel
                {
                    Response      = null,
                    Streams       = _context.CloudWatchLogStreams.ToList(),
                    SelectedValue = 0
                };
                TempData["Exception"] = "Invaild Selection of Component!";
                return(View(model));
            }
            else if (StreamID.Equals("0"))
            {
                List <RDSSQLLog>            Logs  = _context.GetRDSLogs().Result.ToList();
                PlatformLogsParentViewModel model = new PlatformLogsParentViewModel
                {
                    Response      = null,
                    Streams       = _context.CloudWatchLogStreams.ToList(),
                    SelectedValue = int.Parse(StreamID),
                    SQLlogs       = Logs
                };
                if (ViewMode.Equals("Automatic"))
                {
                    ViewData["Mode"] = "Automatic";
                }
                else if (ViewMode.Equals("Generic"))
                {
                    ViewData["Mode"] = "Automatic";
                }
                return(View(model));
            }
            else if (ViewMode.Equals("Automatic"))
            {
                CloudWatchLogStream selectedStream = await _context.CloudWatchLogStreams.FindAsync(int.Parse(StreamID));

                if (selectedStream != null)
                {
                    GetLogEventsResponse response = await CloudwatchLogsClient.GetLogEventsAsync(new GetLogEventsRequest
                    {
                        LogGroupName  = selectedStream.LinkedGroup.Name.Replace("@", "/"),
                        LogStreamName = selectedStream.Name
                    });

                    PlatformLogsParentViewModel model = new PlatformLogsParentViewModel
                    {
                        Streams       = _context.CloudWatchLogStreams.ToList(),
                        SelectedValue = int.Parse(StreamID)
                    };
                    if (selectedStream.DisplayName.Contains("IIS"))
                    {
                        List <IISLog> logs = new List <IISLog>();
                        foreach (OutputLogEvent e in response.Events)
                        {
                            if (!e.Message.StartsWith('#'))
                            {
                                string[] spiltedRecord = e.Message.Split();
                                IISLog   l             = new IISLog
                                {
                                    TimeStamp         = e.Timestamp.ToLocalTime(),
                                    ServerIP          = spiltedRecord[0],
                                    HTTPMethod        = spiltedRecord[1],
                                    Path              = spiltedRecord[2],
                                    Query             = spiltedRecord[3],
                                    DestPort          = int.Parse(spiltedRecord[4]),
                                    AuthenticatedUser = spiltedRecord[5],
                                    SourceIP          = spiltedRecord[6],
                                    SourceUserAgent   = spiltedRecord[7],
                                    Referer           = spiltedRecord[8],
                                    HTTPStatusCode    = int.Parse(spiltedRecord[9]),
                                    SubstatusCode     = int.Parse(spiltedRecord[10]),
                                    Win32StatusCode   = int.Parse(spiltedRecord[11]),
                                    Duration          = int.Parse(spiltedRecord[12]),
                                };
                                logs.Add(l);
                            }
                        }
                        model.IISLogs = logs;
                    }
                    else if (selectedStream.DisplayName.Contains("eni"))
                    {
                        List <ENILog> logs = new List <ENILog>();
                        foreach (OutputLogEvent e in response.Events)
                        {
                            if (!e.Message.Contains("NODATA"))
                            {
                                string[] spiltedRecord = e.Message.Split();
                                ENILog   l             = new ENILog
                                {
                                    TimeStamp          = e.Timestamp.ToLocalTime(),
                                    Version            = int.Parse(spiltedRecord[0]),
                                    AccountID          = long.Parse(spiltedRecord[1]),
                                    Interface          = spiltedRecord[2],
                                    SourceAddress      = spiltedRecord[3],
                                    DestinationAddress = spiltedRecord[4],
                                    SourcePort         = spiltedRecord[5],
                                    DestinationPort    = spiltedRecord[6],
                                    Packets            = int.Parse(spiltedRecord[8]),
                                    Bytes     = int.Parse(spiltedRecord[9]),
                                    StartTime = long.Parse(spiltedRecord[10]),
                                    EndTime   = long.Parse(spiltedRecord[11]),
                                    Action    = spiltedRecord[12],
                                    LogAction = spiltedRecord[13]
                                };
                                if (spiltedRecord[7].Equals("1"))
                                {
                                    l.Protocol = "ICMP";
                                }
                                else if (spiltedRecord[7].Equals("4"))
                                {
                                    l.Protocol = "IPv4";
                                }
                                else if (spiltedRecord[7].Equals("6"))
                                {
                                    l.Protocol = "TCP";
                                }
                                else if (spiltedRecord[7].Equals("17"))
                                {
                                    l.Protocol = "UDP";
                                }
                                else if (spiltedRecord[7].Equals("41"))
                                {
                                    l.Protocol = "IPv6";
                                }
                                logs.Add(l);
                            }
                        }
                        model.ENILogs = logs;
                    }
                    else
                    {
                        foreach (OutputLogEvent e in response.Events)
                        {
                            e.Timestamp = e.Timestamp.ToLocalTime();
                        }
                        model.Response = response;
                    }
                    ViewData["Mode"] = "Automatic";
                    return(View(model));
                }
                else
                {
                    return(NotFound());
                }
            }
            else
            {
                CloudWatchLogStream selectedStream = await _context.CloudWatchLogStreams.FindAsync(int.Parse(StreamID));

                if (selectedStream != null)
                {
                    GetLogEventsResponse response = await CloudwatchLogsClient.GetLogEventsAsync(new GetLogEventsRequest
                    {
                        LogGroupName  = selectedStream.LinkedGroup.Name.Replace("@", "/"),
                        LogStreamName = selectedStream.Name
                    });

                    foreach (OutputLogEvent e in response.Events)
                    {
                        e.Timestamp = e.Timestamp.ToLocalTime();
                    }
                    PlatformLogsParentViewModel model = new PlatformLogsParentViewModel
                    {
                        Response      = response,
                        Streams       = _context.CloudWatchLogStreams.ToList(),
                        SelectedValue = int.Parse(StreamID)
                    };
                    ViewData["Mode"] = "Generic";
                    return(View(model));
                }
                else
                {
                    return(NotFound());
                }
            }
        }