filed
Job queue using FUSE
git clone git://mccd.space/filed
| Log | Files | Refs | README | LICENSE |
config.go (2529B)
1 package main
2
3 import (
4 "context"
5 "encoding/json"
6 "git.sr.ht/~marcc/filed/store"
7 "log/slog"
8 "os"
9 "syscall"
10
11 "bazil.org/fuse"
12 )
13
14 var ConfigName = "config.json"
15
16 type ConfigFile struct {
17 manager *JobManager
18 inode uint64
19 }
20
21 func (f ConfigFile) Attr(ctx context.Context, a *fuse.Attr) error {
22 fileMeta, err := f.manager.store.GetFileMeta(f.inode)
23 if err != nil {
24 slog.Error("Could not retrieve file metadata", "error", err)
25 return syscall.EIO
26 } else if fileMeta != nil {
27 a.Mode = os.FileMode(fileMeta.Mode)
28 a.Gid = fileMeta.GID
29 a.Uid = fileMeta.UID
30 } else {
31 a.Mode = 0o440
32 a.Gid = uint32(os.Getgid())
33 a.Uid = uint32(os.Getuid())
34 }
35
36 config := f.manager.store.GetConfig()
37 a.Inode = f.inode
38 confJson, err := json.Marshal(config)
39 if err != nil {
40 slog.Error("FUSE: Could not marshal conf", "error", err)
41 return nil
42 }
43
44 a.Size = uint64(len(confJson))
45 return nil
46 }
47 func (f *ConfigFile) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
48 slog.Warn("FUSE: Changing access permissions")
49 defaultMode, err := f.manager.store.GetFileMeta(f.inode)
50 if err != nil {
51 return err
52 }
53 if defaultMode == nil {
54 defaultMode = &store.FileMeta{
55 Inode: f.inode,
56 Mode: uint32(0o640),
57 UID: uint32(os.Getgid()),
58 GID: uint32(os.Getuid()),
59 }
60
61 }
62 config := f.manager.store.GetConfig()
63 confJson, err := json.Marshal(config)
64 if err != nil {
65 slog.Error("FUSE: Could not marshal conf", "error", err)
66 return nil
67 }
68
69 resp.Attr.Size = uint64(len(confJson))
70
71 return Setattr(f.manager.store, defaultMode, ctx, req, resp)
72 }
73
74 func (f *ConfigFile) ReadAll(ctx context.Context) (jsonConf []byte, err error) {
75 slog.Debug("FUSE: Read file content")
76 config := f.manager.store.GetConfig()
77 jsonConf, err = json.Marshal(config)
78 if err != nil {
79 slog.Error("FUSE: Could not marshal conf", "error", err)
80 return nil, nil
81 }
82 return jsonConf, nil
83 }
84
85 func (f *ConfigFile) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
86 var newContent store.Config
87 if err := json.Unmarshal(req.Data, &newContent); err != nil {
88 return syscall.EINVAL
89 }
90 slog.Info("FUSE: Updating config", "config", newContent)
91 if newContent.MaxJobCount > 50 {
92 slog.Warn("A max job count higher than 50 is not recommended. There might be degredations.")
93 }
94
95 err := f.manager.store.UpdateConfig(newContent)
96 if err != nil {
97 slog.Error("FUSE: Could not update config", "config", newContent)
98 return syscall.EIO
99 }
100 resp.Size = len(req.Data)
101 return nil
102 }