Podman-api-rs - Rust interface to Podman (libpod).

Overview

podman-api

GitHub Actions MIT licensed Released API docs

Rust interface to Podman

Usage

Add the following to your Cargo.toml file

[dependencies]
podman-api = "0.1"

SSL Connection

To enable HTTPS connection to docker add a tls flag to Cargo.toml.

Default features

By default only chrono feature is enabled. To disable it use:

podman-api = { version = "0.1", default-features = false }

Examples

Examples for most API endpoints can be found in the library documentation.

License

MIT

Comments
  • How to get ContainerNetworkConfig or PortBindings

    How to get ContainerNetworkConfig or PortBindings

    I see the struct I need in the model yet dont know of any way to get it. I know that if I run podman container inspect I get this info. Thoughts? Maybe something you are looking for help with?

    opened by dwhiteddsoft 4
  • Deserialization error in `LibpodContainerInspectResponse::host_config::port_bindings`

    Deserialization error in `LibpodContainerInspectResponse::host_config::port_bindings`

    • Crate version: 0.2.1
    • OS: Fedora Linux 35.20220322.1 (Silverblue)
    • Output of running podman version on the command line:
    Version:      3.4.4
    API Version:  3.4.4
    Go Version:   go1.16.8
    Built:        Wed Dec  8 22:45:07 2021
    OS/Arch:      linux/amd64
    

    I'm facing deserialization errors for some of my containers. It seems that port_bindings can have null as values?

    Here is the LibpodContainerInspectResponse from an affected container (I had to put a .zip at the end of the text file. Else, github wouldn't allow me to upload the file): test.json.zip

    This is the error I'm getting when trying to deserialize this json

    > Executing task: cargo test --package podman-api --lib -- api::containers::test --nocapture <
    
        Finished test [unoptimized + debuginfo] target(s) in 0.56s
         Running unittests (target/debug/deps/podman_api-cc7230060d3387cf)
    
    running 1 test
    thread 'api::containers::test::test' panicked at 'called `Result::unwrap()` on an `Err` value: Error("invalid type: null, expected a sequence", line: 222, column: 29)', src/api/containers.rs:1174:91
    stack backtrace:
       0: rust_begin_unwind
                 at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/std/src/panicking.rs:498:5
       1: core::panicking::panic_fmt
                 at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/panicking.rs:116:14
       2: core::result::unwrap_failed
                 at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/result.rs:1690:5
       3: core::result::Result<T,E>::unwrap
                 at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/result.rs:1018:23
       4: podman_api::api::containers::test::test
                 at ./src/api/containers.rs:1174:9
       5: podman_api::api::containers::test::test::{{closure}}
                 at ./src/api/containers.rs:1173:5
       6: core::ops::function::FnOnce::call_once
                 at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/ops/function.rs:227:5
       7: core::ops::function::FnOnce::call_once
                 at /rustc/9d1b2106e23b1abd32fce1f17267604a5102f57a/library/core/src/ops/function.rs:227:5
    note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
    test api::containers::test::test ... FAILED
    
    failures:
    
    failures:
        api::containers::test::test
    
    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.02s
    
    error: test failed, to rerun pass '-p podman-api --lib'
    
    C-bug A-codegen 
    opened by marhkb 3
  • Change return type of `Exec::start` to `Result<tty::Multiplexer<'exec>>`

    Change return type of `Exec::start` to `Result>`

    In https://github.com/marhkb/pods/pull/451, I implemented a container terminal. For that, I had a look at podman-desktop. They use an exec instance for this

    https://github.com/containers/podman-desktop/blob/b12514dc0a894befc530069142c43daf77cb7eef/packages/main/src/plugin/container-registry.ts#L724

    In this branch I changed the dignature of Exec::start to return a Multiplexer. I haven't opened a PR for that, because I think I have to check whether tty = true is set in the Opts. But to do that I had to change params to pub(crate). I'm not sure whether there are better approaches.

    C-feature 
    opened by marhkb 2
  • Use POST inside `Exec::resize`

    Use POST inside `Exec::resize`

    Otherwise, the function always returns a serialization error.

    What did you implement:

    I was trying to resize an exec instance in https://github.com/marhkb/pods/pull/451 but realized that it always failed because GET was used instead of POST. Therefore, I changed to POST.

    How did you verify your change:

    After implementing the change, the width of the output of ls in an Alpine container could be changed.

    opened by marhkb 2
  • Reading part of `Container::attach` seems to be stuck in `next`

    Reading part of `Container::attach` seems to be stuck in `next`

    I try to attach to a simple alpine container. For that, I just use the code from the documentation of the Container::attach API like

    let container = podman.containers().get("{container}");
    let tty_multiplexer = container.attach(&Default::default()).await.unwrap();
    let (mut reader, _writer) = tty_multiplexer.split();
    
    while let Some(tty_result) = reader.next().await {
        match tty_result {
            Ok(chunk) => println!("{:?}", chunk),
            Err(e) => eprintln!("Error: {}", e),
        }
    }
    

    Additionally, while executing this piece of code, I run podman container attach <container> in Terminal 1 and curl -X POST --unix-socket /run/user/1000/podman/podman.sock http://d/v4.0.0/libpod/containers/{container}/attach in Terminal 2.

    Now, when I type some command in Terminal 1 I can see the input and output in Terminal 2, but the rust code is stuck in await.

    Writing within in the rust code seems to work, though. When run the following code, I can see the input and output in both Terminal 1 and Terminal 2.

    let (_, mut writer) = multiplexer.split();
    let len = writer.write(b"date\n").await.unwrap();
    

    Are you able to get the reading part working? I had a look into code, but unfortunately without success.

    • Crate version: Master (f1c8d444c6e1aa612447852c00359ac28a86fede)
    • OS: Fedora 37
    • Output of running podman version on the command line:
    Client:       Podman Engine
    Version:      4.3.0
    API Version:  4.3.0
    Go Version:   go1.19.2
    Built:        Fri Oct 21 10:09:51 2022
    OS/Arch:      linux/amd64
    
    C-bug 
    opened by marhkb 2
  • How to support Send

    How to support Send

    Hi! I am looking to use this library with a threadpool and am running into problems because most of the API is not Send. I wanted to open this issue up to see what your opinions are.

    opened by arlyon 2
  • Regression in constructing JSON filters

    Regression in constructing JSON filters

    For example, a deserialized container filter now looks like

    {"id":["id=0c24b5b39bab46f79c7b763a21f4562692400af0963e4e82d2f4d58c4e1aaffa"]}
    

    But it should look like

    {"id":["i0c24b5b39bab46f79c7b763a21f4562692400af0963e4e82d2f4d58c4e1aaffa"]}
    

    So, if we URL encode the first JSON, we don't retrieve any containers

    $ curl --unix-socket /run/user/1000/podman/podman.sock http://d/v3.0.0/libpod/containers/json\?all\=true\&filters=%7B%22id%22%3A%5B%22id%3Da9ee744d373ad80a280f66cb3fdcd443b9320482ce1d32c9999c3ae1806116d5%22%5D%7D
    []
    

    If we remove the id= part, we retrieve the correct result.

    $ curl --unix-socket /run/user/1000/podman/podman.sock http://d/v3.0.0/libpod/containers/json\?all\=true\&filters=%7B%22id%22%3A%5B%220c24b5b39bab46f79c7b763a21f4562692400af0963e4e82d2f4d58c4e1aaffa%22%5D%7D
    [{"AutoRemove":false,"Command":["mongod"],"Created":"2022-08-27T21:10:48.274351047+02:00","CreatedAt":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"Id":"0c24b5b39bab46f79c7b763a21f4562692400af0963e4e82d2f4d58c4e1aaffa","Image":"docker.io/library/mongo:latest","ImageID":"a3c1334134aafd75500fbfe5cddbc0bde4d628725cb074bf988edbbad2cf0acc","IsInfra":false,"Labels":null,"Mounts":["/data/configdb","/data/db"],"Names":["TEST_PODMAN_API_RS"],"Namespaces":{},"Networks":[],"Pid":709080,"Pod":"","PodName":"","Ports":[{"host_ip":"","container_port":27017,"host_port":27017,"range":1,"protocol":"tcp"}],"Size":null,"StartedAt":1661627448,"State":"running","Status":"healthy"}]
    
    
    • Crate version: 0.5.0 (9d02f4b60d3129ca7d2291e30d0f4136e5d9a1da)
    • OS: 5.18.18-200.fc36.x86_64 SMP PREEMPT_DYNAMIC Wed Aug 17 16:02:04 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
    • Output of running podman version on the command line:
    Client:       Podman Engine
    Version:      4.2.0
    API Version:  4.2.0
    Go Version:   go1.18.4
    Built:        Thu Aug 11 16:42:17 2022
    OS/Arch:      linux/amd64
    
    C-bug 
    opened by marhkb 2
  • Podman exec leaks conmon processes

    Podman exec leaks conmon processes

    When running create_exec & exec.start() a conmon process is launched that does not terminate even after the command completes.

    OS: RHEL 8.6 Podman: 4.0.2 Crate: 0.4.0

    Steps to Reproduce

    1. Launch an image in terminal mode to keep it running and obtain the image id
    2. Compile and run the code below to exec a sleep every 5 seconds:

    ./podman_conmon <container_id>

    1. Use ps -aux and observe that it is filled up with conmon processes:

    myuser 28551 0.0 0.0 143860 2452 ? Ssl 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28583 0.0 0.0 143860 828 ? S 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28586 0.0 0.0 143860 2420 ? Ssl 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28617 0.0 0.0 143860 828 ? S 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28622 0.0 0.0 143860 2484 ? Ssl 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28658 0.0 0.0 143860 832 ? S 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28660 0.0 0.0 143860 2336 ? Ssl 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6 myuser 28692 0.0 0.0 143860 828 ? S 14:18 0:00 /usr/bin/conmon --api-version 1 -c e50b946b3bbee1cc1398d75d09a555bab6

    1. Now use the podman CLI and observe that the conmon process is not leaked:

    podman exec <container_id> /usr/bin/sleep 5

    use futures::StreamExt;
    use podman_api::{Podman, conn::TtyChunk, opts::ExecStartOpts};
    
    #[tokio::main]
    async fn main() {
        let args: Vec<String> = env::args().collect();
    
        let podman = Podman::unix("/run/user/78572/podman/podman.sock");
        let container_id = &args[1];
    
        loop {
            let cmd = vec!["/usr/bin/sleep", "5"];
    
            let container = podman.containers().get(container_id);
    
            let res = container.create_exec(
                &podman_api::opts::ExecCreateOpts::builder()
                    .command(cmd)
                    .attach_stdout(true)
                    .build(),
            ).await;
    
            let exec = res.unwrap();
            
            let opts = ExecStartOpts::default();
            let mut stream  = exec.start(&opts);
            while let Some(chunk) = stream.next().await {
                if let Ok(msg) = chunk {
                    match msg {
                        TtyChunk::StdOut(message) => {
                            let str = String::from_utf8_lossy(&message);
                            println!("stdout [{}]: {}", container_id, str);
                        },
                        _default => {  }
                    }
                }
            }
        }
    }
    

    Cargo.toml:

    [package]
    name = "podman_conmon"
    version = "0.1.0"
    edition = "2021"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    bollard = "0.13.0"
    futures = "0.3.21"
    podman-api = "0.4"
    tokio = { version = "1.19.2", features = ["macros", "process", "rt-multi-thread", "sync"] }
    
    opened by MarkRx 2
  • `Podman::info` returns `HostInfo` with all fields set to `None`

    `Podman::info` returns `HostInfo` with all fields set to `None`

    Not sure whether I'm holding it wrong, but Podman::info returns an HostInfo with all fields set to None.

    HostInfo { arch: None, buildah_version: None, cgroup_controllers: None, cgroup_manager: None, cgroup_version: None, conmon: None, cpus: None, distribution: None, event_logger: None, hostname: None, id_mappings: None, kernel: None, linkmode: None, log_driver: None, mem_free: None, mem_total: None, oci_runtime: None, os: None, remote_socket: None, runtime_info: None, security: None, service_is_remote: None, slirp4netns: None, swap_free: None, swap_total: None, uptime: None }
    

    I investigated a bit and indeed the query returns the following raw string

    "{\"host\":{\"arch\":\"amd64\",\"buildahVersion\":\"1.23.1\",\"cgroupManager\":\"systemd\",\"cgroupVersion\":\"v2\",\"cgroupControllers\":[\"cpu\",\"io\",\"memory\",\"pids\"],\"conmon\":{\"package\":\"conmon-2.1.0-2.fc35.x86_64\",\"path\":\"/usr/bin/conmon\",\"version\":\"conmon version 2.1.0, commit: \"},\"cpus\":16,\"distribution\":{\"distribution\":\"fedora\",\"variant\":\"silverblue\",\"version\":\"35\"},\"eventLogger\":\"journald\",\"hostname\":\"asus-tuf-gaming-X570-plus\",\"idMappings\":{\"gidmap\":[{\"container_id\":0,\"host_id\":1000,\"size\":1},{\"container_id\":1,\"host_id\":100000,\"size\":65536}],\"uidmap\":[{\"container_id\":0,\"host_id\":1000,\"size\":1},{\"container_id\":1,\"host_id\":100000,\"size\":65536}]},\"kernel\":\"5.16.12-200.fc35.x86_64\",\"logDriver\":\"journald\",\"memFree\":1817989120,\"memTotal\":33623433216,\"ociRuntime\":{\"name\":\"crun\",\"package\":\"crun-1.4.2-1.fc35.x86_64\",\"path\":\"/usr/bin/crun\",\"version\":\"crun version 1.4.2\\ncommit: f6fbc8f840df1a414f31a60953ae514fa497c748\\nspec: 1.0.0\\n+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL\"},\"os\":\"linux\",\"remoteSocket\":{\"path\":\"/run/user/1000/podman/podman.sock\",\"exists\":true},\"serviceIsRemote\":false,\"security\":{\"apparmorEnabled\":false,\"capabilities\":\"CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT\",\"rootless\":true,\"seccompEnabled\":true,\"seccompProfilePath\":\"/usr/share/containers/seccomp.json\",\"selinuxEnabled\":true},\"slirp4netns\":{\"executable\":\"/usr/bin/slirp4netns\",\"package\":\"slirp4netns-1.1.12-2.fc35.x86_64\",\"version\":\"slirp4netns version 1.1.12\\ncommit: 7a104a101aa3278a2152351a082a6df71f57c9a3\\nlibslirp: 4.6.1\\nSLIRP_CONFIG_VERSION_MAX: 3\\nlibseccomp: 2.5.3\"},\"swapFree\":6812291072,\"swapTotal\":8589930496,\"uptime\":\"101h 52m 15.11s (Approximately 4.21 days)\",\"linkmode\":\"dynamic\"},\"store\":{\"configFile\":\"/var/home/marcus/.config/containers/storage.conf\",\"containerStore\":{\"number\":2,\"paused\":0,\"running\":1,\"stopped\":1},\"graphDriverName\":\"overlay\",\"graphOptions\":{},\"graphRoot\":\"/var/home/marcus/.local/share/containers/storage\",\"graphStatus\":{\"Backing Filesystem\":\"btrfs\",\"Native Overlay Diff\":\"true\",\"Supports d_type\":\"true\",\"Using metacopy\":\"false\"},\"imageStore\":{\"number\":1},\"runRoot\":\"/run/user/1000/containers\",\"volumePath\":\"/var/home/marcus/.local/share/containers/storage/volumes\"},\"registries\":{\"search\":[\"registry.fedoraproject.org\",\"registry.access.redhat.com\",\"docker.io\",\"quay.io\"]},\"plugins\":{\"volume\":[\"local\"],\"network\":[\"bridge\",\"macvlan\"],\"log\":[\"k8s-file\",\"none\",\"journald\"]},\"version\":{\"APIVersion\":\"3.4.4\",\"Version\":\"3.4.4\",\"GoVersion\":\"go1.16.8\",\"GitCommit\":\"\",\"BuiltTime\":\"Wed Dec  8 22:45:07 2021\",\"Built\":1638999907,\"OsArch\":\"linux/amd64\"}}"
    

    This seems to be in line with the documentation (https://docs.podman.io/en/latest/_static/api.html?version=v3.4#operation/SystemInfoLibpod). So it seems HostInfo is embedded in a bigger data structure and that's why #[serde(skip_serializing_if = "Option::is_none")] kicks in as no matching fields could be found.

    A-system C-bug 
    opened by marhkb 2
  • Implement `events` endpoint

    Implement `events` endpoint

    First, I would like to thank you for this project. I use it in my project, and it makes my life a lot easier.

    Are there any plans to support the events endpoint in the future (https://docs.podman.io/en/latest/_static/api.html#operation/SystemEventsLibpod)? I have already seen #42, but there is no mention of the System API under which the endpoint can be found.

    I think this would be an important feature to use podman-api-rs in user interfaces. That way, one wouldn't always have to poll for changes.

    C-feature 
    opened by marhkb 2
  • Responses from top level of schema generated as `inline_response<status-code><n>`

    Responses from top level of schema generated as `inline_response`

    As described in the title, currently, swagger-codegen will loose the metadata of types defined in the top level.

    Example:

    responses:
      ContainerCreateResponse:
        description: Create container
        schema:
          properties:
            Id:
              description: ID of the container created
              type: string
              x-go-name: ID
            Warnings:
              description: Warnings during container creation
              items:
                type: string
              type: array
          type: object
    

    Here ContainerCreateResponse looses it's type name and description and only the fields in the schema are are available during codegen.

    To avoid this, the types are manually mapped to their corresponding values: https://github.com/vv9k/podman-api-rs/blob/5cd62929657eb7761f5708c365b4c3dac45c7059/codegen/src/main/java/podman_api/codegen/PodmanApiCodegen.java#L22-L40

    This should probably be generated automatically as well.

    C-bug A-codegen 
    opened by vv9k 2
  • Support for Podman over ssh remote connection

    Support for Podman over ssh remote connection

    Hello there, good day!

    At work, I use Golang with podman, and they have a way to connect to other machines securely through ssh tcp streams. I think it would be a great addition to this library as well :)

    Here is the ssh library I found that supports the stream pass-through. Here are some connection examples:

    // connection examples:
    //   - ssh://<user>@<host>[:port]/run/podman/podman.sock?secure=True
    //   - unix://tmp/__podman.sock -t 0
    

    Then this library would parse and choose the most appropriate one for the job.

    I haven't explored this codebase enough to see how much work It would take, so If you need any help, please let me know

    C-feature 
    opened by lmtr0 6
  • Add missing integration tests

    Add missing integration tests

    A follow-up to #132 where initial integration tests were added. Current tests only test success scenarios, it would be great to also test error cases.

    C-tests 
    opened by vv9k 0
  • Invalid type signature of `PortMap`

    Invalid type signature of `PortMap`

    • Crate version: 0.2.1

    https://docs.rs/podman-api/latest/podman_api/models/type.PortMap.html

    PortMap should have a HashMap<String, Option<Vec<PortBinding>>> instead of HashMap<String, String>

    C-bug A-codegen 
    opened by vv9k 1
Owner
Wojciech Kępka
Wojciech Kępka
Modrinth API is a simple library for using Modrinth's API in Rust projects

Ferinth is a simple library for using the Modrinth API in Rust projects. It uses reqwest as its HTTP(S) client and deserialises responses to typed structs using serde.

null 20 Dec 8, 2022
The Safe Network Core. API message definitions, routing and nodes, client core api.

safe_network The Safe Network Core. API message definitions, routing and nodes, client core api. License This Safe Network repository is licensed unde

MaidSafe 101 Dec 19, 2022
Proxy copilot api to openai's gpt-4 api

Proxying Copilot API to OpenAI's GPT-4 API Usage Start the Server export GHU_TOKEN=ghu_xxxx; ./copilot2chat Or sh start.sh start # start the server th

Smark 3 Dec 6, 2023
The netns-rs crate provides an ultra-simple interface for handling network namespaces in Rust.

netns-rs The netns-rs crate provides an ultra-simple interface for handling network namespaces in Rust. Changing namespaces requires elevated privileg

OpenAnolis Community 7 Dec 15, 2022
Rust implementation of the JDA-NAS interface

udpqueue.rs This is a rust implementation of the original JDA-NAS natives. This can be used to make a minimal modular jar with only the required targe

Florian Spieß 13 Mar 8, 2023
Tunnel TCP traffic through SOCKS5 or HTTP using a TUN interface.

tun2proxy Tunnel TCP traffic through SOCKS5 or HTTP on Linux. Authentication not yet supported. Error handling incomplete and too restrictive. Build C

B. Blechschmidt 34 Nov 29, 2022
An experimental IPC interface definition language for Hubris.

Idol: interface definitions for Hubris This is an experimental interface definition language for defining IPC interfaces between tasks in a Hubris app

Oxide Computer Company 8 Oct 19, 2022
Replay packets from pcap -file to network interface

pktreplay can be used to read packets from pcap file or interface and write them into interface. By default packets are written with the same rate they have been saved into the pcap file, or, when reading from interface, as fast as they are received.

Jukka Taimisto 3 Nov 23, 2022
Docker daemon API in Rust

Bollard: an asynchronous rust client library for the docker API Bollard leverages the latest Hyper and Tokio improvements for an asynchronous API cont

Niel Drummond 439 Jan 3, 2023
A pure Rust implementation of WebRTC API

A pure Rust implementation of WebRTC API

WebRTC.rs 2.7k Jan 7, 2023
A rust client and structures to interact with the Clever-Cloud API.

Clever-Cloud Software Development Kit - Rust edition This crate provides structures and client to interact with the Clever-Cloud API. Status This crat

Clever Cloud 6 Jun 3, 2022
Revolt backend API server, built with Rust.

Delta Description Delta is a blazing fast API server built with Rust for Revolt. Features: Robust and efficient API routes for running a chat platform

Revolt 741 Dec 26, 2022
An implementation of the ZITADEL gRPC API in Rust.

An implementation of the ZITADEL gRPC API in Rust. Complemented with other useful elements such as ServiceAccount auth.

Christoph Bühler 10 Dec 15, 2022
Implementation of the Docker Registry HTTP API V2 in Rust, that can act as a proxy to other registries

Docker registry server and proxy (I'm bad at creating catchy names, but this one is good enough.) This project aims to implement a Docker Registry HTT

l4p1n (Mathias B.) 2 Dec 30, 2022
A simple API gateway written in Rust, using the Hyper and Reqwest libraries.

API Gateway A simple API gateway written in Rust, using the Hyper and Reqwest libraries. This gateway can be used to forward requests to different bac

Adão Raul 3 Apr 24, 2023
A library-first, lightweight, high-performance, cloud-native supported API gateway🪐 by RUST

Preview version, will not guarantee the stability of the API! Do NOT use in production environment! A library-first, lightweight, high-performance, cl

Ideal World 4 May 7, 2023
A sample API Gateway built in Rust (work in progress) for learning purposes

rust-api-gateway A sample API Gateway built in Rust (work in progress) for learning purposes. You can follow along by reading the tutorial articles: P

Luis Soares 4 Oct 29, 2023
ZeroNS: a name service centered around the ZeroTier Central API

ZeroNS: a name service centered around the ZeroTier Central API ZeroNS provides names that are a part of ZeroTier Central's configured networks; once

ZeroTier, Inc. 327 Dec 20, 2022
A wrapper for the Google Cloud DNS API

cloud-dns is a crate providing a client to interact with Google Cloud DNS v1

Embark 5 May 24, 2022