public static async Task <CheckResult> CheckPing(string targetUrl) { var result = new CheckResult(); var url = new Uri(targetUrl); try { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Try ping {url.Host} "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); using (var ping = new Ping()) { var reply = await ping.SendPingAsync(url.Host); if (reply.Status == IPStatus.Success) { result.Pass = true; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Ping {url.Host} ({reply.Address}) succeed within to '{reply.RoundtripTime} ms'"); } else { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Ping {url.Host} ({reply.Address}) failed with '{reply.Status}'"); } } } catch (Exception ex) { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Ping api.github.com failed with error: {ex}"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); } return(result); }
public static async Task <CheckResult> DownloadExtraCA(this IHostContext hostContext, string url, string pat) { var result = new CheckResult(); try { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Download SSL Certificate from {url} "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); var uri = new Uri(url); var env = new Dictionary <string, string>() { { "HOSTNAME", uri.Host }, { "PORT", uri.IsDefaultPort ? (uri.Scheme.ToLowerInvariant() == "https" ? "443" : "80") : uri.Port.ToString() }, { "PATH", uri.AbsolutePath }, { "PAT", pat } }; var proxy = hostContext.WebProxy.GetProxy(uri); if (proxy != null) { env["PROXYHOST"] = proxy.Host; env["PROXYPORT"] = proxy.IsDefaultPort ? (proxy.Scheme.ToLowerInvariant() == "https" ? "443" : "80") : proxy.Port.ToString(); if (hostContext.WebProxy.HttpProxyUsername != null || hostContext.WebProxy.HttpsProxyUsername != null) { env["PROXYUSERNAME"] = hostContext.WebProxy.HttpProxyUsername ?? hostContext.WebProxy.HttpsProxyUsername; env["PROXYPASSWORD"] = hostContext.WebProxy.HttpProxyPassword ?? hostContext.WebProxy.HttpsProxyPassword; } else { env["PROXYUSERNAME"] = ""; env["PROXYPASSWORD"] = ""; } } else { env["PROXYHOST"] = ""; env["PROXYPORT"] = ""; env["PROXYUSERNAME"] = ""; env["PROXYPASSWORD"] = ""; } using (var processInvoker = hostContext.CreateService <IProcessInvoker>()) { processInvoker.OutputDataReceived += new EventHandler <ProcessDataReceivedEventArgs>((sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} [STDOUT] {args.Data}"); } }); processInvoker.ErrorDataReceived += new EventHandler <ProcessDataReceivedEventArgs>((sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} [STDERR] {args.Data}"); } }); var downloadCertScript = Path.Combine(hostContext.GetDirectory(WellKnownDirectory.Bin), "checkScripts", "downloadCert"); var node12 = Path.Combine(hostContext.GetDirectory(WellKnownDirectory.Externals), "node12", "bin", $"node{IOUtil.ExeExtension}"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Run '{node12} \"{downloadCertScript}\"' "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} {StringUtil.ConvertToJson(env)}"); await processInvoker.ExecuteAsync( hostContext.GetDirectory(WellKnownDirectory.Root), node12, $"\"{downloadCertScript}\"", env, true, CancellationToken.None); } result.Pass = true; } catch (Exception ex) { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Download SSL Certificate from '{url}' failed with error: {ex}"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); } return(result); }
private async Task <CheckResult> CheckNodeJs(string url, string pat, bool extraCA = false) { var result = new CheckResult(); try { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Make Http request to {url} using node.js "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); // Request to github.com or ghes server Uri requestUrl = new Uri(url); var env = new Dictionary <string, string>() { { "HOSTNAME", requestUrl.Host }, { "PORT", requestUrl.IsDefaultPort ? (requestUrl.Scheme.ToLowerInvariant() == "https" ? "443" : "80") : requestUrl.Port.ToString() }, { "PATH", requestUrl.AbsolutePath }, { "PAT", pat } }; var proxy = HostContext.WebProxy.GetProxy(requestUrl); if (proxy != null) { env["PROXYHOST"] = proxy.Host; env["PROXYPORT"] = proxy.IsDefaultPort ? (proxy.Scheme.ToLowerInvariant() == "https" ? "443" : "80") : proxy.Port.ToString(); if (HostContext.WebProxy.HttpProxyUsername != null || HostContext.WebProxy.HttpsProxyUsername != null) { env["PROXYUSERNAME"] = HostContext.WebProxy.HttpProxyUsername ?? HostContext.WebProxy.HttpsProxyUsername; env["PROXYPASSWORD"] = HostContext.WebProxy.HttpProxyPassword ?? HostContext.WebProxy.HttpsProxyPassword; } else { env["PROXYUSERNAME"] = ""; env["PROXYPASSWORD"] = ""; } } else { env["PROXYHOST"] = ""; env["PROXYPORT"] = ""; env["PROXYUSERNAME"] = ""; env["PROXYPASSWORD"] = ""; } if (extraCA) { env["NODE_EXTRA_CA_CERTS"] = Path.Combine(HostContext.GetDirectory(WellKnownDirectory.Root), "download_ca_cert.pem"); } using (var processInvoker = HostContext.CreateService <IProcessInvoker>()) { processInvoker.OutputDataReceived += new EventHandler <ProcessDataReceivedEventArgs>((sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} [STDOUT] {args.Data}"); } }); processInvoker.ErrorDataReceived += new EventHandler <ProcessDataReceivedEventArgs>((sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} [STDERR] {args.Data}"); } }); var makeWebRequestScript = Path.Combine(HostContext.GetDirectory(WellKnownDirectory.Bin), "checkScripts", "makeWebRequest.js"); var node12 = Path.Combine(HostContext.GetDirectory(WellKnownDirectory.Externals), "node12", "bin", $"node{IOUtil.ExeExtension}"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Run '{node12} \"{makeWebRequestScript}\"' "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} {StringUtil.ConvertToJson(env)}"); await processInvoker.ExecuteAsync( HostContext.GetDirectory(WellKnownDirectory.Root), node12, $"\"{makeWebRequestScript}\"", env, true, CancellationToken.None); } result.Pass = true; } catch (Exception ex) { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Make https request to {url} using node.js failed with error: {ex}"); if (result.Logs.Any(x => x.Contains("UNABLE_TO_VERIFY_LEAF_SIGNATURE") || x.Contains("UNABLE_TO_GET_ISSUER_CERT_LOCALLY") || x.Contains("SELF_SIGNED_CERT_IN_CHAIN"))) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Https request failed due to SSL cert issue."); result.SslError = true; } result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); } return(result); }
public static async Task <CheckResult> CheckHttpsPostRequests(this IHostContext hostContext, string url, string pat, string expectedHeader) { var result = new CheckResult(); try { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Send HTTPS Request (POST) to {url} "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); using (var _ = new HttpEventSourceListener(result.Logs)) using (var httpClientHandler = hostContext.CreateHttpClientHandler()) using (var httpClient = new HttpClient(httpClientHandler)) { httpClient.DefaultRequestHeaders.UserAgent.AddRange(hostContext.UserAgents); if (!string.IsNullOrEmpty(pat)) { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("token", pat); } // Send empty JSON '{}' to service var response = await httpClient.PostAsJsonAsync <Dictionary <string, string> >(url, new Dictionary <string, string>()); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Http status code: {response.StatusCode}"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Http response headers: {response.Headers}"); var responseContent = await response.Content.ReadAsStringAsync(); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Http response body: {responseContent}"); if (response.Headers.Contains(expectedHeader)) { result.Pass = true; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Http request 'POST' to {url} has expected HTTP response header"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} "); } else { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Http request 'POST' to {url} doesn't have expected HTTP response Header '{expectedHeader}'."); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} "); } } } catch (Exception ex) { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Https request 'POST' to {url} failed with error: {ex}"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); } return(result); }
private async Task <CheckResult> CheckGit(string url, string pat, bool extraCA = false) { var result = new CheckResult(); try { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** Validate server cert and proxy configuration with Git "); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); var repoUrlBuilder = new UriBuilder(url); repoUrlBuilder.Path = "actions/checkout"; repoUrlBuilder.UserName = "******"; repoUrlBuilder.Password = pat; var gitProxy = ""; var proxy = HostContext.WebProxy.GetProxy(repoUrlBuilder.Uri); if (proxy != null) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Runner is behind http proxy '{proxy.AbsoluteUri}'"); if (HostContext.WebProxy.HttpProxyUsername != null || HostContext.WebProxy.HttpsProxyUsername != null) { var proxyUrlWithCred = UrlUtil.GetCredentialEmbeddedUrl( proxy, HostContext.WebProxy.HttpProxyUsername ?? HostContext.WebProxy.HttpsProxyUsername, HostContext.WebProxy.HttpProxyPassword ?? HostContext.WebProxy.HttpsProxyPassword); gitProxy = $"-c http.proxy={proxyUrlWithCred}"; } else { gitProxy = $"-c http.proxy={proxy.AbsoluteUri}"; } } using (var processInvoker = HostContext.CreateService <IProcessInvoker>()) { processInvoker.OutputDataReceived += new EventHandler <ProcessDataReceivedEventArgs>((sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} {args.Data}"); } }); processInvoker.ErrorDataReceived += new EventHandler <ProcessDataReceivedEventArgs>((sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} {args.Data}"); } }); var gitArgs = $"{gitProxy} ls-remote --exit-code {repoUrlBuilder.Uri.AbsoluteUri} HEAD"; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} Run 'git {gitArgs}' "); var env = new Dictionary <string, string> { { "GIT_TRACE", "1" }, { "GIT_CURL_VERBOSE", "1" } }; if (extraCA) { env["GIT_SSL_CAINFO"] = Path.Combine(HostContext.GetDirectory(WellKnownDirectory.Root), "download_ca_cert.pem"); } await processInvoker.ExecuteAsync( HostContext.GetDirectory(WellKnownDirectory.Root), _gitPath, gitArgs, env, true, CancellationToken.None); } result.Pass = true; } catch (Exception ex) { result.Pass = false; result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** git ls-remote failed with error: {ex}"); if (result.Logs.Any(x => x.Contains("SSL Certificate problem", StringComparison.OrdinalIgnoreCase))) { result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** git ls-remote failed due to SSL cert issue."); result.SslError = true; } result.Logs.Add($"{DateTime.UtcNow.ToString("O")} **** ****"); result.Logs.Add($"{DateTime.UtcNow.ToString("O")} ***************************************************************************************************************"); } return(result); }