Пример #1
0
        public async Task <IActionResult> LogFileStatus()
        {
            var filterModel = new FileMonitorFilterModel().ApplyAuth(User);

            var logFileMonitorStateDtos = await _logFileMonitorStateRepository.GetLogFileMonitorStates(filterModel);

            return(View(logFileMonitorStateDtos));
        }
        public async Task <int> GetFileMonitorsCount(FileMonitorFilterModel filterModel)
        {
            if (filterModel == null)
            {
                throw new ArgumentNullException(nameof(filterModel));
            }

            return(await _legacyContext.FileMonitors.ApplyFilter(filterModel).CountAsync());
        }
        public async Task <IActionResult> Index()
        {
            var filterModel = new FileMonitorFilterModel
            {
                Order = FileMonitorFilterModel.OrderBy.BannerServerListPosition
            }.ApplyAuth(User);
            var fileMonitorsDtos = await _fileMonitorsRepository.GetFileMonitors(filterModel);

            return(View(fileMonitorsDtos));
        }
        public static FileMonitorFilterModel ApplyAuth(this FileMonitorFilterModel filterModel, ClaimsPrincipal claimsPrincipal)
        {
            var requiredClaims = new[] { XtremeIdiotsClaimTypes.SeniorAdmin, XtremeIdiotsClaimTypes.HeadAdmin, XtremeIdiotsClaimTypes.GameAdmin, PortalClaimTypes.FileMonitor };

            var(gameTypes, fileMonitorIds) = claimsPrincipal.ClaimedGamesAndItems(requiredClaims);

            filterModel.GameTypes      = gameTypes;
            filterModel.FileMonitorIds = fileMonitorIds;

            return(filterModel);
        }
        public async Task <List <FileMonitorDto> > GetFileMonitors(FileMonitorFilterModel filterModel)
        {
            if (filterModel == null)
            {
                throw new ArgumentNullException(nameof(filterModel));
            }

            var fileMonitors = await _legacyContext.FileMonitors
                               .ApplyFilter(filterModel)
                               .ToListAsync();

            var models = fileMonitors.Select(fm => fm.ToDto()).ToList();

            return(models);
        }
        public async Task <IActionResult> Details(Guid id)
        {
            var gameServerDto = await _gameServersRepository.GetGameServer(id);

            if (gameServerDto == null)
            {
                return(NotFound());
            }

            var canEditGameServer = await _authorizationService.AuthorizeAsync(User, gameServerDto, AuthPolicies.ViewGameServer);

            if (!canEditGameServer.Succeeded)
            {
                return(Unauthorized());
            }

            var banFileMonitorFilterModel = new BanFileMonitorFilterModel
            {
                Order    = BanFileMonitorFilterModel.OrderBy.BannerServerListPosition,
                ServerId = id
            }.ApplyAuth(User);
            var banFileMonitorDtos = await _banFileMonitorsRepository.GetBanFileMonitors(banFileMonitorFilterModel);

            var fileMonitorFilterModel = new FileMonitorFilterModel
            {
                Order    = FileMonitorFilterModel.OrderBy.BannerServerListPosition,
                ServerId = id
            }.ApplyAuth(User);
            var fileMonitorsDtos = await _fileMonitorsRepository.GetFileMonitors(fileMonitorFilterModel);

            var model = new GameServerDetailsViewModel
            {
                GameServerDto      = gameServerDto,
                BanFileMonitorDtos = banFileMonitorDtos,
                FileMonitorDtos    = fileMonitorsDtos
            };

            return(View(model));
        }
Пример #7
0
        public async Task <List <LogFileMonitorStateDto> > GetLogFileMonitorStates(FileMonitorFilterModel filterModel)
        {
            var query   = new TableQuery <LogFileMonitorStateEntity>().AsTableQuery().ApplyFilter(filterModel);
            var results = new List <LogFileMonitorStateDto>();

            TableContinuationToken continuationToken = null;

            do
            {
                var queryResult = await _stateTable.ExecuteQuerySegmentedAsync(query, continuationToken);

                foreach (var entity in queryResult)
                {
                    var fileMonitorStateDto = new LogFileMonitorStateDto
                    {
                        FileMonitorId   = Guid.Parse(entity.RowKey),
                        ServerId        = entity.ServerId,
                        GameType        = entity.GameType,
                        ServerTitle     = entity.ServerTitle,
                        FilePath        = entity.FilePath,
                        FtpHostname     = entity.FtpHostname,
                        FtpUsername     = entity.FtpUsername,
                        FtpPassword     = entity.FtpPassword,
                        RemoteSize      = entity.RemoteSize,
                        LastReadAttempt = entity.LastReadAttempt,
                        LastRead        = entity.LastRead,
                        PlayerCount     = entity.PlayerCount
                    };

                    results.Add(fileMonitorStateDto);
                }

                continuationToken = queryResult.ContinuationToken;
            } while (continuationToken != null);

            return(results);
        }
        public static IQueryable <FileMonitors> ApplyFilter(this IQueryable <FileMonitors> fileMonitors, FileMonitorFilterModel filterModel)
        {
            fileMonitors = fileMonitors.Include(bfm => bfm.GameServerServer).AsQueryable();

            if (filterModel.GameTypes != null)
            {
                fileMonitors = fileMonitors.Where(fm => filterModel.GameTypes.Contains(fm.GameServerServer.GameType)).AsQueryable();
            }

            if (filterModel.ServerId != Guid.Empty)
            {
                fileMonitors = fileMonitors.Where(fm => fm.GameServerServerId == filterModel.ServerId).AsQueryable();
            }

            fileMonitors = fileMonitors.Skip(filterModel.SkipEntries).AsQueryable();

            switch (filterModel.Order)
            {
            case FileMonitorFilterModel.OrderBy.BannerServerListPosition:
                fileMonitors = fileMonitors.OrderBy(fm => fm.GameServerServer.BannerServerListPosition).AsQueryable();
                break;

            case FileMonitorFilterModel.OrderBy.GameType:
                fileMonitors = fileMonitors.OrderBy(fm => fm.GameServerServer.GameType).AsQueryable();
                break;
            }

            if (filterModel.TakeEntries != 0)
            {
                fileMonitors = fileMonitors.Take(filterModel.TakeEntries).AsQueryable();
            }

            return(fileMonitors);
        }
Пример #9
0
        internal static TableQuery <LogFileMonitorStateEntity> ApplyFilter(this TableQuery <LogFileMonitorStateEntity> query, FileMonitorFilterModel filterModel)
        {
            if (filterModel.GameTypes != null)
            {
                var firstGameType  = filterModel.GameTypes.First();
                var gameTypesQuery = TableQuery.GenerateFilterCondition(nameof(LogFileMonitorStateEntity.GameType), QueryComparisons.Equal, firstGameType.ToString());

                if (filterModel.GameTypes.Count > 1)
                {
                    foreach (var gameType in filterModel.GameTypes.Skip(1))
                    {
                        var subCondition = TableQuery.GenerateFilterCondition(nameof(LogFileMonitorStateEntity.GameType), QueryComparisons.Equal, gameType.ToString());
                        gameTypesQuery = TableQuery.CombineFilters(gameTypesQuery, TableOperators.Or, subCondition);
                    }
                }

                query = query.Where(gameTypesQuery);
            }

            return(query);
        }
Пример #10
0
        // ReSharper disable once UnusedMember.Global
        public async Task RunSyncLogFileMonitorState([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogDebug($"Start RunSyncLogFileMonitorState @ {DateTime.UtcNow}");

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var filterModel  = new FileMonitorFilterModel();
            var fileMonitors = await _fileMonitorsRepository.GetFileMonitors(filterModel);

            var fileMonitorStates = await _logFileMonitorStateRepository.GetLogFileMonitorStates(filterModel);

            var gameServerStatus = await _gameServerStatusRepository.GetAllStatusModels(new GameServerStatusFilterModel(), TimeSpan.Zero);

            foreach (var fileMonitorDto in fileMonitors)
            {
                var fileMonitorState = fileMonitorStates.SingleOrDefault(fm => fm.FileMonitorId == fileMonitorDto.FileMonitorId);
                var statusModel      = gameServerStatus.SingleOrDefault(s => s.ServerId == fileMonitorDto.ServerId);

                var playerCount = 0;
                if (statusModel != null)
                {
                    playerCount = statusModel.PlayerCount;
                }

                if (fileMonitorState == null)
                {
                    await _logFileMonitorStateRepository.UpdateState(new LogFileMonitorStateDto
                    {
                        FileMonitorId   = fileMonitorDto.FileMonitorId,
                        ServerId        = fileMonitorDto.ServerId,
                        GameType        = fileMonitorDto.GameServer.GameType,
                        ServerTitle     = fileMonitorDto.GameServer.Title,
                        FilePath        = fileMonitorDto.FilePath,
                        FtpHostname     = fileMonitorDto.GameServer.FtpHostname,
                        FtpUsername     = fileMonitorDto.GameServer.FtpUsername,
                        FtpPassword     = fileMonitorDto.GameServer.FtpPassword,
                        RemoteSize      = -1,
                        LastReadAttempt = DateTime.UtcNow,
                        LastRead        = DateTime.UtcNow,
                        PlayerCount     = playerCount
                    });

                    log.LogInformation($"Creating new log file monitor state object for {fileMonitorDto.GameServer.Title} against path {fileMonitorDto.FilePath}");
                }
                else
                {
                    fileMonitorState.ServerTitle = fileMonitorDto.GameServer.Title;

                    if (fileMonitorState.FilePath != fileMonitorDto.FilePath)
                    {
                        fileMonitorState.FilePath        = fileMonitorDto.FilePath;
                        fileMonitorState.RemoteSize      = -1;
                        fileMonitorState.LastReadAttempt = DateTime.UtcNow;
                        fileMonitorState.LastRead        = DateTime.UtcNow;
                    }

                    if (fileMonitorState.FtpHostname != fileMonitorDto.GameServer.FtpHostname ||
                        fileMonitorState.FtpUsername != fileMonitorDto.GameServer.FtpUsername ||
                        fileMonitorState.FtpPassword != fileMonitorDto.GameServer.FtpPassword)
                    {
                        fileMonitorState.FtpHostname = fileMonitorDto.GameServer.FtpHostname;
                        fileMonitorState.FtpUsername = fileMonitorDto.GameServer.FtpUsername;
                        fileMonitorState.FtpPassword = fileMonitorDto.GameServer.FtpPassword;

                        if (FtpClients.ContainsKey(fileMonitorState.ServerId))
                        {
                            FtpClients.TryRemove(fileMonitorState.ServerId, out var ftpClient);
                            ftpClient?.Dispose();
                        }
                    }

                    fileMonitorState.PlayerCount = playerCount;

                    await _logFileMonitorStateRepository.UpdateState(fileMonitorState);
                }
            }

            foreach (var fileMonitorState in fileMonitorStates)
            {
                var fileMonitor = fileMonitors.SingleOrDefault(fm => fm.FileMonitorId == fileMonitorState.FileMonitorId);

                if (fileMonitor == null)
                {
                    log.LogInformation($"Removing file monitor state object as file monitor no longer exists for {fileMonitorState.ServerTitle} against path {fileMonitorState.FilePath}");
                    await _logFileMonitorStateRepository.DeleteLogFileMonitorState(fileMonitorState);
                }
            }

            stopWatch.Stop();
            log.LogDebug($"Stop RunSyncLogFileMonitorState @ {DateTime.UtcNow} after {stopWatch.ElapsedMilliseconds} milliseconds");
        }
Пример #11
0
        // ReSharper disable once UnusedMember.Global
        public async Task RunMonitorLogFile([TimerTrigger("*/5 * * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogDebug($"Start RunMonitorLogFile @ {DateTime.UtcNow}");

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var filterModel       = new FileMonitorFilterModel();
            var fileMonitorStates = (await _logFileMonitorStateRepository.GetLogFileMonitorStates(filterModel))
                                    .Where(fm => fm.PlayerCount > 0)
                                    .ToList();

            if (!fileMonitorStates.Any())
            {
                return;
            }

            foreach (var logFileMonitor in fileMonitorStates)
            {
                logFileMonitor.LastReadAttempt = DateTime.UtcNow;
                await _logFileMonitorStateRepository.UpdateState(logFileMonitor);

                var requestPath = $"ftp://{logFileMonitor.FtpHostname}{logFileMonitor.FilePath}";
                log.LogDebug($"Performing request for {logFileMonitor.ServerTitle} against file {requestPath} as player count is {logFileMonitor.PlayerCount}");

                if (logFileMonitor.RemoteSize == -1 || logFileMonitor.LastRead < DateTime.UtcNow.AddMinutes(-1))
                {
                    log.LogDebug($"The remote file for {logFileMonitor.ServerTitle} ({requestPath}) has not been read in the past minute");

                    try
                    {
                        var fileSize = _ftpHelper.GetFileSize(logFileMonitor.FtpHostname, logFileMonitor.FilePath, logFileMonitor.FtpUsername, logFileMonitor.FtpPassword);
                        log.LogDebug($"The remote file size for {logFileMonitor.ServerTitle} is {fileSize} bytes");

                        logFileMonitor.LastRead   = DateTime.UtcNow;
                        logFileMonitor.RemoteSize = fileSize;

                        await _logFileMonitorStateRepository.UpdateState(logFileMonitor);
                    }
                    catch (Exception ex)
                    {
                        log.LogError(ex, $"Failed to read log file for {logFileMonitor.ServerTitle} against file {requestPath}");
                        log.LogError(ex.Message);

                        if (ex.InnerException != null)
                        {
                            log.LogError(ex.InnerException.Message);
                        }
                    }
                }
                else
                {
                    try
                    {
                        FtpClient ftpClient;
                        if (FtpClients.ContainsKey(logFileMonitor.ServerId))
                        {
                            ftpClient = FtpClients[logFileMonitor.ServerId];
                        }
                        else
                        {
                            var ftpHostname = logFileMonitor.FtpHostname;
                            var ftpPort     = 21;

                            var ftpParts = logFileMonitor.FtpHostname.Split(":");
                            if (ftpParts.Count() > 1)
                            {
                                ftpHostname = ftpParts[0];
                                ftpPort     = Convert.ToInt32(ftpParts[1]);
                            }

                            ftpClient = new FtpClient
                            {
                                Host        = ftpHostname,
                                Port        = ftpPort,
                                Credentials = new NetworkCredential(logFileMonitor.FtpUsername, logFileMonitor.FtpPassword)
                            };

                            FtpClients.TryAdd(logFileMonitor.ServerId, ftpClient);
                        }

                        if (!ftpClient.IsConnected)
                        {
                            ftpClient.Connect();
                        }


                        using var streamReader = new StreamReader(ftpClient.OpenRead(logFileMonitor.FilePath, FtpDataType.ASCII, logFileMonitor.RemoteSize));
                        var prev = -1;

                        var byteList = new List <byte>();

                        while (true)
                        {
                            var cur = streamReader.Read();

                            if (cur == -1)
                            {
                                break;
                            }

                            byteList.Add((byte)cur);

                            if (prev == '\r' && cur == '\n')
                            {
                                logFileMonitor.RemoteSize += byteList.Count;
                                logFileMonitor.LastRead    = DateTime.UtcNow;

                                await _logFileMonitorStateRepository.UpdateState(logFileMonitor);

                                var line = Encoding.UTF8.GetString(byteList.ToArray()).TrimEnd('\n');
                                try
                                {
                                    line = line.Replace("\r\n", "");
                                    line = line.Trim();
                                    line = line.Substring(line.IndexOf(' ') + 1);
                                    line = line.Replace("\u0015", "");

                                    if (line.StartsWith("say;") || line.StartsWith("sayteam;"))
                                    {
                                        var chatType = ChatType.All;
                                        if (line.StartsWith("sayteam;"))
                                        {
                                            chatType = ChatType.Team;
                                        }

                                        log.LogDebug($"[{logFileMonitor.ServerTitle}] {line}");

                                        try
                                        {
                                            var parts   = line.Split(';');
                                            var guid    = parts[1];
                                            var name    = parts[3];
                                            var message = parts[4].Trim();

                                            var chatMessageHandlers = _serviceProvider.GetServices <IChatMessageHandler>().ToList();

                                            foreach (var handler in chatMessageHandlers)
                                            {
                                                await handler.HandleChatMessage(logFileMonitor.ServerId, name, guid, message, chatType);
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            log.LogWarning(ex, $"Failed to handle chat message for {logFileMonitor.ServerTitle} with data {line}");
                                            log.LogWarning(ex.Message);

                                            if (ex.InnerException != null)
                                            {
                                                log.LogWarning(ex.InnerException.Message);
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    log.LogWarning(ex, $"Failed to process chat message for {logFileMonitor.ServerTitle} with data {line}");
                                    log.LogWarning(ex.Message);

                                    if (ex.InnerException != null)
                                    {
                                        log.LogWarning(ex.InnerException.Message);
                                    }
                                }

                                byteList = new List <byte>();
                            }

                            prev = cur;
                        }
                    }
                    catch (Exception ex)
                    {
                        log.LogError(ex, $"Failed to read log file for {logFileMonitor.ServerTitle} against file {requestPath}");
                        log.LogError(ex.Message);

                        if (ex.InnerException != null)
                        {
                            log.LogError(ex.InnerException.Message);
                        }
                    }
                }
            }

            stopWatch.Stop();
            log.LogDebug($"Stop RunMonitorLogFile @ {DateTime.UtcNow} after {stopWatch.ElapsedMilliseconds} milliseconds");
        }