A CLI tool to edit dinit service files with ease
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add Go impl

iacore d644d08c d0fb95e9

+103 -7
+1
.gitignore
··· 1 1 *.o 2 2 main 3 + dinit-edit
+86
dinit-edit.go
··· 1 + package main 2 + 3 + import ( 4 + "fmt" 5 + "os" 6 + "path" 7 + "slices" 8 + "syscall" 9 + ) 10 + 11 + func getServiceDirs() (serviceDirs []string) { 12 + if os.Getuid() == 0 { 13 + serviceDirs = []string{"/etc/dinit.d", "/run/dinit.d", "/usr/local/lib/dinit.d", "/lib/dinit.d"} 14 + } else { 15 + if xdg_home, ok := os.LookupEnv("XDG_CONFIG_HOME"); ok { 16 + serviceDirs = append(serviceDirs, path.Join(xdg_home, "dinit.d")) 17 + } 18 + if home, ok := os.LookupEnv("HOME"); ok { 19 + serviceDirs = append(serviceDirs, path.Join(home, ".config/dinit.d")) 20 + } 21 + serviceDirs = slices.Concat(serviceDirs, []string{"/etc/dinit.d/user", "/usr/lib/dinit.d/user", "/usr/local/lib/dinit.d/user"}) 22 + } 23 + return 24 + } 25 + 26 + type Service struct { 27 + Name string 28 + Path string 29 + } 30 + 31 + func main() { 32 + dirs := getServiceDirs() 33 + services := []Service{} 34 + for _, dir := range dirs { 35 + entries, err := os.ReadDir(dir) 36 + if err != nil { 37 + // missing dir is ok 38 + if !os.IsNotExist(err) { 39 + fmt.Println(err) 40 + } 41 + } else { 42 + for _, entry := range entries { 43 + if entry.Type().IsRegular() { 44 + name := entry.Name() 45 + path := path.Join(dir, name) 46 + services = append(services, Service{ 47 + Name: name, 48 + Path: path, 49 + }) 50 + } 51 + } 52 + } 53 + } 54 + 55 + if len(os.Args) < 2 { 56 + listAll(services) 57 + } else { 58 + edit(services, os.Args[1]) 59 + } 60 + } 61 + 62 + func listAll(services []Service) { 63 + longest := 0 64 + for _, srv := range services { 65 + longest = max(longest, len(srv.Name)) 66 + } 67 + for _, srv := range services { 68 + fmt.Fprintf(os.Stdout, "%-*s%s\n", longest+4, srv.Name, srv.Path) 69 + } 70 + } 71 + 72 + func edit(services []Service, name string) { 73 + i := slices.IndexFunc(services, func(srv Service) bool { return srv.Name == name }) 74 + if i < 0 { 75 + fmt.Println("service not found:", name) 76 + os.Exit(1) 77 + } else { 78 + if editor_sh, ok := os.LookupEnv("EDITOR"); ok { 79 + err := syscall.Exec("/bin/sh", []string{"sh", "-c", editor_sh + " " + services[i].Path}, os.Environ()) 80 + if err != nil { 81 + fmt.Println(err) 82 + os.Exit(1) 83 + } 84 + } 85 + } 86 + }
+16 -7
readme.md
··· 2 2 3 3 Please don't have space or other weird characters inside the service file path, since it's passed to `sh -c '$EDITOR $service_file_path'`. 4 4 5 - ## Building 5 + ## Usage 6 + 7 + ``` 8 + # list all 9 + dinit-edit 10 + # edit one 11 + dinit-edit <service> 12 + ``` 13 + 14 + ## Buliding Go implementation 15 + 16 + ``` 17 + go build dinit-edit.go 18 + ``` 19 + 20 + ## Building Zig implementatino 6 21 7 22 Use Zig 0.14.1 8 23 ··· 11 26 install ./main <somewhere> 12 27 ``` 13 28 14 - ``` 15 - # list all 16 - dinit-edit 17 - # edit one 18 - dinit-edit <service> 19 - ```