Skip to content

Commit

Permalink
Merge pull request #101 from Furisto/info-ex
Browse files Browse the repository at this point in the history
Extend info cmd with version and os
  • Loading branch information
Furisto authored Jun 20, 2021
2 parents 4f6e8e9 + b209181 commit 2f3d806
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 36 deletions.
104 changes: 104 additions & 0 deletions src/info.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
use procfs::{CpuInfo, Meminfo};
use std::{fs, path::Path};

use crate::cgroups;

pub fn print_youki() {
println!("{:<18}{}", "Version", env!("CARGO_PKG_VERSION"));
}

pub fn print_kernel() {
let uname = nix::sys::utsname::uname();
println!("{:<18}{}", "Kernel-Release", uname.release());
println!("{:<18}{}", "Kernel-Version", uname.version());
println!("{:<18}{}", "Architecture", uname.machine());
}

// see https://www.freedesktop.org/software/systemd/man/os-release.html
pub fn print_os() {
if let Some(os) = try_read_os_from("/etc/os-release") {
println!("{:<18}{}", "Operating System", os);
} else if let Some(os) = try_read_os_from("/usr/lib/os-release") {
println!("{:<18}{}", "Operating System", os);
}
}

fn try_read_os_from<P: AsRef<Path>>(path: P) -> Option<String> {
let os_release = path.as_ref();
if !os_release.exists() {
return None;
}

if let Ok(release_content) = fs::read_to_string(path) {
let pretty = find_parameter(&release_content, "PRETTY_NAME");

if let Some(pretty) = pretty {
return Some(pretty.trim_matches('"').to_owned());
}

let name = find_parameter(&release_content, "NAME");
let version = find_parameter(&release_content, "VERSION");

if let (Some(name), Some(version)) = (name, version) {
return Some(format!(
"{} {}",
name.trim_matches('"'),
version.trim_matches('"')
));
}
}

None
}

fn find_parameter<'a>(content: &'a str, param_name: &str) -> Option<&'a str> {
let param_value = content
.lines()
.find(|l| l.starts_with(param_name))
.map(|l| l.split_terminator('=').last());

if let Some(Some(value)) = param_value {
return Some(value);
}

None
}

pub fn print_hardware() {
if let Ok(cpu_info) = CpuInfo::new() {
println!("{:<18}{}", "Cores", cpu_info.num_cores());
}

if let Ok(mem_info) = Meminfo::new() {
println!(
"{:<18}{}",
"Total Memory",
mem_info.mem_total / u64::pow(1024, 2)
);
}
}

pub fn print_cgroups() {
if let Ok(cgroup_fs) = cgroups::common::get_supported_cgroup_fs() {
let cgroup_fs: Vec<String> = cgroup_fs.into_iter().map(|c| c.to_string()).collect();
println!("{:<18}{}", "cgroup version", cgroup_fs.join(" and "));
}

println!("cgroup mounts");
if let Ok(v1_mounts) = cgroups::v1::util::list_subsystem_mount_points() {
let mut v1_mounts: Vec<String> = v1_mounts
.iter()
.map(|kv| format!(" {:<16}{}", kv.0, kv.1.display()))
.collect();

v1_mounts.sort();
for cgroup_mount in v1_mounts {
println!("{}", cgroup_mount);
}
}

let unified = cgroups::v2::util::get_unified_mount_point();
if let Ok(mount_point) = unified {
println!(" {:<16}{}", "unified", mount_point.display());
}
}
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ pub mod cgroups;
pub mod command;
pub mod container;
pub mod create;
pub mod info;
pub mod logger;
pub mod namespaces;
pub mod notify_socket;
Expand Down
42 changes: 6 additions & 36 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use nix::sys::signal as nix_signal;
use youki::command::linux::LinuxCommand;
use youki::container::{Container, ContainerStatus};
use youki::create;
use youki::info::{print_cgroups, print_hardware, print_kernel, print_os, print_youki};
use youki::rootless::should_use_rootless;
use youki::signal;
use youki::start;
Expand Down Expand Up @@ -171,42 +172,11 @@ fn main() -> Result<()> {
}

SubCommand::Info => {
let uname = nix::sys::utsname::uname();
println!("{:<18}{}", "Kernel-Release", uname.release());
println!("{:<18}{}", "Kernel-Version", uname.version());
println!("{:<18}{}", "Architecture", uname.machine());

let cpu_info = procfs::CpuInfo::new()?;
println!("{:<18}{}", "Cores", cpu_info.num_cores());
let mem_info = procfs::Meminfo::new()?;
println!(
"{:<18}{}",
"Total Memory",
mem_info.mem_total / u64::pow(1024, 2)
);

let cgroup_fs: Vec<String> = cgroups::common::get_supported_cgroup_fs()?
.into_iter()
.map(|c| c.to_string())
.collect();
println!("{:<18}{}", "cgroup version", cgroup_fs.join(" and "));

println!("cgroup mounts");
let mut cgroup_v1_mounts: Vec<String> =
cgroups::v1::util::list_subsystem_mount_points()?
.iter()
.map(|kv| format!(" {:<16}{:?}", kv.0, kv.1))
.collect();

cgroup_v1_mounts.sort();
for cgroup_mount in cgroup_v1_mounts {
println!("{}", cgroup_mount);
}

let unified = cgroups::v2::util::get_unified_mount_point();
if let Ok(mount_point) = unified {
println!(" {:<16}{:?}", "unified", mount_point);
}
print_youki();
print_kernel();
print_os();
print_hardware();
print_cgroups();

Ok(())
}
Expand Down

0 comments on commit 2f3d806

Please sign in to comment.