Exemplo n.º 1
0
        public static RunningResults Run(RunnerSubmission submission, SandboxRunnerSettings settings = null)
        {
            settings = settings ?? new SandboxRunnerSettings();
            var workingDirectory = settings.WorkingDirectory;

            if (!workingDirectory.Exists)
            {
                try
                {
                    workingDirectory.Create();
                }
                catch (Exception e)
                {
                    log.Error($"Не могу создать директорию для компиляции решений: {workingDirectory}", e);
                    return(new RunningResults(submission.Id, Verdict.SandboxError, error: e.ToString()));
                }
            }

            var randomSuffix = Guid.NewGuid().ToString("D");

            randomSuffix = randomSuffix.Substring(randomSuffix.Length - 8);
            var submissionCompilationDirectory = workingDirectory.GetSubdirectory($"{submission.Id}-{randomSuffix}");

            try
            {
                submissionCompilationDirectory.Create();
            }
            catch (Exception e)
            {
                log.Error($"Не могу создать директорию для компиляции решения: {submissionCompilationDirectory.FullName}", e);
                return(new RunningResults(submission.Id, Verdict.SandboxError, error: e.ToString()));
            }

            try
            {
                RunningResults result;
                var            instance = new SandboxRunner(submission, settings);
                if (submission is ProjRunnerSubmission)
                {
                    result = instance.RunMsBuild(submissionCompilationDirectory.FullName);
                }
                else
                {
                    result = instance.RunCsc(submissionCompilationDirectory.FullName);
                }
                result.Id = submission.Id;
                return(result);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                return(new RunningResults(submission.Id, Verdict.SandboxError, error: ex.ToString()));
            }
            finally
            {
                if (settings.DeleteSubmissionsAfterFinish)
                {
                    log.Info($"Удаляю папку с решением: {submissionCompilationDirectory}");
                    SafeRemoveDirectory(submissionCompilationDirectory.FullName);
                }
            }
        }