From fb9a1670b227b3a867a546ed444aea30aa8361c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= <hugo@lysator.liu.se> Date: Mon, 2 Nov 2020 19:04:14 +0100 Subject: [PATCH] Add classlists! --- main.go | 112 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/main.go b/main.go index 1ad7e83..5301e75 100644 --- a/main.go +++ b/main.go @@ -22,7 +22,7 @@ var password string var classes map[float64]Puppetclass var hosts = map[string]Host{} -var topLevels = []string{ "hosts" } +var classesForHost = map[string][]string{} // const apiurl := "http://localhost:8000/hosts.json" const apiurl = "https://chapman.lysator.liu.se/api/" @@ -96,6 +96,44 @@ func main() { } +func getClassList (host ResultRecord) ([]string) { + var record Puppetclass + + if val, ok := classes[host.Id]; ok { + record = val + } else { + url := fmt.Sprintf(apiurl + "hosts/%d/puppetclasses", int(host.Id)); + request, err := http.NewRequest("GET",url, nil) + if err != nil { + log.Fatal(err); + } + request.SetBasicAuth("hugo", password); + + resp, err := client.Do(request) + if err != nil { + log.Fatal(err); + } + defer resp.Body.Close() + + decoder := json.NewDecoder(resp.Body); + var m PuppetclassMessage + err = decoder.Decode(&m) + if err != nil { + log.Fatal(err); + } + + classes[host.Id] = m.Results + record = m.Results + } + + str := []string{} + for _, r := range record.Profiles { + str = append(str, r.Name) + } + return str +} + + type ResultRecord struct { Ip string // "130.236.254.139", Ip6 string // "2001:6b0:17:f0a0::8b", @@ -242,6 +280,14 @@ type DirHostList struct { } type DirHost struct { hostname string } type DirHostClasses struct { hostname string } +type LinkPuppetClass struct { classname string } + + +func (LinkPuppetClass) Attr(ctx context.Context, a *fuse.Attr) error { + a.Inode = 0 + a.Mode = os.ModeSymlink | 0o444 + return nil +} func (DirRoot) Attr(ctx context.Context, a *fuse.Attr) error { a.Inode = 0 @@ -289,8 +335,16 @@ func (DirHostList) Lookup(ctx context.Context, name string) (fs.Node, error) { return DirHost{ name }, nil } -func (DirHostClasses) Lookup(ctx context.Context, name string) (fs.Node, error) { - return nil, nil +func (d DirHostClasses) Lookup(ctx context.Context, name string) (fs.Node, error) { + classes := getClassList(hosts[d.hostname].Data) + + for _, class := range classes { + if name == class { + return LinkPuppetClass{ class }, nil + } + } + + return nil, syscall.ENOENT } func (d DirHost) Lookup(ctx context.Context, name string) (fs.Node, error) { @@ -326,6 +380,16 @@ func (DirHost)ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { }, nil } +func (d DirHostClasses)ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { + classes := getClassList(hosts[d.hostname].Data) + + var out []fuse.Dirent + for _, class := range classes { + out = append(out, fuse.Dirent{ Inode: 0, Name: class, Type: fuse.DT_Link }) + } + return out, nil +} + func (f DataFile) Attr(ctx context.Context, a *fuse.Attr) error { a.Inode = 0 @@ -375,47 +439,7 @@ type PuppetclassMessage struct { } -func (f DataFile) ReadAll(ctx context.Context) ([]byte, error) { - - /* - var record Puppetclass - - if val, ok := classes[f.record.Id]; ok { - record = val - } else { - url := fmt.Sprintf("https://chapman.lysator.liu.se/api/hosts/%d/puppetclasses", int(f.record.Id)); - request, err := http.NewRequest("GET",url, nil) - if err != nil { - log.Fatal(err); - } - request.SetBasicAuth("hugo", password); - - resp, err := client.Do(request) - if err != nil { - log.Fatal(err); - } - defer resp.Body.Close() - - decoder := json.NewDecoder(resp.Body); - var m PuppetclassMessage - err = decoder.Decode(&m) - if err != nil { - log.Fatal(err); - } - - classes[f.record.Id] = m.Results - record = m.Results - } - - str := "" - for _, r := range record.Profiles { - str += r.Name + "\n" - } - */ +func (f DataFile) ReadAll(ctx context.Context) ([]byte, error) { return []byte(fmt.Sprintf("%+v\n", hosts[f.hostname])), nil - - //return []byte(fmt.Sprintf("%+v\n", f.record)), nil - // return []byte(str), nil - // return []byte(greeting), nil } -- GitLab