extern crate libvirt;
extern crate libvirt_sys as virt;
use libvirt::connection::*;
fn hypervisor_info(conn: Connection) {
let hv_type = match conn.connection_type() {
Ok(t) => t,
Err(e) => panic!("Failed to get hypervisor type: {}", e.message)
};
let mut hv_ver = match conn.version() {
Ok(v) => v,
Err(e) => panic!("Failed to get hypervisor version: {}", e.message)
};
let major = hv_ver / 1000000;
hv_ver %= 1000000;
let minor = hv_ver / 1000;
let release = hv_ver % 1000;
println!("Hypervisor: '{}' version: {}.{}.{}\n", hv_type, major, minor, release);
}
fn show_domains(conn: Connection) {
let active = match conn.count_domain() {
Ok(d) => d,
Err(e) => panic!("Failed to get number of active domains: {}", e.message)
};
let inactive = match conn.count_defined_domain() {
Ok(d) => d,
Err(e) => panic!("Failed to get number of inactive domains: {}", e.message)
};
println!("There are {} active and {} inactive domains", active, inactive);
let domains = match conn.list_all_domains(virt::VIR_CONNECT_LIST_DOMAINS_ACTIVE | virt::VIR_CONNECT_LIST_DOMAINS_INACTIVE) {
Ok(d) => d,
Err(e) => panic!("Failed to get a list of all domains: {}", e.message)
};
for domain in domains {
let active = match domain.clone().active() {
Ok(_) => true,
Err(_) => false
};
let domname = match domain.clone().name() {
Ok(n) => n,
Err(e) => panic!("Cannot get name of domain: {}", e.message)
};
println!("{} ({})", domname, match active {
true => "active",
false => "non-active"
});
match domain.free() {
Ok(_) => {},
Err(e) => panic!("Cannot free domain: {}", e.message)
}
}
}
fn main() {
let conn: Connection = match Connection::new("qemu:///system".to_string(), ConnectionType::READONLY) {
Ok(c) => c,
Err(e) => panic!("Failed to connect to hypervisor: {}", e.message)
};
println!("Connected to hypervisor");
hypervisor_info(conn.clone());
show_domains(conn.clone());
match conn.close() {
Ok(()) => println!("Disconnected from hypervisor"),
Err(e) => panic!("Failed to disconnect from hypervisor: {}", e.message)
}
}