diff --git a/src/modules.go b/src/modules.go index 1400754..e649d9e 100644 --- a/src/modules.go +++ b/src/modules.go @@ -399,4 +399,37 @@ func initializeModuleMap() { return builder.String() }} RegisterModule(monitorsModule) + + // Custom module + customModule := StormfetchModule{stormfetchModuleConfig: stormfetchModuleConfig{Name: "custom"}, Execute: func(sm StormfetchModule) string { + shell, _ := sm.GetData("shell", "/bin/sh") + commandList, _ := sm.GetData("commands", make([]any, 0)) + + // Exeucte all commands + commandOutput := make(map[int]string) + for i, value := range commandList.([]any) { + command, ok := value.(string) + if !ok { + continue + } + + commandOutput[i+1] = runCommand(command, shell.(string)) + } + + return os.Expand(sm.Format, func(s string) string { + if len(s) <= 4 || !strings.HasPrefix(s, "CMD_") { + return "" + } + + commandIndexStr := strings.Split(s, "CMD_")[1] + + commandIndex, err := strconv.Atoi(commandIndexStr) + if err != nil { + return "" + } + + return commandOutput[commandIndex] + }) + }} + RegisterModule(customModule) } diff --git a/src/system.go b/src/system.go index 8b162c7..3631319 100644 --- a/src/system.go +++ b/src/system.go @@ -138,21 +138,6 @@ func GetKernel() (string, string) { } func GetInitSystem() string { - runCommand := func(command string) string { - cmd := exec.Command("/bin/sh", "-c", command) - workdir, err := os.Getwd() - if err != nil { - return "" - } - cmd.Dir = workdir - cmd.Env = os.Environ() - out, err := cmd.Output() - if err != nil { - return "" - } - return strings.TrimSpace(string(out)) - } - process, err := ps.FindProcess(1) if err != nil { return "" @@ -161,19 +146,19 @@ func GetInitSystem() string { // Special cases // OpenRC check if _, err := os.Stat("/usr/sbin/openrc"); err == nil { - return "OpenRC " + runCommand("openrc --version | awk '{print $3}'") + return "OpenRC " + runCommand("openrc --version | awk '{print $3}'", "/bin/sh") } // Default PID 1 process name checking switch process.Executable() { case "systemd": - return "Systemd " + runCommand("systemctl --version | head -n1 | awk '{print $2}'") + return "Systemd " + runCommand("systemctl --version | head -n1 | awk '{print $2}'", "/bin/sh") case "runit": return "Runit" case "dinit": - return "Dinit " + runCommand("dinit --version | head -n1 | awk '{print substr($3, 1, length($3)-1)}'") + return "Dinit " + runCommand("dinit --version | head -n1 | awk '{print substr($3, 1, length($3)-1)}'", "/bin/sh") case "enit": - return "Enit " + runCommand("enit --version | awk '{print $3}'") + return "Enit " + runCommand("enit --version | awk '{print $3}'", "/bin/sh") default: return process.Executable() } diff --git a/src/user.go b/src/user.go index de50cee..34f25e0 100644 --- a/src/user.go +++ b/src/user.go @@ -3,7 +3,6 @@ package main import ( "log" "os" - "os/exec" "path/filepath" "slices" "strconv" @@ -19,20 +18,6 @@ type DEWM struct { } func GetShell() string { - runCommand := func(command string) string { - cmd := exec.Command("/bin/sh", "-c", command) - workdir, err := os.Getwd() - if err != nil { - return "" - } - cmd.Dir = workdir - cmd.Env = os.Environ() - out, err := cmd.Output() - if err != nil { - return "" - } - return strings.TrimSpace(string(out)) - } file, err := os.ReadFile("/etc/passwd") if err != nil { return "" @@ -54,13 +39,13 @@ func GetShell() string { case "dash": return "Dash" case "bash": - return "Bash " + runCommand("echo $BASH_VERSION") + return "Bash " + runCommand("echo $BASH_VERSION", "/bin/sh") case "zsh": - return "Zsh " + runCommand("$SHELL --version | awk '{print $2}'") + return "Zsh " + runCommand("$SHELL --version | awk '{print $2}'", "/bin/sh") case "fish": - return "Fish " + runCommand("$SHELL --version | awk '{print $3}'") + return "Fish " + runCommand("$SHELL --version | awk '{print $3}'", "/bin/sh") case "nu": - return "Nushell " + runCommand("$SHELL --version") + return "Nushell " + runCommand("$SHELL --version", "/bin/sh") default: return "Unknown" } @@ -79,53 +64,39 @@ func GetDEWM() DEWM { processExists := func(process string) bool { return slices.Contains(executables, process) } - runCommand := func(command string) string { - cmd := exec.Command("/bin/sh", "-c", command) - workdir, err := os.Getwd() - if err != nil { - return "" - } - cmd.Dir = workdir - cmd.Env = os.Environ() - out, err := cmd.Output() - if err != nil { - return "" - } - return strings.TrimSpace(string(out)) - } if processExists("plasmashell") { dewm := DEWM{ Name: "KDE Plasma", Type: "DE", - Version: runCommand("plasmashell --version | awk '{print $2}'"), + Version: runCommand("plasmashell --version | awk '{print $2}'", "/bin/sh"), } return dewm } else if processExists("gnome-session") { dewm := DEWM{ Name: "Gnome", Type: "DE", - Version: runCommand("gnome-shell --version | awk '{print $3}'"), + Version: runCommand("gnome-shell --version | awk '{print $3}'", "/bin/sh"), } return dewm } else if processExists("xfce4-session") { dewm := DEWM{ Name: "XFCE", Type: "DE", - Version: runCommand("xfce4-session --version | head -n1 | awk '{print $2}'"), + Version: runCommand("xfce4-session --version | head -n1 | awk '{print $2}'", "/bin/sh"), } return dewm } else if processExists("cinnamon") { dewm := DEWM{ Name: "Cinnamon", Type: "DE", - Version: runCommand("cinnamon --version | awk '{print $3}'"), + Version: runCommand("cinnamon --version | awk '{print $3}'", "/bin/sh"), } return dewm } else if processExists("mate-panel") { dewm := DEWM{ Name: "MATE", Type: "DE", - Version: runCommand("mate-about --version | awk '{print $4}'"), + Version: runCommand("mate-about --version | awk '{print $4}'", "/bin/sh"), } return dewm } else if processExists("lxsession") { @@ -139,23 +110,23 @@ func GetDEWM() DEWM { dewm := DEWM{ Name: "LXQt", Type: "DE", - Version: runCommand("lxqt-session --version | head -n1 | awk '{print $2}'"), + Version: runCommand("lxqt-session --version | head -n1 | awk '{print $2}'", "/bin/sh"), } return dewm } else if processExists("i3") || processExists("i3-with-shmlog") { dewm := DEWM{ Name: "i3", Type: "WM", - Version: runCommand("i3 --version | awk '{print $3}'"), + Version: runCommand("i3 --version | awk '{print $3}'", "/bin/sh"), } return dewm } else if processExists("sway") { dewm := DEWM{ Name: "Sway", Type: "WM", - Version: runCommand("sway --version | awk '{print $3}'"), + Version: runCommand("sway --version | awk '{print $3}'", "/bin/sh"), } - if runCommand("sway --version | awk '{print $1}'") == "swayfx" { + if runCommand("sway --version | awk '{print $1}'", "/bin/sh") == "swayfx" { dewm.Name = "SwayFX" } else { dewm.Name = "Sway" @@ -165,21 +136,21 @@ func GetDEWM() DEWM { dewm := DEWM{ Name: "Bspwm", Type: "WM", - Version: runCommand("bspwm -v"), + Version: runCommand("bspwm -v", "/bin/sh"), } return dewm } else if processExists("Hyprland") { dewm := DEWM{ Name: "Hyprland", Type: "WM", - Version: runCommand("hyprctl version | sed -n 3p | awk '{print $2}' | tr -d 'v,'"), + Version: runCommand("hyprctl version | sed -n 3p | awk '{print $2}' | tr -d 'v,'", "/bin/sh"), } return dewm } else if processExists("icewm-session") { dewm := DEWM{ Name: "IceWM", Type: "WM", - Version: runCommand("icewm --version | awk '{print $2}'"), + Version: runCommand("icewm --version | awk '{print $2}'", "/bin/sh"), } return dewm } diff --git a/src/utils.go b/src/utils.go index 48f50d1..e6841ec 100644 --- a/src/utils.go +++ b/src/utils.go @@ -4,6 +4,7 @@ import ( "fmt" "math" "os" + "os/exec" "regexp" "strings" ) @@ -56,3 +57,18 @@ func ReadKeyValueFile(filepath string) (map[string]string, error) { } return ret, nil } + +func runCommand(command string, shell string) string { + cmd := exec.Command(shell, "-c", command) + workdir, err := os.Getwd() + if err != nil { + return "" + } + cmd.Dir = workdir + cmd.Env = os.Environ() + out, err := cmd.Output() + if err != nil { + return "" + } + return strings.TrimSpace(string(out)) +}