initial build

This commit is contained in:
Merith 2025-05-06 11:21:11 -07:00
commit 790062a152
8 changed files with 281 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/bin

116
.random data Normal file
View file

@ -0,0 +1,116 @@
// package main
// import (
// "fmt"
// "os"
// "os/exec"
// )
// func main() {
// devices, err := listStorageDevices()
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// fmt.Println("Connected storage devices:")
// var storageDevices []string
// for _, device := range devices {
// // filter out non-disk devices
// if device[:2] != "sd" {
// continue
// }
// // show only ones that end with a number
// if device[len(device)-1] < '0' || device[len(device)-1] > '9' {
// continue
// }
// fmt.Println(device)
// storageDevices = append(storageDevices, device)
// }
// if len(storageDevices) == 0 {
// fmt.Println("No storage devices found.")
// return
// }
// // if there are storage devices, check if they are mounted
// for _, device := range storageDevices {
// mounted, err := isMounted(device)
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// // if not mounted, mount it to /mnt/init/<device>
// if !mounted {
// err = mountDevice(device)
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// fmt.Println("Device", device, "mounted to /mnt/init/"+device)
// }
// }
// }
// func mountDevice(device string) error {
// // ensure the mount point exists
// err := os.MkdirAll("/mnt/init/"+device, 0755)
// if err != nil {
// return err
// }
// // Use `mount` command to mount the device
// cmd := exec.Command("mount", "/dev/"+device, "/mnt/init/"+device)
// err = cmd.Run()
// if err != nil {
// return err
// }
// return nil
// }
// func isMounted(device string) (bool, error) {
// file, err := os.Open("/proc/mounts")
// if err != nil {
// return false, err
// }
// defer file.Close()
// var devicePath string
// for {
// var path, dev string
// _, err := fmt.Fscanf(file, "%s %s\n", &path, &dev)
// if err != nil {
// break
// }
// if dev == "/dev/"+device {
// devicePath = path
// break
// }
// }
// return devicePath != "", nil
// }
// func listStorageDevices() ([]string, error) {
// dir, err := os.Open("/dev")
// if err != nil {
// return nil, err
// }
// defer dir.Close()
// files, err := dir.Readdir(-1)
// if err != nil {
// return nil, err
// }
// devices := make([]string, 0)
// for _, file := range files {
// if file.Mode()&os.ModeDevice != 0 {
// devices = append(devices, file.Name())
// }
// }
// return devices, nil
// }

37
cmd/gl.init/config.go Normal file
View file

@ -0,0 +1,37 @@
package main
import (
"encoding/json"
"io/ioutil"
)
var config ConfigData
type ConfigData struct {
Servicefiles string `json:"servicefiles"`
Automount []struct {
PartitionUUID string `json:"partition-uuid"`
Mountpoint string `json:"mountpoint"`
} `json:"automount"`
}
func loadConfig() {
// Load JSON config from /etc/gl.userinit.json
configFile := "userinit.json"
// Read the JSON file
data, err := ioutil.ReadFile(configFile)
if err != nil {
// Handle error
return
}
// Unmarshal JSON data into the config struct
err = json.Unmarshal(data, &config)
if err != nil {
// Handle error
return
}
// Config loaded successfully
}

77
cmd/gl.init/devices.go Normal file
View file

@ -0,0 +1,77 @@
package main
import (
"fmt"
"os/exec"
"runtime"
"strings"
)
type Device struct {
Name string
MajMin string
Rm string
Size string
Ro string
Type string
MountPoint string
}
func getDevices() string {
if runtime.GOOS == "windows" {
return sampleOutput
}
cmd := exec.Command("lsblk", "-pP")
// store the output
output, err := cmd.Output()
if err != nil {
panic(err)
}
// convert the byte buffer to a string
outputString := string(output)
return outputString
}
func parseDevices(output string) []Device {
// split the output string by new line
lines := strings.Split(output, "\n")
if len(lines) == 0 {
return nil
}
// create a slice of devices
devices := make([]Device, 0)
// iterate over the lines
for _, line := range lines {
// skip empty lines
if line == "" {
continue
}
line = strings.ReplaceAll(line, "\"", "") // remove the quotes
line = strings.ReplaceAll(line, "NAME=", "")
line = strings.ReplaceAll(line, "MAJ:MIN=", "")
line = strings.ReplaceAll(line, "RM=", "")
line = strings.ReplaceAll(line, "SIZE=", "")
line = strings.ReplaceAll(line, "RO=", "")
line = strings.ReplaceAll(line, "TYPE=", "")
line = strings.ReplaceAll(line, "MOUNTPOINT=", "")
fmt.Println(line)
// split the line by space
parts := strings.Split(line, " ")
// create a new device
device := Device{
Name: parts[0],
MajMin: parts[1],
Rm: parts[2],
Size: parts[3],
Ro: parts[4],
Type: parts[5],
MountPoint: parts[6],
}
// append the device to the slice
devices = append(devices, device)
}
// return the slice of devices
return devices
}

32
cmd/gl.init/main.go Normal file
View file

@ -0,0 +1,32 @@
package main
import (
"fmt"
)
// `lsblk -pP` returns a string with the following format:
var sampleOutput = `NAME="/dev/sda" MAJ:MIN="8:0" RM="1" SIZE="57.7G" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="/dev/sda1" MAJ:MIN="8:1" RM="1" SIZE="57.6G" RO="0" TYPE="part" MOUNTPOINT="/mnt/init/sda1"
NAME="/dev/sda2" MAJ:MIN="8:2" RM="1" SIZE="32M" RO="0" TYPE="part" MOUNTPOINT="/mnt/init/sda2"
NAME="/dev/mtdblock0" MAJ:MIN="31:0" RM="0" SIZE="128K" RO="1" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock1" MAJ:MIN="31:1" RM="0" SIZE="384K" RO="1" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock2" MAJ:MIN="31:2" RM="0" SIZE="128K" RO="1" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock3" MAJ:MIN="31:3" RM="0" SIZE="128K" RO="1" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock4" MAJ:MIN="31:4" RM="0" SIZE="125.3M" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock5" MAJ:MIN="31:5" RM="0" SIZE="4M" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock6" MAJ:MIN="31:6" RM="0" SIZE="121.3M" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="/dev/mtdblock7" MAJ:MIN="31:7" RM="0" SIZE="256K" RO="0" TYPE="disk" MOUNTPOINT=""
NAME="/dev/ubiblock0_0" MAJ:MIN="254:0" RM="0" SIZE="13.9M" RO="0" TYPE="disk" MOUNTPOINT="/rom"
`
func main() {
loadConfig()
devices := getDevices()
parsedDevices := parseDevices(devices)
for _, device := range parsedDevices {
// if device starts with /dev/sd and ends with a number, it's a disk
fmt.Println("Name: " + device.Name)
}
}

5
go.mod Normal file
View file

@ -0,0 +1,5 @@
module git.merith.xyz/packages/gl.init
go 1.21.3
require github.com/deepakjois/gousbdrivedetector v0.0.0-20220514003247-ea439de1c459 // indirect

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
github.com/deepakjois/gousbdrivedetector v0.0.0-20220514003247-ea439de1c459 h1:gZcBabrda6G8OBWOLr2hRCwtOVr2z2oD8GHlv9wpMSE=
github.com/deepakjois/gousbdrivedetector v0.0.0-20220514003247-ea439de1c459/go.mod h1:zBq85v4Jn+9KU3tkyNs7IKzmyP/KQcitMLzLkwhxfSk=

11
makefile Normal file
View file

@ -0,0 +1,11 @@
GOOS=linux
GOARCH=mipsle
default:
go run ./cmd/gl.init/
target:
GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o ./bin/gl.init ./cmd/gl.init/
push: target
scp ./bin/gl.init root@192.168.8.1:/tmp