Skip to content

Commit bfdd268

Browse files
nightkrTechassi
authored andcommitted
Add loop mode
Fixes #7
1 parent 4d465a0 commit bfdd268

2 files changed

Lines changed: 98 additions & 71 deletions

File tree

crates/containerdebug/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7+
clap = { version = "4.5.20", features = ["derive"] }
78

89
hickory-resolver = "0.24.1"
910
local-ip-address = "0.6.3"
1011
serde = { version = "1.0.210", features = ["derive"] }
1112
serde_json = "1.0.128"
13+
stackable-operator = { git = "https://github.com/stackabletech/operator-rs", tag = "stackable-operator-0.78.0", version = "0.78.0" }
1214
sysinfo = "0.32.0"
1315
users = "0.11.0"

crates/containerdebug/src/main.rs

Lines changed: 96 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod system_information;
22

3+
use clap::Parser;
34
use local_ip_address::list_afinet_netifas;
45
use std::collections::{HashMap, HashSet};
56
use sysinfo::{Disks, System};
@@ -8,79 +9,103 @@ use crate::system_information::{SystemInformation, SystemNetworkInfo};
89
use hickory_resolver::system_conf::read_system_conf;
910
use hickory_resolver::Resolver;
1011
use std::net::IpAddr;
11-
use std::time::Duration;
12+
use std::time::{Duration, Instant};
13+
14+
/// Collects and prints helpful debugging information about the environment that it is running in.
15+
#[derive(clap::Parser)]
16+
struct Opts {
17+
/// Loop every <DURATION>, instead of shutting down once completed (default <DURATION>: 1m)
18+
#[clap(
19+
long,
20+
default_missing_value = "1m",
21+
num_args = 0..=1,
22+
require_equals = true,
23+
value_name = "DURATION",
24+
)]
25+
loop_interval: Option<stackable_operator::time::Duration>,
26+
}
1227

1328
fn main() {
14-
// Please note that we use "new_all" to ensure that all list of
15-
// components, network interfaces, disks and users are already
16-
// filled!
17-
let sys = System::new_all();
18-
19-
let disks = Disks::new_with_refreshed_list();
20-
let disks = disks
21-
.into_iter()
22-
.map(|disk| system_information::Disk::from(disk))
23-
.collect();
24-
25-
let system_network_information = get_network_info();
26-
27-
let current_uid = users::get_current_uid();
28-
let current_gid = users::get_current_gid();
29-
let current_user = users::get_user_by_uid(current_uid).unwrap();
30-
31-
32-
let system_information = SystemInformation {
33-
cpu_count: sys.cpus().len(),
34-
physical_core_count: sys.physical_core_count(),
35-
36-
total_memory: sys.total_memory(),
37-
free_memory: sys.free_memory(),
38-
available_memory: sys.available_memory(),
39-
used_memory: sys.used_memory(),
40-
41-
total_swap: sys.total_swap(),
42-
free_swap: sys.free_swap(),
43-
used_swap: sys.used_swap(),
44-
45-
total_memory_cgroup: sys.cgroup_limits().map(|limit| limit.total_memory),
46-
free_memory_cgroup: sys.cgroup_limits().map(|limit| limit.free_memory),
47-
free_swap_cgroup: sys.cgroup_limits().map(|limit| limit.free_swap),
48-
49-
system_name: System::name(),
50-
kernel_version: System::kernel_version(),
51-
os_version: System::long_os_version(),
52-
host_name: System::host_name(),
53-
cpu_arch: System::cpu_arch(),
54-
55-
disks,
56-
57-
network_information: system_network_information,
58-
59-
60-
// Adding current user, UID, and GID info
61-
current_user: current_user.name().to_str().unwrap().to_string(),
62-
current_uid,
63-
current_gid,
64-
};
65-
66-
let serialized = serde_json::to_string_pretty(&system_information).unwrap();
67-
println!("{}", serialized);
68-
69-
// TODO:
70-
// Current time
71-
// SElinux/AppArmor
72-
// Maybe env variables (may contain secrets)
73-
// dmesg/syslog?
74-
// capabilities?
75-
// downward API
76-
// Somehow get the custom resources logged?
77-
78-
// Things left out for now because it doesn't seem too useful:
79-
// - Running processes
80-
// - Uptime/boot time
81-
// - Load average
82-
// - Network utilization
83-
// - Users/Groups
29+
let opts = Opts::parse();
30+
31+
let mut next_run = Instant::now();
32+
loop {
33+
std::thread::sleep(next_run.saturating_duration_since(Instant::now()));
34+
35+
// Please note that we use "new_all" to ensure that all list of
36+
// components, network interfaces, disks and users are already
37+
// filled!
38+
let sys = System::new_all();
39+
40+
let disks = Disks::new_with_refreshed_list();
41+
let disks = disks
42+
.into_iter()
43+
.map(system_information::Disk::from)
44+
.collect();
45+
46+
let system_network_information = get_network_info();
47+
48+
let current_uid = users::get_current_uid();
49+
let current_gid = users::get_current_gid();
50+
let current_user = users::get_user_by_uid(current_uid).unwrap();
51+
52+
let system_information = SystemInformation {
53+
cpu_count: sys.cpus().len(),
54+
physical_core_count: sys.physical_core_count(),
55+
56+
total_memory: sys.total_memory(),
57+
free_memory: sys.free_memory(),
58+
available_memory: sys.available_memory(),
59+
used_memory: sys.used_memory(),
60+
61+
total_swap: sys.total_swap(),
62+
free_swap: sys.free_swap(),
63+
used_swap: sys.used_swap(),
64+
65+
total_memory_cgroup: sys.cgroup_limits().map(|limit| limit.total_memory),
66+
free_memory_cgroup: sys.cgroup_limits().map(|limit| limit.free_memory),
67+
free_swap_cgroup: sys.cgroup_limits().map(|limit| limit.free_swap),
68+
69+
system_name: System::name(),
70+
kernel_version: System::kernel_version(),
71+
os_version: System::long_os_version(),
72+
host_name: System::host_name(),
73+
cpu_arch: System::cpu_arch(),
74+
75+
disks,
76+
77+
network_information: system_network_information,
78+
79+
// Adding current user, UID, and GID info
80+
current_user: current_user.name().to_str().unwrap().to_string(),
81+
current_uid,
82+
current_gid,
83+
};
84+
85+
let serialized = serde_json::to_string_pretty(&system_information).unwrap();
86+
println!("{}", serialized);
87+
88+
// TODO:
89+
// Current time
90+
// SElinux/AppArmor
91+
// Maybe env variables (may contain secrets)
92+
// dmesg/syslog?
93+
// capabilities?
94+
// downward API
95+
// Somehow get the custom resources logged?
96+
97+
// Things left out for now because it doesn't seem too useful:
98+
// - Running processes
99+
// - Uptime/boot time
100+
// - Load average
101+
// - Network utilization
102+
// - Users/Groups
103+
104+
match opts.loop_interval {
105+
Some(interval) => next_run += interval,
106+
None => break,
107+
}
108+
}
84109
}
85110

86111
fn get_network_info() -> SystemNetworkInfo {

0 commit comments

Comments
 (0)