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