Merge branch 'main' into add_readme

This commit is contained in:
Orhun Parmaksız 2022-03-18 15:55:29 +03:00
commit 00026bb569
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
11 changed files with 76 additions and 29 deletions

View file

@ -5,6 +5,7 @@ RUN cargo build --locked --release -p systeroid
RUN cargo build --locked --release --no-default-features -p systeroid-tui
RUN mkdir -p build-out/
RUN ["/bin/bash", "-c", "cp target/x86_64-unknown-linux-musl/release/systeroid{,-tui} build-out/"]
RUN ["/bin/bash", "-c", "scripts/clone-linux-docs.sh"]
FROM scratch
WORKDIR /app
@ -12,5 +13,9 @@ COPY --from=builder \
/home/rust/src/build-out/systeroid \
/home/rust/src/build-out/systeroid-tui \
/usr/local/bin/
COPY --from=builder \
/home/rust/src/linux-docs \
/usr/share/doc/linux-docs
USER 1000:1000
ENV NOCACHE=1
ENTRYPOINT ["systeroid"]

18
scripts/clone-linux-docs.sh Executable file
View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -eux
docs_dir="$(pwd)/linux-docs"
kernel_repo="https://github.com/torvalds/linux"
sparse_path=('Documentation/admin-guide/sysctl' 'Documentation/networking')
mkdir "$docs_dir" && cd "$docs_dir"
git init
git remote add origin "$kernel_repo"
git config core.sparseCheckout true
for path in "${sparse_path[@]}"; do
echo "$path" >> .git/info/sparse-checkout
done
git pull --depth 1 origin master
mv $docs_dir/Documentation/* "$docs_dir"
cd "$docs_dir" && rmdir Documentation && rm -rf .git

View file

@ -2,11 +2,12 @@ use crate::cache::{Cache, CacheData};
use crate::config::Config;
use crate::error::Result;
use crate::parsers::{parse_kernel_docs, KERNEL_DOCS_PATH};
use crate::sysctl::parameter::{Parameter, PARAMETERS_CACHE_LABEL};
use crate::sysctl::parameter::Parameter;
use crate::sysctl::section::Section;
use crate::sysctl::PROC_PATH;
use crate::sysctl::{DISABLE_CACHE_ENV, PARAMETERS_CACHE_LABEL, PROC_PATH};
use rayon::prelude::*;
use std::convert::TryFrom;
use std::env;
use std::path::{Path, PathBuf};
use std::result::Result as StdResult;
use sysctl::{CtlFlags, CtlIter, Sysctl as SysctlImpl};
@ -90,10 +91,12 @@ impl Sysctl {
}
}
self.update_docs(path)?;
cache.write(
CacheData::new(&self.parameters, path)?,
PARAMETERS_CACHE_LABEL,
)?;
if env::var(DISABLE_CACHE_ENV).is_err() {
cache.write(
CacheData::new(&self.parameters, path)?,
PARAMETERS_CACHE_LABEL,
)?;
}
} else {
eprintln!("warning: `Linux kernel documentation cannot be found. Please specify a path via '-D' argument`");
}

View file

@ -11,7 +11,7 @@ pub mod display;
pub mod parameter;
/// Path of the kernel parameters.
pub const PROC_PATH: &str = "/proc/sys/";
pub(crate) const PROC_PATH: &str = "/proc/sys/";
/// Default configuration file to preload values from.
pub const DEFAULT_PRELOAD: &str = "/etc/sysctl.conf";
@ -29,3 +29,12 @@ pub const SYSTEM_PRELOAD: &[&str] = &[
/// Deprecated parameters to skip while listing.
/// <https://bugzilla.redhat.com/show_bug.cgi?id=152435>
pub const DEPRECATED_PARAMS: &[&str] = &["base_reachable_time", "retrans_time"];
/// Environment variable for setting the path of the Linux kernel documentation.
pub const KERNEL_DOCS_ENV: &str = "KERNEL_DOCS";
/// Environment variable for disabling the cache.
pub(crate) const DISABLE_CACHE_ENV: &str = "NOCACHE";
/// Label for caching the kernel parameters.
pub(crate) const PARAMETERS_CACHE_LABEL: &str = "parameters";

View file

@ -8,9 +8,6 @@ use std::io::Write;
use std::path::PathBuf;
use sysctl::{Ctl, Sysctl as SysctlImpl};
/// Label for caching the kernel parameters.
pub(crate) const PARAMETERS_CACHE_LABEL: &str = "parameters";
/// Representation of a kernel parameter.
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Parameter {

View file

@ -80,7 +80,7 @@ pub const KEY_BINDINGS: &[&KeyBinding] = &[
action: "cancel / exit",
},
&KeyBinding {
key: "ctrl-c/ctrl-d",
key: "q, ctrl-c/ctrl-d",
action: "exit",
},
];
@ -391,6 +391,7 @@ impl<'a> App<'a> {
if let Ok(command) = Command::from_str(input) {
self.input = None;
self.run_command(command)?;
hide_popup = false;
} else {
self.input = Some(String::from("Unknown command"));
self.input_time = Some(Instant::now());

View file

@ -1,7 +1,9 @@
use crate::style::Colors;
use getopts::Options;
use std::env;
use std::path::PathBuf;
use systeroid_core::sysctl::section::Section;
use systeroid_core::sysctl::KERNEL_DOCS_ENV;
/// Help message for the arguments.
const HELP_MESSAGE: &str = r#"
@ -91,7 +93,10 @@ impl Args {
.map_err(|e| eprintln!("error: `{}`", e))
.ok()?
.unwrap_or(250),
kernel_docs: matches.opt_str("D").map(PathBuf::from),
kernel_docs: matches
.opt_str("D")
.or_else(|| env::var(KERNEL_DOCS_ENV).ok())
.map(PathBuf::from),
section: matches.opt_str("s").map(Section::from),
search_query: matches.opt_str("q"),
colors: Colors::new(

View file

@ -44,14 +44,17 @@ impl FromStr for Command {
"select" => Ok(Command::Select),
"copy" => Ok(Command::Copy),
"refresh" => Ok(Command::Refresh),
"cancel" | "q" => Ok(Command::Cancel),
"exit" | "quit" | "q!" => Ok(Command::Exit),
"exit" | "quit" | "q" | "q!" => Ok(Command::Exit),
_ => {
if s.starts_with("set") {
let mut values = s.trim_start_matches("set").trim().split_whitespace();
let values: Vec<&str> = s
.trim_start_matches("set")
.trim()
.split_whitespace()
.collect();
Ok(Command::Set(
values.next().ok_or(())?.to_string(),
values.next().ok_or(())?.to_string(),
values.first().ok_or(())?.to_string(),
values[1..].join(" "),
))
} else if s.starts_with("scroll") {
let mut values = s.trim_start_matches("scroll").trim().split_whitespace();
@ -105,7 +108,7 @@ impl Command {
Key::Char('c') => Command::Copy,
Key::Char('r') | Key::F(5) => Command::Refresh,
Key::Esc => Command::Cancel,
Key::Ctrl('c') | Key::Ctrl('d') => Command::Exit,
Key::Char('q') | Key::Ctrl('c') | Key::Ctrl('d') => Command::Exit,
_ => Command::Nothing,
}
}
@ -132,11 +135,10 @@ mod tests {
(Command::Select, "select"),
(Command::Copy, "copy"),
(Command::Refresh, "refresh"),
(Command::Cancel, "cancel"),
(Command::Exit, "exit"),
(Command::Exit, "quit"),
(
Command::Set(String::from("a"), String::from("b")),
"set a b",
Command::Set(String::from("a"), String::from("b c")),
"set a b c",
),
(
Command::Scroll(ScrollArea::List, Direction::Up, 1),

View file

@ -34,14 +34,14 @@ use tui::terminal::Terminal;
/// Runs `systeroid-tui`.
pub fn run<B: Backend>(args: Args, backend: B) -> Result<()> {
let mut terminal = Terminal::new(backend)?;
terminal.hide_cursor()?;
terminal.clear()?;
let event_handler = EventHandler::new(args.tick_rate);
let mut sysctl = Sysctl::init(Config::default())?;
if !args.no_docs {
sysctl.update_docs_from_cache(args.kernel_docs.as_ref(), &Cache::init()?)?;
}
let mut terminal = Terminal::new(backend)?;
terminal.hide_cursor()?;
terminal.clear()?;
let event_handler = EventHandler::new(args.tick_rate);
let mut app = App::new(&mut sysctl);
if let Some(section) = args.section {
app.section_list.state.select(Some(

View file

@ -4,7 +4,7 @@ use std::env;
use std::path::PathBuf;
use systeroid_core::parseit::regex::Regex;
use systeroid_core::sysctl::display::DisplayType;
use systeroid_core::sysctl::DEFAULT_PRELOAD;
use systeroid_core::sysctl::{DEFAULT_PRELOAD, KERNEL_DOCS_ENV};
/// Help message for the arguments.
const HELP_MESSAGE: &str = r#"
@ -179,7 +179,10 @@ impl Args {
verbose: matches.opt_present("v"),
quiet: matches.opt_present("q"),
write: matches.opt_present("w"),
kernel_docs: matches.opt_str("D").map(PathBuf::from),
kernel_docs: matches
.opt_str("D")
.or_else(|| env::var(KERNEL_DOCS_ENV).ok())
.map(PathBuf::from),
display_type,
display_deprecated: matches.opt_present("deprecated"),
ignore_errors: matches.opt_present("e"),

View file

@ -7,7 +7,11 @@ fn main() {
if let Some(args) = Args::parse(env::args().collect()) {
if args.show_tui {
let bin = format!("{}-tui", env!("CARGO_PKG_NAME"));
match Command::new(&bin).spawn().map(|mut child| child.wait()) {
let mut command = Command::new(&bin);
if let Some(kernel_docs) = args.kernel_docs {
command.arg("--docs").arg(kernel_docs);
}
match command.spawn().map(|mut child| child.wait()) {
Ok(_) => process::exit(0),
Err(e) => {
eprintln!("Cannot run `{}` ({})", bin, e);