1
0
mirror of https://github.com/danog/ytop.git synced 2024-11-26 20:15:03 +01:00

Initial commit

This commit is contained in:
Caleb Bassi 2019-07-19 17:36:20 -07:00
commit 10e5b24f9f
31 changed files with 1717 additions and 0 deletions

23
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,23 @@
---
name: Bug report
about: Template to report bugs.
---
<!--
Before opening an issue, make sure to:
- search existing issues to avoid creating duplicates
- test using the latest build to make sure your issue has not already been fixed
-->
Required information:
- rtop version (`rtop -V`):
- The output of `uname -a`:
Include any of the following information if relevant:
- Terminal emulator (e.g. iTerm or gnome terminal):
- tmux version (`tmux -V`):
- Any relevenat hardware info:
Please copy or attach `~/.local/state/rtop/errors.log` if it exists and contains logs:

4
.github/ISSUE_TEMPLATE/other.md vendored Normal file
View File

@ -0,0 +1,4 @@
---
name: Other
about: No template.
---

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target
**/*.rs.bk

29
.travis.yml Normal file
View File

@ -0,0 +1,29 @@
language: rust
cache: cargo
git:
depth: 1
matrix:
include:
- env: TARGET=x86_64-unknown-linux-gnu
os: linux
install: true
script: ./ci/script.sh
deploy:
provider: releases
api_key: $GITHUB_TOKEN
file_glob: true
file: "./*.tar.gz"
skip_cleanup: true
on:
tags: true
if: tag IS present
notifications:
email:
on_success: never

16
CHANGELOG.md Normal file
View File

@ -0,0 +1,16 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
> **Types of changes**:
>
> - **Added**: for new features.
> - **Changed**: for changes in existing functionality.
> - **Deprecated**: for soon-to-be removed features.
> - **Removed**: for now removed features.
> - **Fixed**: for any bug fixes.
> - **Security**: in case of vulnerabilities.
## [Unreleased]

734
Cargo.lock generated Normal file
View File

@ -0,0 +1,734 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "ansi_term"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "argon2rs"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
"scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "arrayvec"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "atty"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "autocfg"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "backtrace"
version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "backtrace-sys"
version = "0.1.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "bitflags"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "blake2-rfc"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
"constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cassowary"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "cc"
version = "1.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "cfg-if"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "chrono"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "clap"
version = "2.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "cloudabi"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "constant_time_eq"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "crossbeam-channel"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossbeam-utils"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm"
version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_cursor 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_input 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_screen 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_style 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_terminal 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_cursor"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_input"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_screen 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_screen"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_style"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_terminal"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_cursor 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_utils"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "crossterm_winapi"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "dirs"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
"dirs-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "dirs-sys"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "either"
version = "1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "failure"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
"failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "failure_derive"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)",
"synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "fern"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "heck"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "itertools"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "itoa"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "lazy_static"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "libc"
version = "0.2.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "log"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "nodrop"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "num-integer"
version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num-traits"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "num_cpus"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "platform-dirs"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "proc-macro2"
version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "psutil"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "quote"
version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rand_core"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rand_core"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "rand_os"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rdrand"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "redox_syscall"
version = "0.1.53"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "redox_termios"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"redox_syscall 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "redox_users"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_syscall 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rtop"
version = "0.1.0"
dependencies = [
"chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)",
"fern 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
"num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"platform-dirs 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"psutil 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
"size 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
"tui 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rustc-demangle"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "ryu"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "scoped_threadpool"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "serde"
version = "1.0.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde_derive"
version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "serde_json"
version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
"ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "size"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "smallvec"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "structopt"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "structopt-derive"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "syn"
version = "0.15.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "synstructure"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
"quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "termion"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_syscall 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "time"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"redox_syscall 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "tui"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cassowary 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"crossterm 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)",
"either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "unicode-segmentation"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "unicode-width"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "unicode-xid"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "vec_map"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[metadata]
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71"
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf"
"checksum backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637"
"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6"
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
"checksum cassowary 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
"checksum cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "30f813bf45048a18eda9190fd3c6b78644146056740c43172a5a3699118588fd"
"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
"checksum chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "77d81f58b7301084de3b958691458a53c3f7e0b1d702f77e550b6a88e3a88abe"
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
"checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b"
"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c"
"checksum crossterm 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)" = "21ac79357981b3c35917a377e6138729b66316db7649f9f96fbb517bb02361e5"
"checksum crossterm_cursor 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4b8ddb43937bfafbe07d349ee9497754ceac818ee872116afccb076f2de28d3d"
"checksum crossterm_input 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a23a71b51ddc8f74e13e341179b1a26b20f0030d14ff8fbdd9da45fd0e342bc5"
"checksum crossterm_screen 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "90889b9f1d7867a583dede34deab1e32a10379e9eb70d920ca7895e144aa6d65"
"checksum crossterm_style 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "983596405fe738aac9645656b666073fe6e0a8bf088679b7e256916ee41b61f7"
"checksum crossterm_terminal 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "18792c97c5cdcc5fd3582df58188a793bf290af4a53d5fc8442c7d17e003b356"
"checksum crossterm_utils 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8321d40908d0ee77cb29335f591eae2b4f7225152f81b9dfa35a161ca3b077dc"
"checksum crossterm_winapi 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c061e4a1c47a53952ba0f2396c00a61cd7ab74482eba99b9c9cc77fdca71932"
"checksum dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1c4ef5a8b902d393339e2a2c7fe573af92ce7e0ee5a3ff827b4c9ad7e07e4fa1"
"checksum dirs-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "937756392ec77d1f2dd9dc3ac9d69867d109a2121479d72c364e42f4cab21e2d"
"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b"
"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
"checksum fern 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "29d26fa0f4d433d1956746e66ec10d6bf4d6c8b93cd39965cceea7f7cc78c7dd"
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"
"checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb"
"checksum log 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c275b6ad54070ac2d665eef9197db647b32239c9d244bfb6f041a766d00da5b3"
"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273"
"checksum platform-dirs 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1e6f10c0c97e3d27b298374c2c67a057216c98e0a86c44df6bcd1f02bacbe38"
"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
"checksum psutil 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "058b89e486972f8b5baa07b2039dfaba5151a8282790b25a2e6b4eb8fe4e1564"
"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
"checksum redox_syscall 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)" = "53848511b7ee6eb9d5c3db48481aaa5779b38fc0131bc133c98cb4f2b2411928"
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
"checksum redox_users 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe5204c3a17e97dde73f285d49be585df59ed84b50a872baf416e73b62c3828"
"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619"
"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
"checksum serde 1.0.97 (registry+https://github.com/rust-lang/crates.io-index)" = "d46b3dfedb19360a74316866cef04687cd4d6a70df8e6a506c63512790769b72"
"checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e"
"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
"checksum size 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e5021178e8e70579d009fb545932e274ec2dde4c917791c6063d1002bee2a56"
"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be"
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
"checksum structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7"
"checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107"
"checksum syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d960b829a55e56db167e861ddb43602c003c7be0bee1d345021703fac2fb7c"
"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
"checksum tui 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "73b422ff4986065d33272b587907654f918a3fe8702786a8110bf68dede0d8ee"
"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

23
Cargo.toml Normal file
View File

@ -0,0 +1,23 @@
[package]
name = "rtop"
version = "0.1.0"
authors = ["Caleb Bassi <calebjbassi@gmail.com>"]
license = "MIT"
description = "A TUI system monitor written in Rust"
edition = "2018"
[dependencies]
chrono = "0.4.7"
crossbeam-channel = "0.3"
crossterm = "0.9.6"
fern = "0.5.8"
log = "0.4.7"
num_cpus = "1.10.1"
platform-dirs = "0.2.0"
# psutil = { path = "../../other-projects/rust-psutil" }
psutil = "1.6.0"
size = "0.1.2"
structopt = "0.2.18"
tui = { version = "0.6.2", features = ["crossterm"] }
serde_json = "1.0.40"
serde = { version = "1.0.97", features = ["derive"] }

19
LICENSE Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2019 Caleb Bassi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

72
README.md Normal file
View File

@ -0,0 +1,72 @@
# rtop
<div align="center">
*Another* TUI based resource monitor, this time in Rust! Currently a WIP.
</div>
## Usage
### Keybinds
- Quit: `q` or `<C-c>`
- Process navigation:
- `k` and `<Up>`: up
- `j` and `<Down>`: down
- `<C-u>`: half page up
- `<C-d>`: half page down
- `<C-b>`: full page up
- `<C-f>`: full page down
- `gg` and `<Home>`: jump to top
- `G` and `<End>`: jump to bottom
- Process actions:
- `<Tab>`: toggle process grouping
- `dd`: kill selected process or group of processes
- Process sorting:
- `c`: CPU
- `m`: Mem
- `p`: PID
- Process filtering:
- `/`: start editing filter
- (while editing):
- `<Enter>`: accept filter
- `<C-c>` and `<Escape>`: clear filter
- CPU and Mem graph scaling:
- `h`: scale in
- `l`: scale out
- `?`: toggles keybind help menu
### Mouse
- click to select process
- mouse wheel to scroll through processes
### Colorschemes
rtop ships with a few colorschemes which can be set with the `-c` flag followed by the name of one. You can find all the colorschemes in the [colorschemes folder](./colorschemes).
To make a custom colorscheme, copy one of the default ones to `~/.config/rtop/<name>.json` and load it with `rtop -c <name>`. Colorschemes PRs are welcome!
### CLI Options
```
USAGE:
rtop [FLAGS] [OPTIONS]
FLAGS:
-a, --average-cpu Show average CPU in the CPU widget.
-b, --battery Show Battery widget (overridden by 'minimal' flag).
-f, --fahrenheit Show temperatures in fahrenheit.
-h, --help Prints help information
-m, --minimal Only show the CPU, Mem, and Process widgets.
-p, --per-cpu Show each CPU in the CPU widget.
-s, --statusbar Show a statusbar with the time.
-V, --version Prints version information
OPTIONS:
-c, --colorscheme <colorscheme> Set a colorscheme. [default: default]
-i, --interfaces <interfaces> Comma separated list of network interfaces to show. Prepend an interface with '!'
to hide it. 'all' shows all interfaces. [default: !tun0]
-r, --rate <rate> Number of times per second to update the CPU and Mem widgets. [default: 1]
```

11
ci/script.sh Executable file
View File

@ -0,0 +1,11 @@
#!/usr/bin/env bash
NAME=${TRAVIS_REPO_SLUG#*/}
function main {
rustup target add $TARGET
cargo build --target $TARGET --release
tar -czf $NAME-$TRAVIS_TAG-$TARGET.tar.gz -C ./target/$TARGET/release/ $NAME
}
main

View File

@ -0,0 +1,21 @@
{
"fg": 235,
"bg": -1,
"titles": 235,
"borders": 6,
"battery_lines": [4, 3, 2, 1, 5, 6, 7, 8],
"cpu_lines": [4, 3, 2, 1, 5, 6, 7, 8],
"mem_main": 5,
"mem_swap": 3,
"net_bars": 4,
"proc_cursor": 33,
"temp_low": 2,
"temp_high": 1
}

21
colorschemes/default.json Normal file
View File

@ -0,0 +1,21 @@
{
"fg": 7,
"bg": -1,
"titles": 7,
"borders": 6,
"battery_lines": [4, 3, 2, 1, 5, 6, 7, 8],
"cpu_lines": [4, 3, 2, 1, 5, 6, 7, 8],
"mem_main": 5,
"mem_swap": 11,
"net_bars": 4,
"proc_cursor": 4,
"temp_low": 2,
"temp_high": 1
}

21
colorschemes/monokai.json Normal file
View File

@ -0,0 +1,21 @@
{
"fg": 249,
"bg": -1,
"titles": 249,
"borders": 239,
"battery_lines": [81, 70, 208, 197, 249, 141, 221, 186],
"cpu_lines": [81, 70, 208, 197, 249, 141, 221, 186],
"mem_main": 208,
"mem_swap": 186,
"net_bars": 81,
"proc_cursor": 197,
"temp_low": 70,
"temp_high": 208
}

View File

@ -0,0 +1,21 @@
{
"fg": 250,
"bg": -1,
"titles": 250,
"borders": 37,
"battery_lines": [61, 33, 37, 64, 125, 160, 166, 136],
"cpu_lines": [61, 33, 37, 64, 125, 160, 166, 136],
"mem_main": 125,
"mem_swap": 166,
"net_bars": 33,
"proc_cursor": 136,
"temp_low": 64,
"temp_high": 160
}

21
colorschemes/vice.json Normal file
View File

@ -0,0 +1,21 @@
{
"fg": 231,
"bg": -1,
"titles": 123,
"borders": 102,
"battery_lines": [212, 218, 123, 159, 229, 158, 183, 146],
"cpu_lines": [212, 218, 123, 159, 229, 158, 183, 146],
"mem_main": 201,
"mem_swap": 97,
"net_bars": 183,
"proc_cursor": 159,
"temp_low": 49,
"temp_high": 197
}

76
src/args.rs Normal file
View File

@ -0,0 +1,76 @@
use std::str::FromStr;
use structopt::StructOpt;
pub enum Colorscheme {
Default,
DefaultDark,
Monokai,
SolarizedDark,
Vice,
Custom(String),
}
impl FromStr for Colorscheme {
type Err = std::io::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"default" => Colorscheme::Default,
"default-dark" => Colorscheme::DefaultDark,
"monokai" => Colorscheme::Monokai,
"solarized-dark" => Colorscheme::SolarizedDark,
"vice" => Colorscheme::Vice,
_ => Colorscheme::Custom(s.to_string()),
})
}
}
#[derive(StructOpt)]
pub struct Args {
/// Set a colorscheme.
#[structopt(
short = "c",
long = "colorscheme",
default_value = "default",
long_help = r"Colorschemes:
- default
- default-dark (for white backgrounds)
- solarized-dark
- monokai
- vice
"
)]
pub colorscheme: Colorscheme,
/// Only show the CPU, Mem, and Process widgets.
#[structopt(short = "m", long = "minimal")]
pub minimal: bool,
/// Number of times per second to update the CPU and Mem widgets.
#[structopt(short = "r", long = "rate", default_value = "1")]
pub rate: f64,
/// Show each CPU in the CPU widget.
#[structopt(short = "p", long = "per-cpu")]
pub per_cpu: bool,
/// Show average CPU in the CPU widget.
#[structopt(short = "a", long = "average-cpu")]
pub average_cpu: bool,
/// Show temperatures in fahrenheit.
#[structopt(short = "f", long = "fahrenheit")]
pub fahrenheit: bool,
/// Show a statusbar with the time.
#[structopt(short = "s", long = "statusbar")]
pub statusbar: bool,
/// Show Battery widget (overridden by 'minimal' flag).
#[structopt(short = "b", long = "battery")]
pub battery: bool,
/// Comma separated list of network interfaces to show. Prepend an interface with '!' to hide it. 'all' shows all interfaces.
#[structopt(short = "i", long = "interfaces", default_value = "!tun0")]
pub interfaces: String,
}

25
src/colorscheme.rs Normal file
View File

@ -0,0 +1,25 @@
use serde::Deserialize;
#[derive(Deserialize)]
pub struct Colorscheme {
fg: i64,
bg: i64,
titles: i64,
borders: i64,
battery_lines: Vec<i64>,
// need at least 8 entries
cpu_lines: Vec<i64>,
mem_main: i64,
mem_swap: i64,
net_bars: i64,
proc_cursor: i64,
temp_low: i64,
temp_high: i64,
}

237
src/main.rs Normal file
View File

@ -0,0 +1,237 @@
mod args;
mod colorscheme;
mod utils;
mod widgets;
use std::fs;
use std::io;
use std::path::Path;
use std::thread;
use std::time::Duration;
use crossbeam_channel::{select, tick, unbounded, Receiver};
use crossterm::{AlternateScreen, InputEvent, KeyEvent, MouseEvent};
use log::info;
use platform_dirs::{AppDirs, AppUI};
use structopt::StructOpt;
use tui::backend::{Backend, CrosstermBackend};
use tui::layout::{Constraint, Direction, Layout};
use tui::widgets::Widget;
use tui::Terminal;
use args::Args;
struct Widgets {
battery_widget: Option<widgets::BatteryWidget>,
cpu_widget: widgets::CpuWidget,
disk_widget: Option<widgets::DiskWidget>,
help_menu: widgets::HelpMenu,
mem_widget: widgets::MemWidget,
net_widget: Option<widgets::NetWidget>,
proc_widget: widgets::ProcWidget,
statusbar: Option<widgets::Statusbar>,
temp_widget: Option<widgets::TempWidget>,
}
fn setup_terminal() -> io::Result<Terminal<CrosstermBackend>> {
let screen = AlternateScreen::to_alternate(true)?;
let backend = CrosstermBackend::with_alternate_screen(screen)?;
let mut terminal = Terminal::new(backend)?;
terminal.hide_cursor()?;
terminal.clear()?;
Ok(terminal)
}
fn setup_ui_events() -> Receiver<InputEvent> {
let (ui_events_sender, ui_events_receiver) = unbounded();
thread::spawn(move || {
let _screen = crossterm::RawScreen::into_raw_mode().unwrap(); // TODO: unwrap
let input = crossterm::input();
input.enable_mouse_mode().unwrap(); // TODO: unwrap
let mut reader = input.read_sync();
loop {
ui_events_sender.send(reader.next().unwrap()).unwrap(); // TODO: unwraps
}
});
ui_events_receiver
}
fn setup_logfile(logfile_path: &Path) {
let logfile = fs::OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(logfile_path)
.unwrap(); // TODO: unwrap
fern::Dispatch::new()
.format(|out, message, record| {
out.finish(format_args!(
"{}[{}][{}]: {}",
chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"),
record.target(),
record.level(),
message
))
})
.chain(logfile)
.apply()
.unwrap(); // TODO: unwrap
}
fn read_colorscheme(
config_folder: &Path,
colorscheme: &args::Colorscheme,
) -> serde_json::Result<colorscheme::Colorscheme> {
match colorscheme {
args::Colorscheme::Custom(name) => serde_json::from_str(
&fs::read_to_string(config_folder.join(name).with_extension("json")).unwrap(), // TODO: unwrap
),
_ => {
let json_string = match colorscheme {
args::Colorscheme::Default => include_str!("../colorschemes/default.json"),
args::Colorscheme::DefaultDark => include_str!("../colorschemes/default-dark.json"),
args::Colorscheme::SolarizedDark => {
include_str!("../colorschemes/solarized-dark.json")
}
args::Colorscheme::Monokai => include_str!("../colorschemes/monokai.json"),
args::Colorscheme::Vice => include_str!("../colorschemes/vice.json"),
_ => unreachable!(),
};
Ok(serde_json::from_str(json_string).unwrap())
}
}
}
fn setup_widgets(args: &Args, colorscheme: &colorscheme::Colorscheme) -> Widgets {
let battery_widget = Some(widgets::BatteryWidget::new());
let cpu_widget = widgets::CpuWidget::new(Duration::from_secs(1), true, true);
let disk_widget = Some(widgets::DiskWidget::new());
let help_menu = widgets::HelpMenu::new();
let mem_widget = widgets::MemWidget::new(Duration::from_secs(1));
let net_widget = Some(widgets::NetWidget::new());
let proc_widget = widgets::ProcWidget::new();
let statusbar = Some(widgets::Statusbar::new());
let temp_widget = Some(widgets::TempWidget::new());
Widgets {
battery_widget,
cpu_widget,
disk_widget,
help_menu,
mem_widget,
net_widget,
proc_widget,
statusbar,
temp_widget,
}
}
fn update_widgets(widgets: &mut Widgets, ticks: i64) {
// if ticks % widgets.cpu_widget.update_interval == 0 {
// widgets.cpu_widget.update();
// }
}
fn draw<B: Backend>(terminal: &mut Terminal<B>, widgets: &mut Widgets) -> io::Result<()> {
terminal.draw(|mut frame| {
let vertical_chunks = Layout::default()
.direction(Direction::Vertical)
.constraints(
[
Constraint::Ratio(1, 3),
Constraint::Ratio(1, 3),
Constraint::Ratio(1, 3),
]
.as_ref(),
)
.split(frame.size());
widgets.cpu_widget.render(&mut frame, vertical_chunks[0]);
let middle_horizontal_chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Ratio(1, 3), Constraint::Ratio(2, 3)].as_ref())
.split(vertical_chunks[1]);
widgets
.mem_widget
.render(&mut frame, middle_horizontal_chunks[1]);
let middle_left_vertical_chunks = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)].as_ref())
.split(middle_horizontal_chunks[0]);
widgets
.disk_widget
.as_mut()
.unwrap() // TODO: unwrap
.render(&mut frame, middle_left_vertical_chunks[0]);
widgets
.temp_widget
.as_mut()
.unwrap() // TODO: unwrap
.render(&mut frame, middle_left_vertical_chunks[1]);
let bottom_horizontal_chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)].as_ref())
.split(vertical_chunks[2]);
widgets
.net_widget
.as_mut()
.unwrap() // TODO: unwrap
.render(&mut frame, bottom_horizontal_chunks[0]);
widgets
.proc_widget
.render(&mut frame, bottom_horizontal_chunks[1]);
})
}
fn main() {
let args = Args::from_args();
let program_name = env!("CARGO_PKG_NAME");
let app_dirs = AppDirs::new(Some(program_name), AppUI::CommandLine).unwrap(); // TODO: unwrap
let logfile_path = app_dirs.state_dir.join("errors.log");
let colorscheme = read_colorscheme(&app_dirs.config_dir, &args.colorscheme).unwrap(); // TODO: unwrap
let mut widgets = setup_widgets(&args, &colorscheme);
setup_logfile(&logfile_path);
let mut terminal = setup_terminal().unwrap(); // TODO: unwrap
let ticker = tick(Duration::from_secs(1));
let ui_events_receiver = setup_ui_events();
let mut ticks = 0;
update_widgets(&mut widgets, ticks);
draw(&mut terminal, &mut widgets).unwrap(); // TODO: unwrap
info!("hello");
loop {
select! {
recv(ticker) -> _ => {
ticks = (ticks + 1) % 60;
update_widgets(&mut widgets, ticks);
draw(&mut terminal, &mut widgets).unwrap(); // TODO: unwrap
}
recv(ui_events_receiver) -> message => {
match message.unwrap() { // TODO: unwrap
InputEvent::Keyboard(key_event) => {
match key_event {
KeyEvent::Char(c) => match c {
'q' => break,
_ => { info!("hello");}
},
KeyEvent::Ctrl(c) => match c {
'c' => break,
_ => {},
},
_ => {}
}
}
InputEvent::Mouse(mouse_event) => match mouse_event {
_ => {}
}
_ => {}
}
}
}
}
}

7
src/utils/conversions.rs Normal file
View File

@ -0,0 +1,7 @@
pub fn convert_localized_string(s: &str) -> String {
s.replace(',', ".")
}
pub fn celsius_to_fahrenheit(c: i64) -> i64 {
(c as f64 * (9f64 / 5f64)) as i64 + 32
}

1
src/utils/mod.rs Normal file
View File

@ -0,0 +1 @@
pub mod conversions;

27
src/widgets/battery.rs Normal file
View File

@ -0,0 +1,27 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct BatteryWidget {
title: String,
update_interval: Duration,
}
impl BatteryWidget {
pub fn new() -> BatteryWidget {
BatteryWidget {
title: " Batteries ".to_string(),
update_interval: Duration::from_secs(60),
}
}
}
impl Widget for BatteryWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(&self.title).draw(area, buf);
}
}

8
src/widgets/block.rs Normal file
View File

@ -0,0 +1,8 @@
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
pub fn new() -> Block<'static> {
Block::default()
.borders(Borders::ALL)
.border_style(Style::default().fg(Color::Cyan))
}

101
src/widgets/cpu.rs Normal file
View File

@ -0,0 +1,101 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::style::{Color, Style};
use tui::widgets::{Axis, Chart, Dataset, Marker, Widget};
use crate::widgets::block;
pub struct CpuWidget {
title: String,
update_interval: Duration,
cpu_count: usize,
show_average_cpu_load: bool,
show_per_cpu_load: bool,
average_cpu_data: Vec<i32>,
per_cpu_data: Vec<Vec<i32>>,
}
impl CpuWidget {
pub fn new(
update_interval: Duration,
show_average_cpu_load: bool,
show_per_cpu_load: bool,
) -> CpuWidget {
let mut cpu_widget = CpuWidget {
title: " CPU Usage ".to_string(),
update_interval,
cpu_count: num_cpus::get(),
show_average_cpu_load,
show_per_cpu_load,
average_cpu_data: Vec::new(),
per_cpu_data: Vec::new(),
};
if !(show_average_cpu_load || show_per_cpu_load) {
if cpu_widget.cpu_count <= 8 {
cpu_widget.show_per_cpu_load = true
} else {
cpu_widget.show_average_cpu_load = true
}
}
cpu_widget
}
pub fn update(&mut self) {
if self.show_average_cpu_load {}
if self.show_per_cpu_load {}
// let procs = sys.get_processor_list();
// self.average_cpu_data.push((
// self.len_data as f64,
// procs[0].get_cpu_usage() as f64 * 100.0,
// ));
// for (i, proc) in procs.iter().skip(1).enumerate() {
// self.per_cpu_data[i].push((self.len_data as f64, proc.get_cpu_usage() as f64 * 100.0));
// }
// self.len_data += 1;
}
}
impl Widget for CpuWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
// let x_bounds = [self.len_data as f64 - 25.0, self.len_data as f64 - 1.0];
// let mut datasets = vec![];
// if self.average_cpu {
// datasets.push(
// Dataset::default()
// .name("AVRG")
// .marker(Marker::Braille)
// .style(Style::default().fg(Color::Yellow))
// .data(&self.average_cpu_data[..]),
// )
// }
// if self.per_cpu {
// for (i, cpu) in self.per_cpu_data.iter().enumerate() {
// datasets.push(
// Dataset::default()
// .name(&self.cpu_names[i])
// .marker(Marker::Braille)
// .style(Style::default().fg(Color::Yellow))
// .data(cpu),
// )
// }
// }
// let mut chart: Chart<String, String> = Chart::default();
block::new()
.title(&self.title)
// .x_axis(Axis::default().bounds(x_bounds))
// .y_axis(Axis::default().bounds([0.0, 100.0]))
// .datasets(&datasets)
.draw(area, buf);
}
}

27
src/widgets/disk.rs Normal file
View File

@ -0,0 +1,27 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct DiskWidget {
title: String,
update_interval: Duration,
}
impl DiskWidget {
pub fn new() -> DiskWidget {
DiskWidget {
title: " Disk Usage ".to_string(),
update_interval: Duration::from_secs(1),
}
}
}
impl Widget for DiskWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(&self.title).draw(area, buf);
}
}

21
src/widgets/help_menu.rs Normal file
View File

@ -0,0 +1,21 @@
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
const TITLE: &str = " Help Menu ";
pub struct HelpMenu {}
impl HelpMenu {
pub fn new() -> HelpMenu {
HelpMenu {}
}
}
impl Widget for HelpMenu {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(TITLE).draw(area, buf);
}
}

27
src/widgets/mem.rs Normal file
View File

@ -0,0 +1,27 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct MemWidget {
title: String,
update_interval: Duration,
}
impl MemWidget {
pub fn new(update_interval: Duration) -> MemWidget {
MemWidget {
title: " Memory Usage ".to_string(),
update_interval,
}
}
}
impl Widget for MemWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(&self.title).draw(area, buf);
}
}

20
src/widgets/mod.rs Normal file
View File

@ -0,0 +1,20 @@
mod battery;
mod block;
mod cpu;
mod disk;
mod help_menu;
mod mem;
mod net;
mod proc;
mod statusbar;
mod temp;
pub use self::battery::BatteryWidget;
pub use self::cpu::CpuWidget;
pub use self::disk::DiskWidget;
pub use self::help_menu::HelpMenu;
pub use self::mem::MemWidget;
pub use self::net::NetWidget;
pub use self::proc::ProcWidget;
pub use self::statusbar::Statusbar;
pub use self::temp::TempWidget;

27
src/widgets/net.rs Normal file
View File

@ -0,0 +1,27 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct NetWidget {
title: String,
update_interval: Duration,
}
impl NetWidget {
pub fn new() -> NetWidget {
NetWidget {
title: " Network Usage ".to_string(),
update_interval: Duration::from_secs(1),
}
}
}
impl Widget for NetWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(&self.title).draw(area, buf);
}
}

27
src/widgets/proc.rs Normal file
View File

@ -0,0 +1,27 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct ProcWidget {
title: String,
update_interval: Duration,
}
impl ProcWidget {
pub fn new() -> ProcWidget {
ProcWidget {
title: " Processes ".to_string(),
update_interval: Duration::from_secs(1),
}
}
}
impl Widget for ProcWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(&self.title).draw(area, buf);
}
}

21
src/widgets/statusbar.rs Normal file
View File

@ -0,0 +1,21 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct Statusbar {}
impl Statusbar {
pub fn new() -> Statusbar {
Statusbar {}
}
}
impl Widget for Statusbar {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().draw(area, buf);
}
}

27
src/widgets/temp.rs Normal file
View File

@ -0,0 +1,27 @@
use std::time::Duration;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::widgets::Widget;
use crate::widgets::block;
pub struct TempWidget {
title: String,
update_interval: Duration,
}
impl TempWidget {
pub fn new() -> TempWidget {
TempWidget {
title: " Temperatures ".to_string(),
update_interval: Duration::from_secs(5),
}
}
}
impl Widget for TempWidget {
fn draw(&mut self, area: Rect, buf: &mut Buffer) {
block::new().title(&self.title).draw(area, buf);
}
}