1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (C) 2026 Ordinary Labs, LLC.
//
// SPDX-License-Identifier: AGPL-3.0-only
use crate::cmds::accounts::get_current_account;
use crate::cmds::logs::{Logs, Sync, print_logs_metadata_table};
use clap::Subcommand;
use ordinary_api::client::OrdinaryApiClient;
#[derive(Subcommand, Debug)]
pub enum Root {
/// get system and process info for the
/// Ordinary API server.
Info,
/// get proxied service metrics
Metrics {
/// name of the service that you'd like to retrieve metrics for
#[arg(short, long)]
service: String,
},
/// query system and application logs
Logs {
#[command(subcommand)]
logs: Logs,
},
/// lock resources to prevent abuse
Lock {
/// account to be locked
#[arg(short, long)]
account: String,
},
/// unlock resources upon resolution
Unlock {
/// account to be unlocked
#[arg(short, long)]
account: String,
},
}
impl Root {
pub async fn handle(
&self,
api_domain: Option<&str>,
accept_invalid_certs: bool,
insecure: bool,
) -> anyhow::Result<()> {
let account = get_current_account(insecure)?;
let client = OrdinaryApiClient::new(
&account.host,
&account.name,
api_domain,
accept_invalid_certs,
crate::USER_AGENT,
false,
)?;
match self {
Self::Metrics { service } => {
let metrics = client.root_get_metrics(service.to_owned()).await?;
println!("{metrics}");
}
Self::Info => {
let api_info = client.root_get_info().await?;
println!("{}", serde_json::to_string(&api_info)?);
}
Self::Logs { logs } => match logs {
Logs::Query {
query,
json_columns,
sync,
} => {
if sync == &Some(true) {
client.root_logs_sync(None, None).await?;
}
let res = client.root_logs_query(query, json_columns.as_ref())?;
print!("{res}");
}
Logs::Search {
format,
query,
limit,
sync,
} => {
if sync == &Some(true) {
client.root_logs_sync(None, None).await?;
}
let res = client.root_logs_search(query, format.as_str(), limit)?;
print!("{res}");
}
Logs::List => client.root_logs_file_list()?,
Logs::Read { name } => {
if let Some(name) = name {
client.root_logs_file_read(name)?;
} else {
client.root_logs_file_read_all()?;
}
}
Logs::Sync { sync } => match sync {
Sync::Info => {
let remote_metadata = client.root_logs_remote_metadata().await?;
let local_metadata = client.root_logs_local_metadata()?;
print_logs_metadata_table(remote_metadata, local_metadata);
}
Sync::All { force } => {
client.root_logs_sync(*force, None).await?;
}
Sync::File { name } => {
client.root_logs_sync(None, Some(name)).await?;
}
},
},
Self::Lock { account } => {
client.root_lock_account(account.as_str()).await?;
}
Self::Unlock { account } => {
client.root_unlock_account(account.as_str()).await?;
}
}
Ok(())
}
}