diff --git a/Cargo.lock b/Cargo.lock index a558b3ab0..ba1f829f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -120,6 +120,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cassowary" version = "0.3.0" @@ -306,6 +312,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -473,6 +490,7 @@ dependencies = [ "linutil_core", "oneshot", "portable-pty", + "rand 0.8.5", "ratatui", "tui-term", "unicode-width", @@ -628,6 +646,15 @@ dependencies = [ "winreg", ] +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -659,6 +686,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -674,6 +722,15 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "ratatui" version = "0.28.1" @@ -933,7 +990,7 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" dependencies = [ - "rand", + "rand 0.4.6", "remove_dir_all", ] @@ -1291,6 +1348,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] diff --git a/tui/Cargo.toml b/tui/Cargo.toml index c8802be4f..6929f00e0 100644 --- a/tui/Cargo.toml +++ b/tui/Cargo.toml @@ -11,6 +11,7 @@ include = [ "src/*.rs", "Cargo.toml", "build.rs", + "cool_tips.txt", ] build = "build.rs" @@ -23,6 +24,7 @@ portable-pty = "0.8.1" ratatui = "0.28.1" tui-term = "0.1.12" unicode-width = "0.1.13" +rand = "0.8.5" linutil_core = { path = "../core", version = "24.9.19" } [build-dependencies] diff --git a/tui/cool_tips.txt b/tui/cool_tips.txt new file mode 100644 index 000000000..d73943468 --- /dev/null +++ b/tui/cool_tips.txt @@ -0,0 +1,239 @@ +ls: Lists files and directories in the current directory. +cd: Changes the current directory. +pwd: Prints the current working directory. +mkdir: Creates a new directory.   +rmdir: Removes an empty directory. +cp: Copies files or directories.   +mv: Moves or renames files or directories. +rm: Removes files or directories. +touch: Creates an empty file or updates the timestamp of an existing file. +cat: Displays the content of a file. +less: Views the content of a file, one page at a time. +head: Displays the first few lines of a file. +tail: Displays the last few lines of a file. +find: Searches for files in a directory hierarchy. +grep: Searches for a specific pattern in files. +chmod: Changes file or directory permissions. +chown: Changes file or directory ownership. +ln: Creates hard or symbolic links to files. +df: Displays disk space usage. +du: Shows disk usage of files and directories. +top: Displays real-time system processes. +ps: Shows running processes. +kill: Terminates a process by PID. +man: Displays the manual page for a command. +history: Shows the history of commands you've run. +sudo: Executes a command with superuser privileges. +apt-get: Installs, updates, or removes packages on Debian-based systems. +yum: Installs, updates, or removes packages on Red Hat-based systems. +wget: Downloads files from the web. +curl: Transfers data from or to a server using various protocols. +ssh: Connects to a remote machine securely via SSH. +ping: Tests connectivity to a network host. +ifconfig: Displays or configures network interfaces. +ip: Displays and manages network interfaces, routing, and more. +netstat: Displays network connections, routing tables, and interface statistics. +echo: Prints text to the terminal or writes text to files. +date: Displays or sets the system date and time. +shutdown: Shuts down or reboots the system. +reboot: Reboots the system. +alias: Creates a shortcut for a command. +diff: Compares the contents of two files line by line. +cmp: Compares two files byte by byte. +sort: Sorts the lines of a file alphabetically or numerically. +uniq: Removes duplicate lines from a sorted file. +wc: Counts words, lines, and characters in a file. +cut: Cuts sections from each line of a file or output. +tr: Translates or deletes characters from input. +xargs: Builds and executes command lines from standard input. +tee: Reads from standard input and writes to both standard output and files. +basename: Strips directory and suffix from filenames. +dirname: Extracts the directory path from a file path. +read: Reads input from the user or file. +tar: Archives and extracts files using tar format. +zip: Compresses files into a zip archive. +unzip: Extracts files from a zip archive. +gzip: Compresses files using the gzip format. +gunzip: Decompresses gzip-compressed files. +rsync: Synchronizes files and directories between two locations. +iptables: Configures the IP packet filter rules of the Linux kernel. +ufw: Simplified firewall management tool (Uncomplicated Firewall). +systemctl: Controls the systemd system and service manager. +journalctl: Views systemd logs. +dmesg: Displays kernel ring buffer messages. +who: Shows who is logged into the system. +last: Displays a list of last logged-in users. +at: Schedules a one-time task to run at a specific time. +awk: Pattern scanning and processing language used for text processing. +sed: Stream editor for filtering and transforming text. +chroot: Changes the root directory for a command or shell. +lsof: Lists open files and the processes that opened them. +nc: A versatile networking tool often used for testing and debugging. +sftp: A secure file transfer program over SSH. +ncdu: Disk usage analyzer with a user-friendly interface. +dig: Performs DNS lookups. +nslookup: Queries DNS information. +hostname: Displays or sets the system’s hostname. +curl ifconfig.me: Gets your public IP address. +adduser: Adds a new user to the system. +deluser: Removes a user from the system. +groupadd: Adds a new group to the system. +usermod: Modifies user account details. +groups: Displays the groups the current user belongs to. +sudo su: Switches to the root user. +nohup: Runs a command that will continue running after logging out. +jobs: Lists all active jobs in the current session. +fg: Brings a background job to the foreground. +bg: Resumes a stopped job in the background. +ctrl + z: Pauses a foreground job, allowing it to run in the background. +locate: Quickly finds files by name. +updatedb: Updates the database used by the locate command. +alias ll='ls -la': Creates an alias ll for a long-format list of files. +unalias: Removes an alias for a command. +export: Sets or exports environment variables. +env: Displays the current environment variables. +crontab: Manages cron jobs for automating tasks. +watch: Repeatedly runs a command at regular intervals. +vmstat: Reports virtual memory statistics. +mpstat: Displays CPU usage statistics. +htop: An interactive process viewer (more user-friendly than top). +uptime: Displays the system uptime and load average. +ulimit: Displays or sets resource limits for user processes. +ip link: Manages network interfaces. +ss: A faster alternative to netstat for displaying network connections. +traceroute: Traces the route packets take to a network host. +ping6: Tests connectivity to a network host using IPv6. +scp: Securely copies files between hosts over SSH. +bc: A command-line calculator. +dd: Converts and copies files, useful for creating disk images. +arp: Displays or modifies the system's ARP table. +md5sum: Computes and verifies MD5 hashes. +sha256sum: Computes and verifies SHA-256 hashes. +hostnamectl: Controls the system's hostname. +ip a: Displays IP addresses of the system's network interfaces. +ip r: Displays the routing table. +journalctl -f: Follows the system logs in real time. +tshark: A command-line network packet analyzer. +lspci: Lists PCI devices connected to the system. +lsusb: Lists USB devices connected to the system. +modprobe: Adds or removes modules from the Linux kernel. +parted: A disk partitioning tool. +mkfs: Creates a file system on a partition or device. +fsck: Checks and repairs a file system. +tune2fs: Adjusts tunable file system parameters on ext filesystems. +swapoff: Disables swap space on a device. +swapon: Enables swap space on a device. +fuser: Identifies processes using files or sockets. +nmcli: Command-line tool for managing NetworkManager. +w: Displays logged-in users and their active processes. +wall: Sends a message to all logged-in users. +passwd: Changes user passwords. +stat: Displays detailed information about a file or file system. +chage: Changes user password expiration information. +pmap: Reports memory map of a process. +ionice: Sets or gets I/O scheduling class and priority. +nc (netcat): Reads and writes data across network connections. +dstat: Combines and displays system resource statistics, such as CPU, disk, and network usage. +sar: Collects, reports, or saves system activity information. +iostat: Reports CPU and I/O statistics for devices and partitions. +iotop: Displays real-time disk I/O usage by processes. +inotifywait: Waits for changes to files or directories using inotify. +inotifywatch: Watches for changes in a file or directory using inotify. +nice: Runs a command with a modified scheduling priority. +renice: Alters the priority of running processes. +lsblk: Lists information about block devices. +hdparm: Configures and displays information about SATA/IDE devices. +smartctl: Monitors the health of hard drives using SMART. +fallocate: Preallocates space to a file. +wipe: Securely erases files or partitions. +file: Determines file type based on content. +shred: Securely deletes a file by overwriting it. +ncftpput: Uploads files to an FTP server. +ncftpget: Downloads files from an FTP server. +ufw: Simplified firewall utility for managing iptables rules. +ethtool: Configures and displays Ethernet device settings. +brctl: Manages Ethernet bridges. +xkill: Terminates a window by clicking on it. +xrandr: Configures display screen resolution, rotation, and reflection. +xset: Manages X display settings. +xdg-open: Opens a file or URL in the user's preferred application. +apropos: Searches the manual page names and descriptions for keywords. +systemd-analyze: Displays system boot performance statistics. +timedatectl: Manages system time and date settings. +fwupdmgr: Firmware update manager for updating hardware firmware. +lscpu: Displays information about the CPU architecture. +getfacl: Displays file access control lists (ACLs). +setfacl: Sets file access control lists (ACLs). +pv: Monitors the progress of data through a pipeline. +logrotate: Manages the automatic rotation and compression of log files. +xclip: Interfaces with the X clipboard from the command line. +cups: Manages printers (Common Unix Printing System). +lp: Sends a file to the printer. +lprm: Removes print jobs from the queue. +lpstat: Displays the status of the print system. +strace: Traces system calls and signals. +tcpdump: Captures network traffic for analysis. +envsubst: Substitutes environment variables in shell commands. +tput: Initializes terminal capabilities, such as clearing the screen. +xargs: Builds and executes command lines from standard input. +dmesg | tail: Displays recent kernel messages (useful for hardware or system errors). +lsns: Lists all active Linux namespaces. +ss -tuln: Lists open network ports (TCP and UDP). +iptables-save: Outputs current iptables rules to a file. +iptables-restore: Restores iptables rules from a file. +tac: Displays a file in reverse line order (opposite of cat). +nl: Numbers the lines of a file. +yes: Repeatedly outputs a string until stopped (e.g., yes y). +split: Splits a file into pieces. +csplit: Splits a file into pieces based on context. +paste: Merges lines of files side by side. +comm: Compares two sorted files line by line. +shuf: Shuffles lines of text in random order. +factor: Prints the prime factors of a given number. +seq: Prints numbers in a sequence. +pr: Converts text files for printing, adding headers and footers. +column: Formats output into columns. +od: Displays files in octal, decimal, hexadecimal, or ASCII. +hexdump: Displays files in hexadecimal format. +xxd: Creates a hex dump of a file or converts a hex dump back to binary. +watch: Runs a command repeatedly, displaying the output and updates. +timeout: Runs a command with a time limit. +stdbuf: Alters the buffering of input/output for a command. +rename: Renames files using a regular expression. +prlimit: Displays or modifies resource limits of running processes. +uuidgen: Generates a new universally unique identifier (UUID). +vipw: Safely edits the /etc/passwd file. +vigr: Safely edits the /etc/group file. +getent: Retrieves entries from databases like passwd, group, or hosts. +addgroup: Creates a new user group. +pwgen: Generates random passwords. +expire: Forces a password change after a specific period. +showmount: Displays information about an NFS server. +exportfs: Maintains the NFS server's exported file systems. +rpcinfo: Displays information about RPC services on a networked system. +lsmod: Lists currently loaded kernel modules. +insmod: Inserts a module into the Linux kernel. +rmmod: Removes a module from the Linux kernel. +depmod: Generates modules dependency and map files. +kmod: Interfaces with kernel modules from the command line. +e2fsck: Checks the integrity of an ext2/ext3/ext4 file system. +blkid: Displays block device attributes, including UUID. +mount: Mounts a file system. +umount: Unmounts a file system. +parted: A command-line partition editor. +gparted: A graphical partition editor (based on parted). +cryptsetup: Manages encrypted devices. +losetup: Configures loopback devices. +mkswap: Sets up a swap area on a device or file. +tmux: Terminal multiplexer for managing multiple terminal sessions. +finger: Displays user information (if installed). +lastb: Shows failed login attempts. +pidof: Finds the process ID (PID) of a running program. +pgrep: Searches for processes by name. +curl -I: Fetches the HTTP headers from a URL. +chattr: Changes file attributes on a Linux file system. +lsattr: Lists file attributes on a Linux file system. +join: Joins lines of two files based on a common field. +tree: Displays a directory structure in a tree-like format. +col: Filters reverse line feeds from input. +free: Displays memory usage. \ No newline at end of file diff --git a/tui/src/state.rs b/tui/src/state.rs index fa980a409..9642f884a 100644 --- a/tui/src/state.rs +++ b/tui/src/state.rs @@ -9,6 +9,7 @@ use crate::{ use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers}; use ego_tree::NodeId; use linutil_core::{Command, ListNode, Tab}; +use rand::Rng; use ratatui::{ layout::{Alignment, Constraint, Direction, Layout}, style::{Style, Stylize}, @@ -39,6 +40,7 @@ pub struct AppState { multi_select: bool, selected_commands: Vec, drawable: bool, + tip: &'static str, } pub enum Focus { @@ -69,6 +71,7 @@ impl AppState { multi_select: false, selected_commands: Vec::new(), drawable: false, + tip: get_random_line(include_str!("../cool_tips.txt").lines().collect()), }; state.update_items(); state @@ -246,7 +249,12 @@ impl AppState { // Create the list widget with items let list = List::new(items) .highlight_style(style) - .block(Block::default().borders(Borders::ALL).title(title)) + .block( + Block::default() + .borders(Borders::ALL) + .title(title) + .title_bottom(Line::from(self.tip.bold().blue()).right_aligned()), + ) .scroll_padding(1); frame.render_stateful_widget(list, chunks[1], &mut self.selection); @@ -525,3 +533,13 @@ impl AppState { self.update_items(); } } + +fn get_random_line(lines: Vec<&str>) -> &str { + if lines.is_empty() { + return ""; + } + + let mut rng = rand::thread_rng(); + let random_index = rng.gen_range(0..lines.len()); + lines[random_index] +}