filed

Job queue using FUSE

git clone git://mccd.space/filed

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 }