Skip to main content

strat9_kernel/shell/commands/
mod.rs

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