pub struct FmdAdm { /* private fields */ }Expand description
A handle to the Fault Management Daemon administrative interface.
This handle wraps a C fmd_adm_t pointer that is not thread-safe.
FmdAdm is !Send and !Sync — it cannot be shared across threads.
All iterator methods (modules(), cases(), resources(), etc.)
eagerly collect results into a Vec. The underlying C API uses
callbacks that own the data only for the duration of each
invocation, so results must be copied before the callback returns.
Implementations§
Source§impl FmdAdm
impl FmdAdm
Sourcepub fn open() -> Result<Self, Error>
pub fn open() -> Result<Self, Error>
Open a connection to the local fault management daemon.
Examples found in repository?
25fn main() {
26 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
27 let cases = adm.cases(None).expect("failed to list cases");
28
29 if let Some(c) = cases.first() {
30 println!("Case {} ({})\n", c.uuid, c.code);
31 if let Some(event) = &c.event {
32 print_nvlist(event, 0);
33 } else {
34 println!(" (no event data)");
35 }
36 } else {
37 println!("No cases found.");
38 }
39}More examples
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 println!("=== FMD Modules ===");
7 let modules = adm.modules().expect("failed to list modules");
8 for m in &modules {
9 println!(
10 " {} v{} - {}{}",
11 m.name,
12 m.version,
13 m.description,
14 if m.failed { " [FAILED]" } else { "" },
15 );
16 }
17 println!("({} modules total)", modules.len());
18
19 println!("\n=== Faulty Resources ===");
20 let resources = adm.resources(true).expect("failed to list resources");
21 if resources.is_empty() {
22 println!(" (none)");
23 } else {
24 for r in &resources {
25 println!(" {} (case {})", r.fmri, r.uuid);
26 }
27 }
28
29 println!("\n=== Cases ===");
30 let cases = adm.cases(None).expect("failed to list cases");
31 if cases.is_empty() {
32 println!(" (none)");
33 } else {
34 for c in &cases {
35 let severity = c
36 .event
37 .as_ref()
38 .and_then(|e| e.lookup("severity"))
39 .and_then(|v| match v {
40 NvValue::String(s) => Some(s.as_str()),
41 _ => None,
42 })
43 .unwrap_or("unknown");
44 println!(" {} - {} (severity: {})", c.uuid, c.code, severity);
45 }
46 }
47}3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}Sourcepub fn modules(&self) -> Result<Vec<ModuleInfo>, Error>
pub fn modules(&self) -> Result<Vec<ModuleInfo>, Error>
Iterate over loaded FMD modules.
Examples found in repository?
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 println!("=== FMD Modules ===");
7 let modules = adm.modules().expect("failed to list modules");
8 for m in &modules {
9 println!(
10 " {} v{} - {}{}",
11 m.name,
12 m.version,
13 m.description,
14 if m.failed { " [FAILED]" } else { "" },
15 );
16 }
17 println!("({} modules total)", modules.len());
18
19 println!("\n=== Faulty Resources ===");
20 let resources = adm.resources(true).expect("failed to list resources");
21 if resources.is_empty() {
22 println!(" (none)");
23 } else {
24 for r in &resources {
25 println!(" {} (case {})", r.fmri, r.uuid);
26 }
27 }
28
29 println!("\n=== Cases ===");
30 let cases = adm.cases(None).expect("failed to list cases");
31 if cases.is_empty() {
32 println!(" (none)");
33 } else {
34 for c in &cases {
35 let severity = c
36 .event
37 .as_ref()
38 .and_then(|e| e.lookup("severity"))
39 .and_then(|v| match v {
40 NvValue::String(s) => Some(s.as_str()),
41 _ => None,
42 })
43 .unwrap_or("unknown");
44 println!(" {} - {} (severity: {})", c.uuid, c.code, severity);
45 }
46 }
47}More examples
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}Sourcepub fn resources(&self, all: bool) -> Result<Vec<ResourceInfo>, Error>
pub fn resources(&self, all: bool) -> Result<Vec<ResourceInfo>, Error>
Iterate over faulty resources.
If all is true, includes resources that are not directly visible.
Examples found in repository?
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 println!("=== FMD Modules ===");
7 let modules = adm.modules().expect("failed to list modules");
8 for m in &modules {
9 println!(
10 " {} v{} - {}{}",
11 m.name,
12 m.version,
13 m.description,
14 if m.failed { " [FAILED]" } else { "" },
15 );
16 }
17 println!("({} modules total)", modules.len());
18
19 println!("\n=== Faulty Resources ===");
20 let resources = adm.resources(true).expect("failed to list resources");
21 if resources.is_empty() {
22 println!(" (none)");
23 } else {
24 for r in &resources {
25 println!(" {} (case {})", r.fmri, r.uuid);
26 }
27 }
28
29 println!("\n=== Cases ===");
30 let cases = adm.cases(None).expect("failed to list cases");
31 if cases.is_empty() {
32 println!(" (none)");
33 } else {
34 for c in &cases {
35 let severity = c
36 .event
37 .as_ref()
38 .and_then(|e| e.lookup("severity"))
39 .and_then(|v| match v {
40 NvValue::String(s) => Some(s.as_str()),
41 _ => None,
42 })
43 .unwrap_or("unknown");
44 println!(" {} - {} (severity: {})", c.uuid, c.code, severity);
45 }
46 }
47}More examples
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}Sourcepub fn resource_count(&self, all: bool) -> Result<u32, Error>
pub fn resource_count(&self, all: bool) -> Result<u32, Error>
Get the count of faulty resources.
Examples found in repository?
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}Sourcepub fn resource_repaired(&mut self, fmri: &str) -> Result<(), Error>
pub fn resource_repaired(&mut self, fmri: &str) -> Result<(), Error>
Mark a resource (by FMRI) as repaired.
Sourcepub fn resource_replaced(&mut self, fmri: &str) -> Result<(), Error>
pub fn resource_replaced(&mut self, fmri: &str) -> Result<(), Error>
Mark a resource (by FMRI) as replaced.
Sourcepub fn resource_acquit(
&mut self,
fmri: &str,
case_uuid: &Uuid,
) -> Result<(), Error>
pub fn resource_acquit( &mut self, fmri: &str, case_uuid: &Uuid, ) -> Result<(), Error>
Acquit a resource (by FMRI) for a specific case UUID.
Sourcepub fn cases(&self, url: Option<&str>) -> Result<Vec<CaseInfo>, Error>
pub fn cases(&self, url: Option<&str>) -> Result<Vec<CaseInfo>, Error>
Iterate over cases, optionally filtered by URL.
Examples found in repository?
25fn main() {
26 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
27 let cases = adm.cases(None).expect("failed to list cases");
28
29 if let Some(c) = cases.first() {
30 println!("Case {} ({})\n", c.uuid, c.code);
31 if let Some(event) = &c.event {
32 print_nvlist(event, 0);
33 } else {
34 println!(" (no event data)");
35 }
36 } else {
37 println!("No cases found.");
38 }
39}More examples
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 println!("=== FMD Modules ===");
7 let modules = adm.modules().expect("failed to list modules");
8 for m in &modules {
9 println!(
10 " {} v{} - {}{}",
11 m.name,
12 m.version,
13 m.description,
14 if m.failed { " [FAILED]" } else { "" },
15 );
16 }
17 println!("({} modules total)", modules.len());
18
19 println!("\n=== Faulty Resources ===");
20 let resources = adm.resources(true).expect("failed to list resources");
21 if resources.is_empty() {
22 println!(" (none)");
23 } else {
24 for r in &resources {
25 println!(" {} (case {})", r.fmri, r.uuid);
26 }
27 }
28
29 println!("\n=== Cases ===");
30 let cases = adm.cases(None).expect("failed to list cases");
31 if cases.is_empty() {
32 println!(" (none)");
33 } else {
34 for c in &cases {
35 let severity = c
36 .event
37 .as_ref()
38 .and_then(|e| e.lookup("severity"))
39 .and_then(|v| match v {
40 NvValue::String(s) => Some(s.as_str()),
41 _ => None,
42 })
43 .unwrap_or("unknown");
44 println!(" {} - {} (severity: {})", c.uuid, c.code, severity);
45 }
46 }
47}Sourcepub fn serd_engines(&self, module: &str) -> Result<Vec<SerdInfo>, Error>
pub fn serd_engines(&self, module: &str) -> Result<Vec<SerdInfo>, Error>
Iterate over SERD engines for a module.
Examples found in repository?
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}Sourcepub fn transports(&self) -> Result<Vec<TransportId>, Error>
pub fn transports(&self) -> Result<Vec<TransportId>, Error>
Iterate over transports.
Examples found in repository?
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}Sourcepub fn stats(&self, module: Option<&str>) -> Result<Vec<Stat>, Error>
pub fn stats(&self, module: Option<&str>) -> Result<Vec<Stat>, Error>
Read statistics, optionally for a specific module.
Examples found in repository?
3fn main() {
4 let adm = FmdAdm::open().expect("failed to open fmd adm handle");
5
6 // Validate resource_count against resources().len()
7 let resources = adm.resources(true).expect("failed to list resources");
8 let count = adm.resource_count(true).expect("failed to count resources");
9 println!("=== Resources ===");
10 println!(
11 " resources(all=true).len() = {}, resource_count(all=true) = {}",
12 resources.len(),
13 count,
14 );
15 assert_eq!(resources.len(), count as usize, "resource count mismatch!");
16
17 // Transports
18 println!("\n=== Transports ===");
19 let xprts = adm.transports().expect("failed to list transports");
20 if xprts.is_empty() {
21 println!(" (none)");
22 } else {
23 for id in &xprts {
24 println!(" transport {id}");
25 }
26 }
27
28 // SERD engines for each module
29 println!("\n=== SERD Engines ===");
30 let modules = adm.modules().expect("failed to list modules");
31 let mut total = 0;
32 for m in &modules {
33 let engines = adm
34 .serd_engines(&m.name)
35 .expect("failed to list serd engines");
36 if !engines.is_empty() {
37 println!(" {} ({} engines):", m.name, engines.len());
38 for e in &engines {
39 println!(
40 " {} - count={}, n={}, fired={}",
41 e.name, e.count, e.n, e.fired,
42 );
43 }
44 total += engines.len();
45 }
46 }
47 if total == 0 {
48 println!(" (none)");
49 }
50
51 // Global stats
52 println!("\n=== Global Stats ===");
53 let stats = adm.stats(None).expect("failed to read stats");
54 for s in &stats {
55 println!(" {}: {} ({})", s.name, s.value, s.description);
56 }
57
58 // Per-module stats for the first module
59 if let Some(m) = modules.first() {
60 println!("\n=== Stats for {} ===", m.name);
61 let mstats = adm
62 .stats(Some(&m.name))
63 .expect("failed to read module stats");
64 for s in &mstats {
65 println!(" {}: {} ({})", s.name, s.value, s.description);
66 }
67 }
68}