Example #1
0
        public async Task <ActionResult <int> > InternalError(
            [FromForm] InternalErrorModel model,
            [FromServices] SubmissionManager submissionManager)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var toDisable = JObject.Parse(model.disabled);
            var kind      = toDisable["kind"].Value <string>();

            if (kind == "language")
            {
                var langid = toDisable["langid"].Value <string>();
                var lang   = await DbContext.Languages
                             .Where(l => l.ExternalId == langid)
                             .SingleAsync();

                lang.AllowJudge = false;
                DbContext.Languages.Update(lang);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    ContestId = model.cid ?? 0,
                    EntityId  = lang.LangId,
                    Comment   = "internal error created",
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Contest,
                    UserName  = "******",
                });

                Telemetry.TrackDependency(
                    dependencyTypeName: "Language",
                    dependencyName: langid,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else if (kind == "judgehost")
            {
                var hostname = toDisable["hostname"].Value <string>();
                var host     = await DbContext.JudgeHosts
                               .Where(h => h.ServerName == hostname)
                               .SingleAsync();

                host.Active = false;
                DbContext.JudgeHosts.Update(host);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    ContestId = model.cid ?? 0,
                    EntityId  = host.ServerId,
                    Comment   = "internal error created",
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Contest,
                    UserName  = host.ServerName,
                });

                Telemetry.TrackDependency(
                    dependencyTypeName: "JudgeHost",
                    dependencyName: host.ServerName,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else if (kind == "problem")
            {
                var probid = toDisable["probid"].Value <int>();
                var prob   = await DbContext.Problems
                             .Where(p => p.ProblemId == probid)
                             .SingleAsync();

                prob.AllowJudge = false;
                DbContext.Problems.Update(prob);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    ContestId = model.cid ?? 0,
                    EntityId  = probid,
                    Comment   = "internal error created",
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Problem,
                    UserName  = "******",
                });

                Telemetry.TrackDependency(
                    dependencyTypeName: "Problem",
                    dependencyName: $"p{probid} - {prob.Title}",
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else
            {
                Telemetry.TrackDependency(
                    dependencyTypeName: "Unresolved",
                    dependencyName: kind,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }

            var ie = new InternalError
            {
                JudgehostLog = model.judgehostlog,
                JudgingId    = model.judgingid,
                ContestId    = model.cid,
                Description  = model.description,
                Disabled     = model.disabled,
                Status       = InternalErrorStatus.Open,
                Time         = DateTimeOffset.Now,
            };

            if (model.judgingid.HasValue)
            {
                await submissionManager.RejudgeForErrorAsync(model.judgingid.Value);
            }

            DbContext.InternalErrors.Add(ie);
            await DbContext.SaveChangesAsync();

            return(ie.ErrorId);
        }
        public async Task <ActionResult <int> > InternalError(
            [FromForm] InternalErrorModel model,
            [FromServices] IInternalErrorStore store,
            [FromServices] ILanguageStore langs,
            [FromServices] IProblemStore probs)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var toDisable = model.disabled.AsJson <InternalErrorDisable>();
            var kind      = toDisable.kind;

            var ie = await store.CreateAsync(
                new InternalError
            {
                JudgehostLog = model.judgehostlog,
                JudgingId    = model.judgingid,
                ContestId    = model.cid,
                Description  = model.description,
                Disabled     = model.disabled,
                Status       = InternalErrorStatus.Open,
                Time         = DateTimeOffset.Now,
            });

            if (kind == "language")
            {
                var langid = toDisable.langid;
                await langs.ToggleJudgeAsync(langid, false);

                Telemetry.TrackDependency(
                    dependencyTypeName: "Language",
                    dependencyName: langid,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else if (kind == "judgehost")
            {
                var hostname = toDisable.hostname;
                await Judgehosts.ToggleAsync(hostname, false);

                Telemetry.TrackDependency(
                    dependencyTypeName: "JudgeHost",
                    dependencyName: hostname,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else if (kind == "problem")
            {
                var probid = toDisable.probid.Value;
                await probs.ToggleJudgeAsync(probid, false);

                Telemetry.TrackDependency(
                    dependencyTypeName: "Problem",
                    dependencyName: $"p{probid}",
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else
            {
                Telemetry.TrackDependency(
                    dependencyTypeName: "Unresolved",
                    dependencyName: kind,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }

            if (model.judgingid.HasValue)
            {
                var(j, pid, cid, uid, time) = await Judgings.FindAsync(model.judgingid.Value);
                await ReturnToQueue(j, cid, pid, uid, time);
            }

            await HttpContext.AuditAsync("added", $"{ie.ErrorId}", $"for {kind}");

            return(ie.ErrorId);
        }