Initial implementation for .desktop fuse fs
This commit is contained in:
parent
2be0f82e4a
commit
41f25418e8
84
dot-desktop-fuse/main.go
Normal file
84
dot-desktop-fuse/main.go
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/hanwen/go-fuse/v2/fs"
|
||||||
|
"github.com/hanwen/go-fuse/v2/fuse"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ddf struct {
|
||||||
|
Path string
|
||||||
|
fs.Inode
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ddf) OnAdd(ctx context.Context) {
|
||||||
|
files, err := ioutil.ReadDir(r.Path)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
b, err := ioutil.ReadFile(filepath.Join(r.Path, file.Name()))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
b = bytes.ReplaceAll(b, []byte("Actions="), []byte("Actions=appvm;"))
|
||||||
|
|
||||||
|
raw := string(regexp.MustCompile("Exec=[a-zA-Z0-9]*").Find(b))
|
||||||
|
|
||||||
|
var app string
|
||||||
|
if len(raw) > 5 {
|
||||||
|
app = string(raw)[5:]
|
||||||
|
} else {
|
||||||
|
log.Println("Can't find Exec entry for", file.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
b = append(b, []byte("\n[Desktop Action appvm]\n")...)
|
||||||
|
b = append(b, []byte("Name=Open in appvm\n")...)
|
||||||
|
b = append(b, []byte("Exec=appvm start "+app+"\n")...)
|
||||||
|
|
||||||
|
ch := r.NewPersistentInode(
|
||||||
|
ctx, &fs.MemRegularFile{
|
||||||
|
Data: b,
|
||||||
|
Attr: fuse.Attr{Mode: 0444},
|
||||||
|
}, fs.StableAttr{})
|
||||||
|
r.AddChild(file.Name(), ch, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = (fs.NodeOnAdder)((*ddf)(nil))
|
||||||
|
|
||||||
|
func setupSigintHandler(server *fuse.Server) {
|
||||||
|
c := make(chan os.Signal)
|
||||||
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
|
go func() {
|
||||||
|
<-c
|
||||||
|
server.Unmount()
|
||||||
|
os.Exit(1)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
const from = "/var/run/current-system/sw/share/applications/"
|
||||||
|
|
||||||
|
to := filepath.Join(os.Getenv("HOME"), "/.local/share/applications")
|
||||||
|
os.MkdirAll(to, 0755)
|
||||||
|
|
||||||
|
server, err := fs.Mount(to, &ddf{Path: from}, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
setupSigintHandler(server)
|
||||||
|
server.Wait()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user