Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ runseal @profile
runseal @resources
runseal @resolve resource:// resource://ssh/config
runseal @transpile --input-lang=seal --output-lang=bash ./operator.seal
runseal @tool json get '{"releaseVersion":"v0.2.1"}' '.releaseVersion'
runseal @tool json get '{"releaseVersion":"v0.6.0"}' '.releaseVersion'
runseal @wrappers
runseal @which :ssh-run
```
Expand Down
2 changes: 1 addition & 1 deletion app/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "runseal"
version = "0.2.1"
version = "0.6.0"
edition = "2024"

[dependencies]
Expand Down
5 changes: 4 additions & 1 deletion app/src/core/tool/cloudflare.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ use std::{
use anyhow::{Context, Result, bail};
use serde_json::Value as JsonValue;

mod dns_record;

#[derive(Debug, Clone)]
struct Config {
account_id: String,
Expand Down Expand Up @@ -85,7 +87,8 @@ fn zone(args: &[String]) -> Result<Option<String>> {
match args {
[command, rest @ ..] if command == "get" => zone_get(rest),
[ruleset, rest @ ..] if ruleset == "ruleset" => zone_ruleset(rest),
_ => bail!("usage: runseal @tool cloudflare zone get|ruleset ..."),
[dns, command, rest @ ..] if dns == "dns-record" => dns_record::eval(command, rest),
_ => bail!("usage: runseal @tool cloudflare zone get|ruleset|dns-record ..."),
}
}

Expand Down
73 changes: 73 additions & 0 deletions app/src/core/tool/cloudflare/dns_record.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
use anyhow::{Context, Result, bail};
use serde_json::Value as JsonValue;

use super::{load_config, optional_option, request, required_option};

pub(super) fn eval(command: &str, args: &[String]) -> Result<Option<String>> {
match command {
"list" => list(args),
"create" => create(args),
"update" => update(args),
_ => bail!("usage: runseal @tool cloudflare zone dns-record list|create|update ..."),
}
}

fn list(args: &[String]) -> Result<Option<String>> {
let zone_id = required_option(args, "--zone-id")?;
let query = optional_option(args, "--name")
.map(|name| vec![("name".to_string(), name)])
.unwrap_or_default();
let config = load_config()?;
let payload = request(
&config,
"GET",
&format!("/zones/{zone_id}/dns_records"),
query,
None,
)?;
let value: JsonValue = serde_json::from_str(&payload.unwrap_or_default())?;
Ok(Some(serde_json::to_string(
value.get("result").unwrap_or(&JsonValue::Array(Vec::new())),
)?))
}

fn create(args: &[String]) -> Result<Option<String>> {
let zone_id = required_option(args, "--zone-id")?;
let body = record_json(args)?;
let config = load_config()?;
let payload = request(
&config,
"POST",
&format!("/zones/{zone_id}/dns_records"),
Vec::new(),
Some(body),
)?;
result(payload)
}

fn update(args: &[String]) -> Result<Option<String>> {
let zone_id = required_option(args, "--zone-id")?;
let record_id = required_option(args, "--record-id")?;
let body = record_json(args)?;
let config = load_config()?;
let payload = request(
&config,
"PATCH",
&format!("/zones/{zone_id}/dns_records/{record_id}"),
Vec::new(),
Some(body),
)?;
result(payload)
}

fn record_json(args: &[String]) -> Result<JsonValue> {
let record_json = required_option(args, "--json")?;
serde_json::from_str(&record_json).context("invalid DNS record JSON")
}

fn result(payload: Option<String>) -> Result<Option<String>> {
let value: JsonValue = serde_json::from_str(&payload.unwrap_or_default())?;
Ok(Some(serde_json::to_string(
value.get("result").unwrap_or(&JsonValue::Null),
)?))
}
3 changes: 3 additions & 0 deletions app/src/core/tool/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ Tools:
fs contains-any <path> <text>... print true when file contains any text
fs backup-numbered <path> move path to .bak or .bak.N and print it
github pr checks probe <number> print true when PR checks are reported
cloudflare zone dns-record list list DNS records in a zone
cloudflare zone dns-record create create a DNS record from JSON
cloudflare zone dns-record update update a DNS record from JSON
cloudflare ... run an atomic Cloudflare resource op

@tool is the runseal atomic tool runtime. Tool inputs use argv/env, output is
Expand Down
Loading
Loading