11mod system_information;
22
3+ use clap:: Parser ;
34use local_ip_address:: list_afinet_netifas;
45use std:: collections:: { HashMap , HashSet } ;
56use sysinfo:: { Disks , System } ;
@@ -8,79 +9,103 @@ use crate::system_information::{SystemInformation, SystemNetworkInfo};
89use hickory_resolver:: system_conf:: read_system_conf;
910use hickory_resolver:: Resolver ;
1011use 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
1328fn 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
86111fn get_network_info ( ) -> SystemNetworkInfo {
0 commit comments