pub struct FmdAdm { /* private fields */ }Expand description
A handle to the Fault Management Daemon administrative interface.
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?
examples/case_detail.rs (line 26)
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
examples/list_modules.rs (line 4)
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}examples/stats.rs (line 4)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}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?
examples/list_modules.rs (line 7)
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
examples/stats.rs (line 34)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}Sourcepub fn module_gc(&self, name: &str) -> Result<(), Error>
pub fn module_gc(&self, name: &str) -> Result<(), Error>
Garbage-collect an FMD module by name.
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?
examples/list_modules.rs (line 20)
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
examples/stats.rs (line 7)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}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?
examples/stats.rs (line 8)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}Sourcepub fn resource_repaired(&self, fmri: &str) -> Result<(), Error>
pub fn resource_repaired(&self, fmri: &str) -> Result<(), Error>
Mark a resource (by FMRI) as repaired.
Sourcepub fn resource_replaced(&self, fmri: &str) -> Result<(), Error>
pub fn resource_replaced(&self, fmri: &str) -> Result<(), Error>
Mark a resource (by FMRI) as replaced.
Sourcepub fn resource_acquit(
&self,
fmri: &str,
case_uuid: Option<&Uuid>,
) -> Result<(), Error>
pub fn resource_acquit( &self, fmri: &str, case_uuid: Option<&Uuid>, ) -> Result<(), Error>
Acquit a resource (by FMRI), optionally specifying a case UUID.
If case_uuid is None, the resource is acquitted across all cases.
Sourcepub fn resource_flush(&self, fmri: &str) -> Result<(), Error>
pub fn resource_flush(&self, fmri: &str) -> Result<(), Error>
Flush cached state for a resource (by FMRI).
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?
examples/case_detail.rs (line 27)
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
examples/list_modules.rs (line 30)
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?
examples/stats.rs (line 38)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}Sourcepub fn transports(&self) -> Result<Vec<TransportId>, Error>
pub fn transports(&self) -> Result<Vec<TransportId>, Error>
Iterate over transports.
Examples found in repository?
examples/stats.rs (line 23)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}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?
examples/stats.rs (line 56)
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!(
16 resources.len(),
17 count as usize,
18 "resource count mismatch!"
19 );
20
21 // Transports
22 println!("\n=== Transports ===");
23 let xprts = adm.transports().expect("failed to list transports");
24 if xprts.is_empty() {
25 println!(" (none)");
26 } else {
27 for id in &xprts {
28 println!(" transport {id}");
29 }
30 }
31
32 // SERD engines for each module
33 println!("\n=== SERD Engines ===");
34 let modules = adm.modules().expect("failed to list modules");
35 let mut total = 0;
36 for m in &modules {
37 let engines =
38 adm.serd_engines(&m.name).expect("failed to list serd engines");
39 if !engines.is_empty() {
40 println!(" {} ({} engines):", m.name, engines.len());
41 for e in &engines {
42 println!(
43 " {} - count={}, n={}, fired={}",
44 e.name, e.count, e.n, e.fired,
45 );
46 }
47 total += engines.len();
48 }
49 }
50 if total == 0 {
51 println!(" (none)");
52 }
53
54 // Global stats
55 println!("\n=== Global Stats ===");
56 let stats = adm.stats(None).expect("failed to read stats");
57 for s in &stats {
58 println!(" {}: {} ({})", s.name, s.value, s.description);
59 }
60
61 // Per-module stats for the first module
62 if let Some(m) = modules.first() {
63 println!("\n=== Stats for {} ===", m.name);
64 let mstats =
65 adm.stats(Some(&m.name)).expect("failed to read module stats");
66 for s in &mstats {
67 println!(" {}: {} ({})", s.name, s.value, s.description);
68 }
69 }
70}Trait Implementations§
Auto Trait Implementations§
impl Freeze for FmdAdm
impl RefUnwindSafe for FmdAdm
impl !Send for FmdAdm
impl !Sync for FmdAdm
impl Unpin for FmdAdm
impl UnsafeUnpin for FmdAdm
impl UnwindSafe for FmdAdm
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more