// check runner access to api.github.com
        public async Task <bool> RunCheck(string url, string pat)
        {
            await File.AppendAllLinesAsync(_logFile, HostContext.WarnLog());

            await File.AppendAllLinesAsync(_logFile, HostContext.CheckProxy());

            var checkTasks = new List <Task <CheckResult> >();

            checkTasks.Add(CheckUtil.CheckDns("https://api.github.com"));
            checkTasks.Add(CheckUtil.CheckPing("https://api.github.com"));

            // We don't need to pass a PAT since it might be a token for GHES.
            checkTasks.Add(HostContext.CheckHttpsGetRequests("https://api.github.com", pat: null, expectedHeader: "X-GitHub-Request-Id"));

            var result = true;

            while (checkTasks.Count > 0)
            {
                var finishedCheckTask = await Task.WhenAny <CheckResult>(checkTasks);

                var finishedCheck = await finishedCheckTask;
                result = result && finishedCheck.Pass;
                await File.AppendAllLinesAsync(_logFile, finishedCheck.Logs);

                checkTasks.Remove(finishedCheckTask);
            }

            await Task.WhenAll(checkTasks);

            return(result);
        }
Exemple #2
0
        // node access to ghes/gh
        public async Task <bool> RunCheck(string url, string pat)
        {
            await File.AppendAllLinesAsync(_logFile, HostContext.WarnLog());

            await File.AppendAllLinesAsync(_logFile, HostContext.CheckProxy());

            // Request to github.com or ghes server
            var urlBuilder = new UriBuilder(url);

            if (UrlUtil.IsHostedServer(urlBuilder))
            {
                urlBuilder.Host = $"api.{urlBuilder.Host}";
                urlBuilder.Path = "";
            }
            else
            {
                urlBuilder.Path = "api/v3";
            }

            var checkNode = await CheckNodeJs(urlBuilder.Uri.AbsoluteUri, pat);

            var result = checkNode.Pass;
            await File.AppendAllLinesAsync(_logFile, checkNode.Logs);

            // try fix SSL error by providing extra CA certificate.
            if (checkNode.SslError)
            {
                var downloadCert = await HostContext.DownloadExtraCA(urlBuilder.Uri.AbsoluteUri, pat);

                await File.AppendAllLinesAsync(_logFile, downloadCert.Logs);

                if (downloadCert.Pass)
                {
                    var recheckNode = await CheckNodeJs(urlBuilder.Uri.AbsoluteUri, pat, extraCA : true);

                    await File.AppendAllLinesAsync(_logFile, recheckNode.Logs);

                    if (recheckNode.Pass)
                    {
                        await File.AppendAllLinesAsync(_logFile, new[] { $"{DateTime.UtcNow.ToString("O")} Fixed SSL error by providing extra CA certs." });
                    }
                }
            }

            return(result);
        }
Exemple #3
0
        // git access to ghes/gh
        public async Task <bool> RunCheck(string url, string pat)
        {
            await File.AppendAllLinesAsync(_logFile, HostContext.WarnLog());

            await File.AppendAllLinesAsync(_logFile, HostContext.CheckProxy());

            if (string.IsNullOrEmpty(_gitPath))
            {
                await File.AppendAllLinesAsync(_logFile, new[] { $"{DateTime.UtcNow.ToString("O")} Can't verify git with GitHub.com or GitHub Enterprise Server since git is not installed." });

                return(false);
            }

            var checkGit = await CheckGit(url, pat);

            var result = checkGit.Pass;
            await File.AppendAllLinesAsync(_logFile, checkGit.Logs);

            // try fix SSL error by providing extra CA certificate.
            if (checkGit.SslError)
            {
                await File.AppendAllLinesAsync(_logFile, new[] { $"{DateTime.UtcNow.ToString("O")} Try fix SSL error by providing extra CA certificate." });

                var downloadCert = await HostContext.DownloadExtraCA(url, pat);

                await File.AppendAllLinesAsync(_logFile, downloadCert.Logs);

                if (downloadCert.Pass)
                {
                    var recheckGit = await CheckGit(url, pat, extraCA : true);

                    await File.AppendAllLinesAsync(_logFile, recheckGit.Logs);

                    if (recheckGit.Pass)
                    {
                        await File.AppendAllLinesAsync(_logFile, new[] { $"{DateTime.UtcNow.ToString("O")} Fixed SSL error by providing extra CA certs." });
                    }
                }
            }

            return(result);
        }
Exemple #4
0
        // runner access to actions service
        public async Task <bool> RunCheck(string url, string pat)
        {
            await File.AppendAllLinesAsync(_logFile, HostContext.WarnLog());

            await File.AppendAllLinesAsync(_logFile, HostContext.CheckProxy());

            var    checkTasks                 = new List <Task <CheckResult> >();
            string githubApiUrl               = null;
            string actionsTokenServiceUrl     = null;
            string actionsPipelinesServiceUrl = null;
            var    urlBuilder                 = new UriBuilder(url);

            if (UrlUtil.IsHostedServer(urlBuilder))
            {
                urlBuilder.Host            = $"api.{urlBuilder.Host}";
                urlBuilder.Path            = "";
                githubApiUrl               = urlBuilder.Uri.AbsoluteUri;
                actionsTokenServiceUrl     = "https://vstoken.actions.githubusercontent.com/_apis/health";
                actionsPipelinesServiceUrl = "https://pipelines.actions.githubusercontent.com/_apis/health";
            }
            else
            {
                urlBuilder.Path            = "api/v3";
                githubApiUrl               = urlBuilder.Uri.AbsoluteUri;
                urlBuilder.Path            = "_services/vstoken/_apis/health";
                actionsTokenServiceUrl     = urlBuilder.Uri.AbsoluteUri;
                urlBuilder.Path            = "_services/pipelines/_apis/health";
                actionsPipelinesServiceUrl = urlBuilder.Uri.AbsoluteUri;
            }

            // check github api
            checkTasks.Add(CheckUtil.CheckDns(githubApiUrl));
            checkTasks.Add(CheckUtil.CheckPing(githubApiUrl));
            checkTasks.Add(HostContext.CheckHttpsGetRequests(githubApiUrl, pat, expectedHeader: "X-GitHub-Request-Id"));

            // check actions token service
            checkTasks.Add(CheckUtil.CheckDns(actionsTokenServiceUrl));
            checkTasks.Add(CheckUtil.CheckPing(actionsTokenServiceUrl));
            checkTasks.Add(HostContext.CheckHttpsGetRequests(actionsTokenServiceUrl, pat, expectedHeader: "x-vss-e2eid"));

            // check actions pipelines service
            checkTasks.Add(CheckUtil.CheckDns(actionsPipelinesServiceUrl));
            checkTasks.Add(CheckUtil.CheckPing(actionsPipelinesServiceUrl));
            checkTasks.Add(HostContext.CheckHttpsGetRequests(actionsPipelinesServiceUrl, pat, expectedHeader: "x-vss-e2eid"));

            // check HTTP POST to actions pipelines service
            checkTasks.Add(HostContext.CheckHttpsPostRequests(actionsPipelinesServiceUrl, pat, expectedHeader: "x-vss-e2eid"));

            var result = true;

            while (checkTasks.Count > 0)
            {
                var finishedCheckTask = await Task.WhenAny <CheckResult>(checkTasks);

                var finishedCheck = await finishedCheckTask;
                result = result && finishedCheck.Pass;
                await File.AppendAllLinesAsync(_logFile, finishedCheck.Logs);

                checkTasks.Remove(finishedCheckTask);
            }

            await Task.WhenAll(checkTasks);

            return(result);
        }