From d10413fc70f9ecc9e09b7c8e2cf1c5f33292f729 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Mon, 25 Oct 2021 19:47:59 +0300 Subject: [PATCH] cli: Fix dns in NODE_OPTIONS (#928) --- CHANGELOG.md | 4 ++++ Cargo.lock | 7 +++++++ cli/Cargo.toml | 1 + cli/src/lib.rs | 29 +++++++++++++++++++++++++++-- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ddad89b..c0f8712a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ incremented for features. ## [Unreleased] +### Fixes + +* cli: fix dns in NODE_OPTIONS ([#928](https://github.com/project-serum/anchor/pull/928)). + ## [0.18.0] - 2021-10-24 ### Features diff --git a/Cargo.lock b/Cargo.lock index 798866bb..9df04cbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,6 +150,7 @@ dependencies = [ "pathdiff", "rand 0.7.3", "reqwest", + "semver 1.0.4", "serde", "serde_json", "serum-common", @@ -2635,6 +2636,12 @@ dependencies = [ "semver-parser 0.10.2", ] +[[package]] +name = "semver" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" + [[package]] name = "semver-parser" version = "0.7.0" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 535b9acc..47742f58 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -22,6 +22,7 @@ anchor-syn = { path = "../lang/syn", features = ["idl"] } serde_json = "1.0" shellexpand = "2.1.0" toml = "0.5.8" +semver = "1.0.4" serde = { version = "1.0.122", features = ["derive"] } solana-sdk = "1.8.0" solana-program = "1.8.0" diff --git a/cli/src/lib.rs b/cli/src/lib.rs index fb4d9a5e..259fdf94 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -16,6 +16,7 @@ use heck::SnakeCase; use rand::rngs::OsRng; use reqwest::blocking::multipart::{Form, Part}; use reqwest::blocking::Client; +use semver::{Version, VersionReq}; use serde::{Deserialize, Serialize}; use solana_client::rpc_client::RpcClient; use solana_client::rpc_config::RpcSendTransactionConfig; @@ -1478,13 +1479,14 @@ fn test( let url = cluster_url(cfg); let node_options = format!( - "{} --dns-result-order=ipv4first", + "{} {}", match std::env::var_os("NODE_OPTIONS") { Some(value) => value .into_string() .map_err(std::env::VarError::NotUnicode)?, None => "".to_owned(), - } + }, + get_node_dns_option()?, ); // Setup log reader. @@ -2514,3 +2516,26 @@ fn is_hidden(entry: &walkdir::DirEntry) -> bool { .map(|s| s == "." || s.starts_with('.') || s == "target") .unwrap_or(false) } + +fn get_node_version() -> Result { + let node_version = std::process::Command::new("node") + .arg("--version") + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("node failed: {}", e.to_string()))?; + let output = std::str::from_utf8(&node_version.stdout)? + .strip_prefix('v') + .unwrap() + .trim(); + Version::parse(output).map_err(Into::into) +} + +fn get_node_dns_option() -> Result<&'static str> { + let version = get_node_version()?; + let req = VersionReq::parse(">=16.4.0").unwrap(); + let option = match req.matches(&version) { + true => "--dns-result-order=ipv4first", + false => "", + }; + Ok(option) +}