Initial Commit
This commit is contained in:
commit
469e704610
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
.idea
|
||||
build
|
||||
|
||||
go.sum
|
5
go.mod
Normal file
5
go.mod
Normal file
@ -0,0 +1,5 @@
|
||||
module stormfetch
|
||||
|
||||
go 1.22
|
||||
|
||||
require gopkg.in/yaml.v3 v3.0.1 // indirect
|
187
main.go
Normal file
187
main.go
Normal file
@ -0,0 +1,187 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
yaml "gopkg.in/yaml.v3"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var asciiPath string = ""
|
||||
var configPath string = ""
|
||||
|
||||
var config StormfetchConfig = StormfetchConfig{}
|
||||
|
||||
type StormfetchConfig struct {
|
||||
Distro string `yaml:"distro_id"`
|
||||
Ascii string `yaml:"distro_ascii"`
|
||||
Fetch string `yaml:"fetch_script"`
|
||||
}
|
||||
|
||||
type DistroInfo struct {
|
||||
ID string
|
||||
LongName string
|
||||
ShortName string
|
||||
}
|
||||
|
||||
func main() {
|
||||
readConfig()
|
||||
}
|
||||
|
||||
func readConfig() {
|
||||
// Get home directory
|
||||
homedir, _ := os.UserConfigDir()
|
||||
// Find valid config directory
|
||||
if _, err := os.Stat(path.Join(homedir, "stormfetch/config.yaml")); err == nil {
|
||||
configPath = path.Join(homedir, "stormfetch/config.yaml")
|
||||
} else if _, err := os.Stat("/etc/stormfetch/config.yaml"); err == nil {
|
||||
configPath = "/etc/stormfetch/config.yaml"
|
||||
} else {
|
||||
log.Fatalf("Config file not found: %s", err.Error())
|
||||
}
|
||||
// Find valid ascii directory
|
||||
if stat, err := os.Stat(path.Join(homedir, "stormfetch/ascii/")); err == nil && stat.IsDir() {
|
||||
asciiPath = path.Join(homedir, "stormfetch/ascii/")
|
||||
} else if stat, err := os.Stat("/etc/stormfetch/ascii/"); err == nil && stat.IsDir() {
|
||||
asciiPath = "/etc/stormfetch/ascii/"
|
||||
} else {
|
||||
log.Fatal("Ascii directory not found")
|
||||
}
|
||||
// Parse config
|
||||
bytes, err := os.ReadFile(configPath)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
err = yaml.Unmarshal(bytes, &config)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Write fetch script to file
|
||||
temp, err := os.CreateTemp("/tmp", "stormfetch")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = os.WriteFile(temp.Name(), []byte(config.Fetch), 644)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
//Execute fetch script
|
||||
cmd := exec.Command("/bin/sh", configPath)
|
||||
workdir, err := os.Getwd()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
cmd.Dir = workdir
|
||||
cmd.Environ()
|
||||
getDistroInfo()
|
||||
cmd.Env = append(cmd.Env, "DISTRO_LONG_NAME="+getDistroInfo().LongName)
|
||||
cmd.Env = append(cmd.Env, "DISTRO_SHORT_NAME="+getDistroInfo().ShortName)
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
err = os.Remove(temp.Name())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// Print Distro Ascii
|
||||
fmt.Println(getDistroAscii())
|
||||
// Print Fetch Script Output
|
||||
fmt.Println(string(out))
|
||||
}
|
||||
|
||||
func readKeyValueFile(filepath string) (map[string]string, error) {
|
||||
ret := make(map[string]string)
|
||||
if _, err := os.Stat(filepath); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
bytes, err := os.ReadFile(filepath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
str := string(bytes)
|
||||
lines := strings.Split(str, "\n")
|
||||
for _, line := range lines {
|
||||
if len(strings.Split(line, "=")) >= 2 {
|
||||
key := strings.SplitN(line, "=", 2)[0]
|
||||
value := strings.SplitN(line, "=", 2)[1]
|
||||
if strings.HasPrefix(value, "\"") && strings.HasSuffix(value, "\"") {
|
||||
value = value[1 : len(value)-1]
|
||||
}
|
||||
ret[key] = value
|
||||
}
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func getDistroInfo() DistroInfo {
|
||||
distroID := ""
|
||||
var releaseMap = make(map[string]string)
|
||||
if config.Distro == "auto" {
|
||||
if _, err := os.Stat("/etc/os-release"); err == nil {
|
||||
releaseMap, err = readKeyValueFile("/etc/os-release")
|
||||
if err != nil {
|
||||
return DistroInfo{
|
||||
ID: "unknown",
|
||||
LongName: "Unknown",
|
||||
ShortName: "Unknown",
|
||||
}
|
||||
}
|
||||
if value, ok := releaseMap["ID"]; ok {
|
||||
distroID = value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch distroID {
|
||||
case "debian":
|
||||
return DistroInfo{
|
||||
ID: "debian",
|
||||
LongName: releaseMap["PRETTY_NAME"],
|
||||
ShortName: releaseMap["NAME"],
|
||||
}
|
||||
case "ubuntu":
|
||||
return DistroInfo{
|
||||
ID: "ubuntu",
|
||||
LongName: releaseMap["PRETTY_NAME"],
|
||||
ShortName: releaseMap["NAME"],
|
||||
}
|
||||
case "arch":
|
||||
return DistroInfo{
|
||||
ID: "arch",
|
||||
LongName: releaseMap["PRETTY_NAME"],
|
||||
ShortName: releaseMap["NAME"],
|
||||
}
|
||||
default:
|
||||
return DistroInfo{
|
||||
ID: "unknown",
|
||||
LongName: "Unknown",
|
||||
ShortName: "Unknown",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getDistroAscii() string {
|
||||
defaultAscii :=
|
||||
` .--.
|
||||
|o_o |
|
||||
|:_/ |
|
||||
// \ \
|
||||
(| | )
|
||||
/'\_ _/'\
|
||||
\___)=(___/ `
|
||||
fmt.Println(path.Join(asciiPath, getDistroInfo().ID))
|
||||
if _, err := os.Stat(path.Join(asciiPath, getDistroInfo().ID)); err == nil {
|
||||
bytes, err := os.ReadFile(path.Join(asciiPath, getDistroInfo().ID))
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return string(bytes)
|
||||
} else {
|
||||
return defaultAscii
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user