Skip to main content

strat9_kernel/shell/commands/
mod.rs

1//! Shell command registry and entry points
2//!
3
4// VGA-UI dependent command; riscv64 console is serial-only (R6: virtio-gpu).
5#[cfg(target_arch = "x86_64")]
6pub mod gfx;
7pub mod help;
8pub mod hw;
9pub mod mem;
10pub mod net;
11pub mod proc;
12pub mod ps;
13pub mod sys;
14pub mod timer;
15pub mod top;
16pub mod util;
17pub mod vfs;
18
19use super::ShellError;
20use alloc::{collections::BTreeMap, string::String};
21
22pub struct CommandRegistry {
23    commands: BTreeMap<String, fn(&[String]) -> Result<(), ShellError>>,
24}
25
26impl CommandRegistry {
27    pub fn new() -> Self {
28        let mut registry = Self {
29            commands: BTreeMap::new(),
30        };
31
32        // General
33        registry.register("help", help::cmd_help);
34        registry.register("version", sys::cmd_version);
35        registry.register("clear", sys::cmd_clear);
36        registry.register("reboot", sys::cmd_reboot);
37        registry.register("shutdown", sys::cmd_shutdown);
38        registry.register("uptime", util::cmd_uptime);
39        registry.register("echo", util::cmd_echo);
40        registry.register("watch", util::cmd_watch);
41        registry.register("date", util::cmd_date);
42        registry.register("ntpdate", util::cmd_ntpdate);
43
44        // Process
45        registry.register("ps", ps::cmd_ps);
46        registry.register("kill", proc::cmd_kill);
47        registry.register("whoami", util::cmd_whoami);
48
49        // Filesystem
50        registry.register("scheme", vfs::cmd_scheme);
51        registry.register("mount", vfs::cmd_mount);
52        registry.register("umount", vfs::cmd_umount);
53        registry.register("cd", vfs::cmd_cd);
54        registry.register("ls", vfs::cmd_ls);
55        registry.register("cat", vfs::cmd_cat);
56        registry.register("stat", vfs::cmd_stat);
57        registry.register("mkdir", vfs::cmd_mkdir);
58        registry.register("touch", vfs::cmd_touch);
59        registry.register("rm", vfs::cmd_rm);
60        registry.register("write", vfs::cmd_write);
61        registry.register("cp", vfs::cmd_cp);
62        registry.register("mv", vfs::cmd_mv);
63        registry.register("df", vfs::cmd_df);
64        registry.register("grep", util::cmd_grep);
65
66        // Memory
67        registry.register("mem", mem::cmd_mem);
68        registry.register("frame-meta", sys::cmd_frame_meta);
69        registry.register("heap", sys::cmd_heap);
70
71        // Hardware / IPC / Diagnostics
72        registry.register("lspci", hw::cmd_lspci);
73        registry.register("lsns", hw::cmd_lsns);
74        registry.register("cpuinfo", sys::cmd_cpuinfo);
75        registry.register("dmesg", util::cmd_dmesg);
76        registry.register("audit", util::cmd_audit);
77        registry.register("env", util::cmd_env);
78        registry.register("setenv", util::cmd_setenv);
79        registry.register("unsetenv", util::cmd_unsetenv);
80        registry.register("health", sys::cmd_health);
81
82        // Silo / Strate
83        registry.register("strate", sys::cmd_strate);
84        registry.register("silo", sys::cmd_silo);
85        registry.register("silos", sys::cmd_silos);
86
87        // Crypto
88        registry.register("crypto", sys::cmd_crypto);
89
90        // Network
91        registry.register("ping", net::cmd_ping);
92        registry.register("ifconfig", net::cmd_ifconfig);
93        registry.register("net", net::cmd_net);
94        registry.register("nslookup", net::cmd_nslookup);
95        registry.register("telnet", net::cmd_telnet);
96
97        // Scheduler
98        registry.register("scheduler", sys::cmd_scheduler);
99        registry.register("trace", sys::cmd_trace);
100
101        // Graphics
102        #[cfg(target_arch = "x86_64")]
103        registry.register("gfx", gfx::cmd_gfx);
104        #[cfg(target_arch = "x86_64")]
105        registry.register("gfx-demo", gfx::cmd_gfx_demo);
106        registry.register("top", top::cmd_top);
107        registry.register("timer", timer::cmd_timer);
108
109        // Testing
110        registry.register("test_pid", sys::cmd_test_pid);
111        registry.register("test_syscalls", sys::cmd_test_syscalls);
112        registry.register("test_mem", sys::cmd_test_mem);
113        registry.register("test_mem_stressed", sys::cmd_test_mem_stressed);
114        registry.register("test_mem_region", sys::cmd_test_mem_region);
115        registry.register("test_mem_region_proc", sys::cmd_test_mem_region_proc);
116        registry.register("test_exec", sys::cmd_test_exec);
117        registry.register("wasm-run", sys::cmd_wasm_run);
118
119        registry
120    }
121
122    pub fn register(&mut self, name: &str, func: fn(&[String]) -> Result<(), ShellError>) {
123        self.commands.insert(String::from(name), func);
124    }
125
126    pub fn execute(&self, cmd: &super::parser::Command) -> Result<(), ShellError> {
127        if let Some(func) = self.commands.get(&cmd.name) {
128            func(&cmd.args)
129        } else {
130            Err(ShellError::UnknownCommand)
131        }
132    }
133
134    /// Return all registered command names (sorted).
135    pub fn command_names(&self) -> alloc::vec::Vec<&str> {
136        self.commands.keys().map(|k| k.as_str()).collect()
137    }
138}