mirror of
https://github.com/orhun/systeroid
synced 2024-10-01 13:13:32 +00:00
Merge branch 'main' into add_readme
This commit is contained in:
commit
00026bb569
|
@ -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
18
scripts/clone-linux-docs.sh
Executable 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
|
|
@ -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`");
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue