From a3a214800280894cc8faa358462b128194311e4c Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Thu, 21 Mar 2024 19:54:14 -0700 Subject: [PATCH] kratactl: initial windows bringup --- .github/workflows/client.yml | 7 +++++++ crates/kratactl/Cargo.toml | 4 +++- crates/kratactl/src/client.rs | 33 +++++++++++++++++++++++++-------- crates/kratactl/src/console.rs | 21 +++++++++++++-------- hack/build/cross-compile.sh | 6 ++++++ hack/build/target.sh | 20 ++++++++++++++++++++ hack/ci/install-windows-deps.sh | 4 ++++ 7 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 hack/ci/install-windows-deps.sh diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index ffa9ca4..fb07461 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -7,9 +7,14 @@ jobs: os: - { name: linux, on: ubuntu-latest } - { name: darwin, on: macos-14 } + - { name: windows, on: windows-latest } arch: - x86_64 - aarch64 + exclude: + # aarch64 windows support is not available in downstream dependencies + - os: { name: windows, on: windows-latest } + arch: aarch64 env: TARGET_OS: "${{ matrix.os.name }}" TARGET_ARCH: "${{ matrix.arch }}" @@ -29,4 +34,6 @@ jobs: if: ${{ matrix.os.name == 'darwin' }} - run: ./hack/ci/install-mac-deps.sh if: ${{ matrix.os.name == 'darwin' }} + - run: ./hack/ci/install-windows-deps.sh + if: ${{ matrix.os.name == 'windows' }} - run: ./hack/build/cargo.sh build --bin kratactl diff --git a/crates/kratactl/Cargo.toml b/crates/kratactl/Cargo.toml index e7e61ca..a453326 100644 --- a/crates/kratactl/Cargo.toml +++ b/crates/kratactl/Cargo.toml @@ -13,13 +13,15 @@ env_logger = { workspace = true } krata = { path = "../krata" } log = { workspace = true } serde = { workspace = true } -termion = { workspace = true } tokio = { workspace = true } tokio-stream = { workspace = true } tonic = { workspace = true } tower = { workspace = true } url = { workspace = true } +[target.'cfg(unix)'.dependencies] +termion = { workspace = true } + [lib] name = "kratactl" diff --git a/crates/kratactl/src/client.rs b/crates/kratactl/src/client.rs index 44fe5ed..82c4705 100644 --- a/crates/kratactl/src/client.rs +++ b/crates/kratactl/src/client.rs @@ -1,7 +1,13 @@ +#[cfg(not(unix))] +use anyhow::anyhow; use anyhow::Result; use krata::{control::control_service_client::ControlServiceClient, dial::ControlDialAddress}; +#[cfg(unix)] use tokio::net::UnixStream; -use tonic::transport::{Channel, ClientTlsConfig, Endpoint, Uri}; +#[cfg(unix)] +use tonic::transport::Uri; +use tonic::transport::{Channel, ClientTlsConfig, Endpoint}; +#[cfg(unix)] use tower::service_fn; pub struct ControlClientProvider {} @@ -10,13 +16,13 @@ impl ControlClientProvider { pub async fn dial(addr: ControlDialAddress) -> Result> { let channel = match addr { ControlDialAddress::UnixSocket { path } => { - // This URL is not actually used but is required to be specified. - Endpoint::try_from(format!("unix://localhost/{}", path))? - .connect_with_connector(service_fn(|uri: Uri| { - let path = uri.path().to_string(); - UnixStream::connect(path) - })) - .await? + #[cfg(not(unix))] + return Err(anyhow!( + "unix sockets are not supported on this platform (path {})", + path + )); + #[cfg(unix)] + ControlClientProvider::dial_unix_socket(path).await? } ControlDialAddress::Tcp { host, port } => { @@ -41,4 +47,15 @@ impl ControlClientProvider { Ok(ControlServiceClient::new(channel)) } + + #[cfg(unix)] + async fn dial_unix_socket(path: String) -> Result { + // This URL is not actually used but is required to be specified. + Ok(Endpoint::try_from(format!("unix://localhost/{}", path))? + .connect_with_connector(service_fn(|uri: Uri| { + let path = uri.path().to_string(); + UnixStream::connect(path) + })) + .await?) + } } diff --git a/crates/kratactl/src/console.rs b/crates/kratactl/src/console.rs index 9a3ab94..f41d17d 100644 --- a/crates/kratactl/src/console.rs +++ b/crates/kratactl/src/console.rs @@ -1,8 +1,3 @@ -use std::{ - io::stdout, - os::fd::{AsRawFd, FromRawFd}, -}; - use anyhow::Result; use async_stream::stream; use krata::{ @@ -10,9 +5,13 @@ use krata::{ control::{watch_events_reply::Event, ConsoleDataReply, ConsoleDataRequest}, }; use log::debug; +#[cfg(unix)] +use std::os::fd::{AsRawFd, FromRawFd}; +#[cfg(unix)] use termion::raw::IntoRawMode; +#[cfg(unix)] +use tokio::fs::File; use tokio::{ - fs::File, io::{stdin, AsyncReadExt, AsyncWriteExt}, task::JoinHandle, }; @@ -48,8 +47,14 @@ impl StdioConsoleStream { } pub async fn stdout(mut stream: Streaming) -> Result<()> { - let terminal = stdout().into_raw_mode()?; - let mut stdout = unsafe { File::from_raw_fd(terminal.as_raw_fd()) }; + #[cfg(unix)] + let terminal = std::io::stdout().into_raw_mode()?; + #[cfg(unix)] + let mut stdout = + unsafe { File::from_std(std::fs::File::from_raw_fd(terminal.as_raw_fd())) }; + #[cfg(not(unix))] + let mut stdout = tokio::io::stdout(); + while let Some(reply) = stream.next().await { let reply = reply?; if reply.data.is_empty() { diff --git a/hack/build/cross-compile.sh b/hack/build/cross-compile.sh index 23c65ca..704e45a 100755 --- a/hack/build/cross-compile.sh +++ b/hack/build/cross-compile.sh @@ -14,8 +14,14 @@ then fi HOST_OS="$(uname -s)" +HOST_OS="$(echo "${HOST_OS}" | awk -F '_' '{print $1}')" HOST_OS="$(echo "${HOST_OS}" | tr '[:upper:]' '[:lower:]')" +if [ "${HOST_OS}" = "mingw64" ] +then + HOST_OS="windows" +fi + if [ -z "${TARGET_OS}" ] then TARGET_OS="${HOST_OS}" diff --git a/hack/build/target.sh b/hack/build/target.sh index 51c4aed..252ed01 100755 --- a/hack/build/target.sh +++ b/hack/build/target.sh @@ -19,7 +19,13 @@ fi if [ -z "${TARGET_OS}" ] then TARGET_OS="$(uname -s)" + TARGET_OS="$(echo "${TARGET_OS}" | awk -F '_' '{print $1}')" TARGET_OS="$(echo "${TARGET_OS}" | tr '[:upper:]' '[:lower:]')" + + if [ "${TARGET_OS}" = "mingw64" ] + then + TARGET_OS="windows" + fi fi if [ "${TARGET_OS}" = "darwin" ] @@ -36,6 +42,20 @@ then RUST_TARGET="aarch64-apple-darwin" fi fi +elif [ "${TARGET_OS}" = "windows" ] +then + if [ -z "${RUST_TARGET}" ] + then + if [ "${TARGET_ARCH}" = "x86_64" ] + then + RUST_TARGET="x86_64-pc-windows-msvc" + fi + + if [ "${TARGET_ARCH}" = "aarch64" ] + then + RUST_TARGET="aarch64-pc-windows-msvc" + fi + fi else if [ -z "${RUST_TARGET}" ] then diff --git a/hack/ci/install-windows-deps.sh b/hack/ci/install-windows-deps.sh new file mode 100644 index 0000000..9d3f868 --- /dev/null +++ b/hack/ci/install-windows-deps.sh @@ -0,0 +1,4 @@ +#!/bin/sh +set -e + +winget install protobuf