9 Commits
8 changed files with 169 additions and 132 deletions
-4
View File
@@ -1,4 +0,0 @@
.idea
build
stormfetch
stormfetch.tar.gz
+23
View File
@@ -0,0 +1,23 @@
#/43;45;45;15
${C3}.${C1}-------------------------:
.${C2}+=${C1}========================.
:${C2}++${C1}===${C2}++===${C1}===============- :${C2}++${C1}-
:${C2}*++${C1}====${C2}+++++==${C1}===========- .==:
-${C2}*+++${C1}=====${C2}+***++=${C1}=========:
=${C2}*++++=${C1}=======------------:
=${C2}*+++++=${C1}====- ${C3}...${C1}
.${C2}+*+++++${C1}=-===: .${C2}=+++=${C1}:
:${C2}++++${C1}=====-==: -***${C2}**${C1}+
:${C2}++=${C1}=======-=. .=+**+${C3}.${C1}
.${C2}+${C1}==========-. ${C3}.${C1}
:${C2}+++++++${C1}====- ${C3}.${C1}--==-${C3}.${C1}
:${C2}++${C1}==========. ${C3}:${C2}+++++++${C1}${C3}:
${C1}.-===========. =*****+*+
${C1}.-===========: .+*****+:
${C1}-=======${C2}++++${C1}:::::::::::::::::::::::::-: ${C3}.${C1}---:
:======${C2}++++${C1}====${C2}+++******************=.
${C1}:=====${C2}+++${C1}==========${C2}++++++++++++++*-
${C1}.====${C2}++${C1}==============${C2}++++++++++*-
${C1}.===${C2}+${C1}==================${C2}+++++++:
${C1}.-=======================${C2}+++:
${C3}..........................
+20
View File
@@ -0,0 +1,20 @@
#/34;15;46;252
${C2} ...-:::::-...
${C2} .-MMMMMMMMMMMMMMM-.
.-MMMM${C1}`..-:::::::-..`${C2}MMMM-.
.:MMMM${C1}.:MMMMMMMMMMMMMMM:.${C2}MMMM:.
-MMM${C1}-M---MMMMMMMMMMMMMMMMMMM.${C2}MMM-
`:MMM${C1}:MM` :MMMM:....::-...-MMMM:${C2}MMM:`
:MMM${C1}:MMM` :MM:` `` `` `:MMM:${C2}MMM:
.MMM${C1}.MMMM` :MM. -MM. .MM- `MMMM.${C2}MMM.
:MMM${C1}:MMMM` :MM. -MM- .MM: `MMMM-${C2}MMM:
:MMM${C1}:MMMM` :MM. -MM- .MM: `MMMM:${C2}MMM:
:MMM${C1}:MMMM` :MM. -MM- .MM: `MMMM-${C2}MMM:
.MMM${C1}.MMMM` :MM:--:MM:--:MM: `MMMM.${C2}MMM.
:MMM${C1}:MMM- `-MMMMMMMMMMMM-` -MMM-${C2}MMM:
:MMM${C1}:MMM:` `:MMM:${C2}MMM:
.MMM${C1}.MMMM:--------------:MMMM.${C2}MMM.
'-MMMM${C1}.-MMMMMMMMMMMMMMM-.${C2}MMMM-'
'.-MMMM${C1}``--:::::--``${C2}MMMM-.'
${C2} '-MMMMMMMMMMMMM-'
${C2} ``-:::::-``
+2 -2
View File
@@ -1,6 +1,6 @@
#/1;7;3;15 #/1;7;3;15
${C1} .-/+oossssoo+\-. ${C1} .-/+oossssoo+\-.
´:+ssssssssssssssssss+:` ':+ssssssssssssssssss+:'
-+ssssssssssssssssssyyssss+- -+ssssssssssssssssssyyssss+-
.ossssssssssssssssss${C2}dMMMNy${C1}sssso. .ossssssssssssssssss${C2}dMMMNy${C1}sssso.
/sssssssssss${C2}hdmmNNmmyNMMMMh${C1}ssssss\ /sssssssssss${C2}hdmmNNmmyNMMMMh${C1}ssssss\
@@ -17,5 +17,5 @@ oss${C2}yNMMMNyMMh${C1}sssssssssssssshmmmh${C1}ssssssso
\sssssssssss${C2}hdmNNNNmyNMMMMh${C1}ssssss/ \sssssssssss${C2}hdmNNNNmyNMMMMh${C1}ssssss/
.ossssssssssssssssss${C2}dMMMNy${C1}sssso. .ossssssssssssssssss${C2}dMMMNy${C1}sssso.
-+sssssssssssssssss${C2}yyy${C1}ssss+- -+sssssssssssssssss${C2}yyy${C1}ssss+-
`:+ssssssssssssssssss+:` ':+ssssssssssssssssss+:'
.-\+oossssoo+/-. .-\+oossssoo+/-.
+1
View File
@@ -14,6 +14,7 @@ require (
github.com/jackmordaunt/pcidb v1.0.1 // indirect github.com/jackmordaunt/pcidb v1.0.1 // indirect
github.com/jackmordaunt/wmi v1.2.4 // indirect github.com/jackmordaunt/wmi v1.2.4 // indirect
github.com/kr/pretty v0.1.0 // indirect github.com/kr/pretty v0.1.0 // indirect
github.com/moby/sys/mountinfo v0.7.1 // indirect
golang.org/x/sys v0.3.0 // indirect golang.org/x/sys v0.3.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
) )
+3
View File
@@ -15,7 +15,10 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g=
github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+81 -52
View File
@@ -1,8 +1,9 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
yaml "gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"log" "log"
"os" "os"
"os/exec" "os/exec"
@@ -25,6 +26,7 @@ var config = StormfetchConfig{
type StormfetchConfig struct { type StormfetchConfig struct {
Ascii string `yaml:"distro_ascii"` Ascii string `yaml:"distro_ascii"`
DistroName string `yaml:"distro_name"`
FetchScript string `yaml:"fetch_script"` FetchScript string `yaml:"fetch_script"`
AnsiiColors []int `yaml:"ansii_colors"` AnsiiColors []int `yaml:"ansii_colors"`
ForceConfigAnsii bool `yaml:"force_config_ansii"` ForceConfigAnsii bool `yaml:"force_config_ansii"`
@@ -33,6 +35,9 @@ type StormfetchConfig struct {
func main() { func main() {
readConfig() readConfig()
readFlags()
checkDependencies()
runStormfetch()
} }
func readConfig() { func readConfig() {
@@ -72,6 +77,15 @@ func readConfig() {
} else { } else {
log.Fatalf("Fetch script file not found: %s", err.Error()) log.Fatalf("Fetch script file not found: %s", err.Error())
} }
}
func readFlags() {
flag.StringVar(&config.Ascii, "ascii", config.Ascii, "help message for flagname")
flag.StringVar(&config.DistroName, "distro-name", config.DistroName, "help message for flagname")
flag.Parse()
}
func checkDependencies() {
// Show Dependency warning if enabled // Show Dependency warning if enabled
if config.DependencyWarning { if config.DependencyWarning {
var dependencies []string var dependencies []string
@@ -89,6 +103,58 @@ func readConfig() {
fmt.Println("You can disable this warning through your stormfetch config") fmt.Println("You can disable this warning through your stormfetch config")
} }
} }
}
func SetupFetchEnv() []string {
var env = make(map[string]string)
env["DISTRO_LONG_NAME"] = getDistroInfo().LongName
env["DISTRO_SHORT_NAME"] = getDistroInfo().ShortName
env["CPU_MODEL"] = getCPUName()
env["CPU_THREADS"] = strconv.Itoa(getCPUThreads())
memory := GetMemoryInfo()
if memory != nil {
env["MEM_TOTAL"] = strconv.Itoa(memory.MemTotal)
env["MEM_USED"] = strconv.Itoa(memory.MemTotal - memory.MemAvailable)
env["MEM_FREE"] = strconv.Itoa(memory.MemAvailable)
}
partitions := getMountedPartitions()
if len(partitions) != 0 {
env["MOUNTED_PARTITIONS"] = strconv.Itoa(len(partitions))
for i, part := range partitions {
env["PARTITION"+strconv.Itoa(i+1)+"_DEVICE"] = part.Device
env["PARTITION"+strconv.Itoa(i+1)+"_MOUNTPOINT"] = part.MountPoint
if part.Label != "" {
env["PARTITION"+strconv.Itoa(i+1)+"_LABEL"] = part.Label
}
env["PARTITION"+strconv.Itoa(i+1)+"_TOTAL_SIZE"] = FormatBytes(part.TotalSize)
env["PARTITION"+strconv.Itoa(i+1)+"_USED_SIZE"] = FormatBytes(part.UsedSize)
env["PARTITION"+strconv.Itoa(i+1)+"_FREE_SIZE"] = FormatBytes(part.FreeSize)
}
}
env["DE_WM"] = GetDEWM()
env["USER_SHELL"] = GetShell()
env["DISPLAY_PROTOCOL"] = GetDisplayProtocol()
monitors := getMonitorResolution()
if len(monitors) != 0 {
env["CONNECTED_MONITORS"] = strconv.Itoa(len(monitors))
for i, monitor := range monitors {
env["MONITOR"+strconv.Itoa(i+1)] = monitor
}
}
if getGPUName() != "" {
env["GPU_MODEL"] = getGPUName()
}
var ret = make([]string, len(env))
i := 0
for key, value := range env {
ret[i] = fmt.Sprintf("%s=%s", key, value)
i++
}
return ret
}
func runStormfetch() {
// Fetch ascii art and apply colors // Fetch ascii art and apply colors
colorMap := make(map[string]string) colorMap := make(map[string]string)
colorMap["C0"] = "\033[0m" colorMap["C0"] = "\033[0m"
@@ -152,9 +218,19 @@ func readConfig() {
} }
} }
final := "" final := ""
for lineIndex, line := range asciiSplit { y := len(asciiSplit)
lineVisibleLength := len(strings.Split(asciiNoColor, "\n")[lineIndex]) if len(asciiSplit) < len(strings.Split(string(out), "\n")) {
y = len(strings.Split(string(out), "\n"))
}
for lineIndex := 0; lineIndex < y; lineIndex++ {
line := ""
for i := 0; i < maxWidth+5; i++ {
line = line + " "
}
lastAsciiColor := "" lastAsciiColor := ""
if lineIndex < len(asciiSplit) {
line = asciiSplit[lineIndex]
lineVisibleLength := len(strings.Split(asciiNoColor, "\n")[lineIndex])
if lineIndex != 0 { if lineIndex != 0 {
r := regexp.MustCompile("\033[38;5;[0-9]+m") r := regexp.MustCompile("\033[38;5;[0-9]+m")
matches := r.FindAllString(asciiSplit[lineIndex-1], -1) matches := r.FindAllString(asciiSplit[lineIndex-1], -1)
@@ -166,60 +242,13 @@ func readConfig() {
line = line + " " line = line + " "
} }
asciiSplit[lineIndex] = lastAsciiColor + line asciiSplit[lineIndex] = lastAsciiColor + line
}
str := string(out) str := string(out)
if lineIndex < len(strings.Split(str, "\n")) { if lineIndex < len(strings.Split(str, "\n")) {
line = line + colorMap["C0"] + strings.Split(str, "\n")[lineIndex] line = line + colorMap["C0"] + strings.Split(str, "\n")[lineIndex]
} }
final += lastAsciiColor + line + "\n" final += lastAsciiColor + line + "\n"
} }
final = strings.TrimRight(final, "\n\t ")
fmt.Println(final + "\033[0m") fmt.Println(final + "\033[0m")
} }
func SetupFetchEnv() []string {
var env = make(map[string]string)
env["DISTRO_LONG_NAME"] = getDistroInfo().LongName
env["DISTRO_SHORT_NAME"] = getDistroInfo().ShortName
env["CPU_MODEL"] = getCPUName()
env["CPU_THREADS"] = strconv.Itoa(getCPUThreads())
memory := GetMemoryInfo()
if memory != nil {
env["MEM_TOTAL"] = strconv.Itoa(memory.MemTotal)
env["MEM_USED"] = strconv.Itoa(memory.MemTotal - memory.MemAvailable)
env["MEM_FREE"] = strconv.Itoa(memory.MemAvailable)
}
partitions := getMountedPartitions()
if len(partitions) != 0 {
env["MOUNTED_PARTITIONS"] = strconv.Itoa(len(partitions))
for i, part := range partitions {
env["PARTITION"+strconv.Itoa(i+1)+"_DEVICE"] = part.Device
env["PARTITION"+strconv.Itoa(i+1)+"_MOUNTPOINT"] = part.MountPoint
if part.Label != "" {
env["PARTITION"+strconv.Itoa(i+1)+"_LABEL"] = part.Label
}
env["PARTITION"+strconv.Itoa(i+1)+"_TOTAL_SIZE"] = FormatBytes(part.TotalSize)
env["PARTITION"+strconv.Itoa(i+1)+"_USED_SIZE"] = FormatBytes(part.UsedSize)
env["PARTITION"+strconv.Itoa(i+1)+"_FREE_SIZE"] = FormatBytes(part.FreeSize)
}
}
env["DE_WM"] = GetDEWM()
env["USER_SHELL"] = GetShell()
env["DISPLAY_PROTOCOL"] = GetDisplayProtocol()
monitors := getMonitorResolution()
if len(monitors) != 0 {
env["CONNECTED_MONITORS"] = strconv.Itoa(len(monitors))
for i, monitor := range monitors {
env["MONITOR"+strconv.Itoa(i+1)] = monitor
}
}
if getGPUName() != "" {
env["GPU_MODEL"] = getGPUName()
}
var ret = make([]string, len(env))
i := 0
for key, value := range env {
ret[i] = fmt.Sprintf("%s=%s", key, value)
i++
}
return ret
}
+26 -61
View File
@@ -7,6 +7,7 @@ import (
"github.com/BurntSushi/xgb/xinerama" "github.com/BurntSushi/xgb/xinerama"
"github.com/jackmordaunt/ghw" "github.com/jackmordaunt/ghw"
"github.com/mitchellh/go-ps" "github.com/mitchellh/go-ps"
"github.com/moby/sys/mountinfo"
"log" "log"
"math" "math"
"os" "os"
@@ -27,41 +28,32 @@ type DistroInfo struct {
} }
func getDistroInfo() DistroInfo { func getDistroInfo() DistroInfo {
distroID := "" info := DistroInfo{
ID: "unknown",
LongName: "Unknown",
ShortName: "Unknown",
}
if strings.TrimSpace(config.DistroName) != "" {
info.LongName = strings.TrimSpace(config.DistroName)
info.ShortName = strings.TrimSpace(config.DistroName)
}
var releaseMap = make(map[string]string) var releaseMap = make(map[string]string)
if _, err := os.Stat("/etc/os-release"); err == nil { if _, err := os.Stat("/etc/os-release"); err == nil {
releaseMap, err = ReadKeyValueFile("/etc/os-release") releaseMap, err = ReadKeyValueFile("/etc/os-release")
if err != nil { if err != nil {
return DistroInfo{ return info
ID: "unknown",
LongName: "Unknown",
ShortName: "Unknown",
} }
} }
if value, ok := releaseMap["ID"]; ok {
distroID = value
}
}
switch distroID {
default:
if id, ok := releaseMap["ID"]; ok { if id, ok := releaseMap["ID"]; ok {
if longName, ok := releaseMap["PRETTY_NAME"]; ok { info.ID = id
if shortName, ok := releaseMap["NAME"]; ok {
return DistroInfo{
ID: id,
LongName: longName,
ShortName: shortName,
} }
if longName, ok := releaseMap["PRETTY_NAME"]; ok && info.LongName == "Unknown" {
info.LongName = longName
} }
if shortName, ok := releaseMap["NAME"]; ok && info.ShortName == "Unknown" {
info.ShortName = shortName
} }
} return info
return DistroInfo{
ID: "unknown",
LongName: "Unknown",
ShortName: "Unknown",
}
}
} }
func getDistroAsciiArt() string { func getDistroAsciiArt() string {
@@ -102,7 +94,7 @@ func getDistroAsciiArt() string {
if err != nil { if err != nil {
return defaultAscii return defaultAscii
} }
return string(bytes) return strings.TrimRight(string(bytes), "\n\t ")
} else { } else {
return defaultAscii return defaultAscii
} }
@@ -267,7 +259,6 @@ func GetDEWM() string {
} }
return strings.TrimSpace(string(out)) return strings.TrimSpace(string(out))
} }
if processExists("plasmashell") { if processExists("plasmashell") {
return "KDE Plasma " + runCommand("plasmashell --version | awk '{print $2}'") return "KDE Plasma " + runCommand("plasmashell --version | awk '{print $2}'")
} else if processExists("gnome-session") { } else if processExists("gnome-session") {
@@ -330,11 +321,9 @@ type partition struct {
} }
func getMountedPartitions() []partition { func getMountedPartitions() []partition {
partuuids, err := os.ReadDir("/dev/disk/by-partuuid") mounts, err := mountinfo.GetMounts(func(info *mountinfo.Info) (skip, stop bool) {
if err != nil { return !strings.HasPrefix(info.Source, "/dev/"), false
return nil })
}
partlabels, err := os.ReadDir("/dev/disk/by-partlabel") partlabels, err := os.ReadDir("/dev/disk/by-partlabel")
if err != nil && !os.IsNotExist(err) { if err != nil && !os.IsNotExist(err) {
return nil return nil
@@ -347,47 +336,23 @@ func getMountedPartitions() []partition {
} }
labels[link] = entry.Name() labels[link] = entry.Name()
} }
bytes, err := os.ReadFile("/proc/mounts")
if err != nil {
return nil
}
mountsRaw := strings.Split(string(bytes), "\n")
mounts := make(map[string]string)
for i := 0; i < len(mountsRaw); i++ {
split := strings.Split(mountsRaw[i], " ")
if len(split) <= 2 {
continue
}
mounts[split[0]] = split[1]
}
var partitions []partition var partitions []partition
for _, entry := range partuuids { for _, entry := range mounts {
link, err := filepath.EvalSymlinks(filepath.Join("/dev/disk/by-partuuid/", entry.Name()))
if err != nil {
continue
}
if _, ok := mounts[link]; !ok {
continue
}
p := partition{ p := partition{
link, entry.Source,
mounts[link], entry.Mountpoint,
"", "",
0, 0,
0, 0,
0, 0,
} }
if value, ok := labels[link]; ok { if value, ok := labels[entry.Source]; ok {
p.Label = value p.Label = value
} }
buf := new(syscall.Statfs_t) buf := new(syscall.Statfs_t)
err = syscall.Statfs(p.MountPoint, buf) err = syscall.Statfs(p.MountPoint, buf)
if err != nil { if err != nil {
log.Fatal(err) continue
} }
totalBlocks := buf.Blocks totalBlocks := buf.Blocks
freeBlocks := buf.Bfree freeBlocks := buf.Bfree